Anastasiya Ruzhanskaya via llvm-dev
2017-Jul-25 17:32 UTC
[llvm-dev] loop canonical variables
I call this function and it returns only "i" in my example. Are there any ways to return "j" also? 2017-07-25 19:11 GMT+02:00 Michael Kruse <llvmdev at meinersbur.de>:> There is Loop::getCanonicalInductionVariable() > > You may need to run the "-indvars" (IndVarSimplify) pass before it > returns a value. I am not sure it normalizes the step size to 1 in all > cases. > > Michael > > 2017-07-25 18:12 GMT+02:00 Anastasiya Ruzhanskaya via llvm-dev > <llvm-dev at lists.llvm.org>: > > Hello, > > I need to perform the analysis of loop induction variables. However, as I > > understood, directly it is possible to extract only a canonical induction > > variable which is only one. If I have multiple induction variables with > the > > step not one, are there any methods to extract their phi node? > > > > int a[10]; > > int b[10]; > > for (int i = 0, j = 1; i < 10, j < 10; i++, j+=2) { > > a[i] = i+1; > > b[j] = j+1; > > } > > printf("%d",(b[1] + a[1])); > > return (b[1] + a[1]); > > > > this is a brief example, I want to track i and j (smth is not > initialized in > > this code, but it doesn't matter) > > > > _______________________________________________ > > LLVM Developers mailing list > > llvm-dev at lists.llvm.org > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170725/bc99ef42/attachment.html>
2017-07-25 19:32 GMT+02:00 Anastasiya Ruzhanskaya <anastasiya.ruzhanskaya at frtk.ru>:> I call this function and it returns only "i" in my example. Are there any > ways to return "j" also?That would contradict it being the /canonical/ induction variable, wouldn't it? If you look into the imlplementation of getCanonicalInductionVariable(), it just walks the IR instructions and checks some conditions. You can have your own implementation that, instead of returning the first matching PHI, return all matching PHIs. SimplifyIndVar won't try to canonicalize, though. Michael
Hi Anastasiya, If it fits you use case, you can consider walking the loop header and calling getSCEV() on all of the PHI nodes in the header. This will give you a SCEV* which should be easier to analyze than manually inspecting PHI cycles. Thanks! -- Sanjoy On Tue, Jul 25, 2017 at 11:42 AM, Michael Kruse via llvm-dev <llvm-dev at lists.llvm.org> wrote:> 2017-07-25 19:32 GMT+02:00 Anastasiya Ruzhanskaya > <anastasiya.ruzhanskaya at frtk.ru>: >> I call this function and it returns only "i" in my example. Are there any >> ways to return "j" also? > > That would contradict it being the /canonical/ induction variable, wouldn't it? > > If you look into the imlplementation of > getCanonicalInductionVariable(), it just walks the IR instructions and > checks some conditions. You can have your own implementation that, > instead of returning the first matching PHI, return all matching PHIs. > SimplifyIndVar won't try to canonicalize, though. > > Michael > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev