[LLVMdev] Loop unrolling a function
skye at cloudera.com
Tue Jan 21 15:08:00 PST 2014
One more quick followup: for more complicated loops, I've found
IndVarSimplify is also required before LoopUnroll will work (along with
ScalarReplAggregates and LoopRotate).
On Thu, Jan 16, 2014 at 11:15 AM, Skye Wanderman-Milne <skye at cloudera.com>wrote:
> 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
>> 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.
>> 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 :)
>>> 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?
>>>> On Jan 14, 2014, at 09:32 PM, Skye Wanderman-Milne <skye at cloudera.com>
>>>> 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?
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev