The loop rotation pass does modify the function, which I'm guessing means that a FunctionPassManager can be used to run LoopPasses (this is not obvious to me after looking through the FunctionPassManager code). Unfortunately none of the other passes I'm using (ScalarEvolution, LCSSA, IndVarSimplify, and LoopUnroll) appear to have an effect. I verified that the function can be loop unrolled by opt, so I'm currently using opt to narrow down which passes are required to get this result. Once I figure that out I'll see if I can get a FunctionPassManager to run those passes over just the function. I am open to other suggestions though :) Skye On Tue, Jan 14, 2014 at 10:22 PM, Owen Anderson <resistor at mac.com> wrote:> Hi Skye, > > If I remember correctly, our loop unrolling pass requires loop rotation in > order to be very effective. Can you try adding that before you run the > unroller to see if it helps? > > --Owen > > On Jan 14, 2014, at 09:32 PM, Skye Wanderman-Milne <skye at cloudera.com> > wrote: > > Hi all, > > I'm attempting to perform loop unrolling on a single function using the > C++ API. Maybe I missed something in the docs, but I cannot figure out a > way to do this. The function I'm working with is very simple, containing a > single for loop and not much else. I compiled the function to IR using > clang with no optimizations enabled. > > My initial plan was to first run the IndVarSimplify pass (as suggested > here <http://llvm.org/docs/Passes.html#loop-unroll-unroll-loops>) and > then the LoopUnroll pass on the function. I tried using a > FunctionPassManager to do this, even though the docs state FPMs are used > with FunctionPasses and not LoopPasses, which didn't complain but had no > effect on the function. Is adding LoopPasses to a FPM supposed to be a > no-op? Is this supposed to work and I'm not running the right combination > of passes to get loop unrolling? > > I also tried creating a LoopInfo object over my function with a FPM so I > could call UnrollLoop() manually, but the LoopInfo didn't return any loops, > perhaps because I'm missing some preliminary passes. > > The last option I considered was copying the function into it's own > module, using a PassManager, and then copying the function back into the > original module. I didn't try this option as creating a valid stand-alone > module with the single function will potentially be difficult. > > Does anyone have a suggestion for how to do this? > > Thanks, > Skye > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140115/894c1336/attachment.html>
Hi Skye, I don't know exactly which pass / combination of passes do it, but I went through something similar with some success. What I did was copy the body of lib/Transforms/IPO/PassManagerBuilder.cpp::populateModulePassManager() which is what I believe sets up the "standard" passes for opt. That function adds the passes to a module passmanager, but it looks like almost all of the passes it adds are FunctionPass's, and I was able to add all those passes to my FunctionPassManager. I wasn't focusing on loop unrolling but I just checked and this setup does unroll loops; if you want to find the minimal set maybe you could do something similar and then whittle down? My understanding (I don't know the pass manager infrastructure too well) is that the "larger" pass managers automatically create sub-managers, ie the module passmanager will create a function passmanager to run on all the functions, and I assume that the function passmanager will create a loop passmanager to run on the loops. But again, I haven't traced through it that much so someone else might have to correct me. Kevin On Wed, Jan 15, 2014 at 2:18 PM, Skye Wanderman-Milne <skye at cloudera.com>wrote:> The loop rotation pass does modify the function, which I'm guessing means > that a FunctionPassManager can be used to run LoopPasses (this is not > obvious to me after looking through the FunctionPassManager code). > Unfortunately none of the other passes I'm using (ScalarEvolution, LCSSA, > IndVarSimplify, and LoopUnroll) appear to have an effect. > > I verified that the function can be loop unrolled by opt, so I'm currently > using opt to narrow down which passes are required to get this result. Once > I figure that out I'll see if I can get a FunctionPassManager to run those > passes over just the function. I am open to other suggestions though :) > > Skye > > > On Tue, Jan 14, 2014 at 10:22 PM, Owen Anderson <resistor at mac.com> wrote: > >> Hi Skye, >> >> If I remember correctly, our loop unrolling pass requires loop rotation >> in order to be very effective. Can you try adding that before you run the >> unroller to see if it helps? >> >> --Owen >> >> On Jan 14, 2014, at 09:32 PM, Skye Wanderman-Milne <skye at cloudera.com> >> wrote: >> >> Hi all, >> >> I'm attempting to perform loop unrolling on a single function using the >> C++ API. Maybe I missed something in the docs, but I cannot figure out a >> way to do this. The function I'm working with is very simple, containing a >> single for loop and not much else. I compiled the function to IR using >> clang with no optimizations enabled. >> >> My initial plan was to first run the IndVarSimplify pass (as suggested >> here <http://llvm.org/docs/Passes.html#loop-unroll-unroll-loops>) and >> then the LoopUnroll pass on the function. I tried using a >> FunctionPassManager to do this, even though the docs state FPMs are used >> with FunctionPasses and not LoopPasses, which didn't complain but had no >> effect on the function. Is adding LoopPasses to a FPM supposed to be a >> no-op? Is this supposed to work and I'm not running the right combination >> of passes to get loop unrolling? >> >> I also tried creating a LoopInfo object over my function with a FPM so I >> could call UnrollLoop() manually, but the LoopInfo didn't return any loops, >> perhaps because I'm missing some preliminary passes. >> >> The last option I considered was copying the function into it's own >> module, using a PassManager, and then copying the function back into the >> original module. I didn't try this option as creating a valid stand-alone >> module with the single function will potentially be difficult. >> >> Does anyone have a suggestion for how to do this? >> >> Thanks, >> Skye >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140115/f33f485b/attachment.html>
Thanks for the advice! Kevin, I think you're right about the PassManagers -- I was able to get loop unrolling working using a FunctionPassManager. For future reference, the minimal passes that worked for me were ScalarReplAggregates, LoopRotate, and LoopUnroll. On Wed, Jan 15, 2014 at 2:49 PM, Kevin Modzelewski <kmod at dropbox.com> wrote:> Hi Skye, I don't know exactly which pass / combination of passes do it, > but I went through something similar with some success. What I did was > copy the body of > lib/Transforms/IPO/PassManagerBuilder.cpp::populateModulePassManager() > which is what I believe sets up the "standard" passes for opt. That > function adds the passes to a module passmanager, but it looks like almost > all of the passes it adds are FunctionPass's, and I was able to add all > those passes to my FunctionPassManager. I wasn't focusing on loop > unrolling but I just checked and this setup does unroll loops; if you want > to find the minimal set maybe you could do something similar and then > whittle down? > > My understanding (I don't know the pass manager infrastructure too well) > is that the "larger" pass managers automatically create sub-managers, ie > the module passmanager will create a function passmanager to run on all the > functions, and I assume that the function passmanager will create a loop > passmanager to run on the loops. But again, I haven't traced through it > that much so someone else might have to correct me. > > Kevin > > > On Wed, Jan 15, 2014 at 2:18 PM, Skye Wanderman-Milne <skye at cloudera.com>wrote: > >> The loop rotation pass does modify the function, which I'm guessing means >> that a FunctionPassManager can be used to run LoopPasses (this is not >> obvious to me after looking through the FunctionPassManager code). >> Unfortunately none of the other passes I'm using (ScalarEvolution, LCSSA, >> IndVarSimplify, and LoopUnroll) appear to have an effect. >> >> I verified that the function can be loop unrolled by opt, so I'm >> currently using opt to narrow down which passes are required to get this >> result. Once I figure that out I'll see if I can get a FunctionPassManager >> to run those passes over just the function. I am open to other suggestions >> though :) >> >> Skye >> >> >> On Tue, Jan 14, 2014 at 10:22 PM, Owen Anderson <resistor at mac.com> wrote: >> >>> Hi Skye, >>> >>> If I remember correctly, our loop unrolling pass requires loop rotation >>> in order to be very effective. Can you try adding that before you run the >>> unroller to see if it helps? >>> >>> --Owen >>> >>> On Jan 14, 2014, at 09:32 PM, Skye Wanderman-Milne <skye at cloudera.com> >>> wrote: >>> >>> Hi all, >>> >>> I'm attempting to perform loop unrolling on a single function using the >>> C++ API. Maybe I missed something in the docs, but I cannot figure out a >>> way to do this. The function I'm working with is very simple, containing a >>> single for loop and not much else. I compiled the function to IR using >>> clang with no optimizations enabled. >>> >>> My initial plan was to first run the IndVarSimplify pass (as suggested >>> here <http://llvm.org/docs/Passes.html#loop-unroll-unroll-loops>) and >>> then the LoopUnroll pass on the function. I tried using a >>> FunctionPassManager to do this, even though the docs state FPMs are used >>> with FunctionPasses and not LoopPasses, which didn't complain but had no >>> effect on the function. Is adding LoopPasses to a FPM supposed to be a >>> no-op? Is this supposed to work and I'm not running the right combination >>> of passes to get loop unrolling? >>> >>> I also tried creating a LoopInfo object over my function with a FPM so I >>> could call UnrollLoop() manually, but the LoopInfo didn't return any loops, >>> perhaps because I'm missing some preliminary passes. >>> >>> The last option I considered was copying the function into it's own >>> module, using a PassManager, and then copying the function back into the >>> original module. I didn't try this option as creating a valid stand-alone >>> module with the single function will potentially be difficult. >>> >>> Does anyone have a suggestion for how to do this? >>> >>> Thanks, >>> Skye >>> _______________________________________________ >>> LLVM Developers mailing list >>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>> >>> >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140116/b3be2cd7/attachment.html>