[llvm-dev] loop invariant code hoisting

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Tue Dec 8 15:36:51 PST 2020


On 12/7/20 7:52 AM, Florian Hahn via llvm-dev wrote:
> Hi,
>
>> On Dec 7, 2020, at 13:25, Sjoerd Meijer via llvm-dev 
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> Hello,
>>
>> I would like to restrict LICM in the number of memory operations it 
>> hoists out of a loop. Blindly hoisting out all instructions out could 
>> result in a lot of spilling/reloading, which is what I'd like to 
>> avoid. We see this for example on (inner)loops with small constant 
>> bounds that are unrolled. I am drafting something 
>> inhttps://reviews.llvm.org/D92488, which contains a reduced version 
>> of my motivating example.
>> It was brought to my attention that LICM might not have any 
>> restrictions by design because hoisting out all instructions could be 
>> some sort of canonical form that other passes depend on, so sinking 
>> back defs closer to their user(s) might be a back-end problem. I was 
>> wondering if there are any opinions on this.
>>
>
> I think one key benefit of hoisting as much as possible is that it 
> enables/simplifies subsequent optimizations in the middle-end 
> (especially for memory operations). Limiting hoisting is likely to 
> have a bad knock-on effect on other transformations.
>
> Accurately estimating the number of spills in LICM is probably going 
> to be tricky and/or brittle. Another thing to consider is that there 
> are plenty of other transformations that extend live-ranges of values, 
> so they would also need to also need updating.
>
> Sinking in the backend would catch those cases naturally, while making 
> our lives easier in the middle-end. We already have plenty of 
> infrastructure to reason about register pressure & co in CodeGen. As 
> Bardia mentioned, currently there is limited support for 
> re-materialzing instructions.
>
> Besides that, I don’t think there are dedicated passes to move defs to 
> uses to reduce register pressure, beside the MachineScheduler. But the 
> MachineScheduler currently only operates on sub-regions of basic blocks.
>
> I think there would be potential for having a dedicated pass to move 
> defs across basic blocks to reduce register pressure. I think we have 
> most building blocks (RegisterPressureTracker, MachineTraceMetrics for 
> selecting a likely trace through the function). But reasoning about 
> moving memory operations is probably going to be more difficult in the 
> backend than in the middle-end though unfortunately.

I'd explored the notion of doing a register pressure aware global code 
motion a while back.  There's a bunch of hard cases, but there's also a 
bunch of obvious profitable stuff too.  I think this is entirely 
realistic if someone wanted to devote to time.

I doubt this would solve the triggering case for this thread though.  
Despite the framing as being about LICM, the transform actually involved 
was store promotion.  I suspect the issue is that we simply haven't 
considered undoing store promotion in MachineLICM.  (I haven't looked, 
so this may be a false statement.)

Philip

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201208/131e386c/attachment-0001.html>


More information about the llvm-dev mailing list