[LLVMdev] How should I update LiveIntervals after removing a use of a register?

Andrew Trick atrick at apple.com
Mon Apr 7 09:21:06 PDT 2014


On Apr 7, 2014, at 7:01 AM, Tom Stellard <tom at stellard.net> wrote:

> On Sat, Apr 05, 2014 at 12:36:19AM -0700, Andrew Trick wrote:
>> 
>> On Apr 3, 2014, at 6:29 PM, Tom Stellard <tom at stellard.net> wrote:
>> 
>>> Hi,
>>> 
>>> I am working on a simple copy propagation pass for the R600 backend that
>>> propagates immediates rather than registers.  For example, I want to
>>> transform:
>>> 
>>> ...
>>> %vreg1 = V_MOV_B32 1
>>> %vreg2 = V_ADD_I32 %vreg1, %vreg0
>>> ...
>>> 
>>> into:
>>> 
>>> %vreg1 = V_MOV_B32 1 ; <- Only delete this if it is dead
>>> %vreg2 = V_ADD_I32 1, %vreg0
>>> 
>>> For best results, I am trying to run this pass after the
>>> TwoAddressInstruction pass, which means I need to preserve
>>> the LiveIntervals analysis.
>>> 
>>> My question is: How do I update the LiveIntervals to reflect the fact
>>> that V_ADD_I32 no longer uses %vreg0?
>> 
>> Hi Tom,
>> 
>> Hopefully you figured this out ;) IIRC, the safe thing to do is call removeInterval and createAndComputeVirtRegInterval for both vreg0 and vreg1.
>> 
> 
> I found a slightly different solution, which was to
> call LiveIntervals::shrinkToUses(vreg1).  This also gives me a list of
> dead instructions, which is nice.  Are there an disadvantages to doing
> it this way?

No, that is the best thing to do. Looking at your example again I see that you’re only propagating a constant through a copy, so you’ve only eliminated a use of vreg1 (ignore my previous comment about vreg0). That’s exactly what shrinkToUses is meant for.

-Andy
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140407/85a6acd0/attachment.html>


More information about the llvm-dev mailing list