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

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?

Thanks,
Tom

Hi Tom,

Hopefully you figured this out :wink: IIRC, the safe thing to do is call removeInterval and createAndComputeVirtRegInterval for both vreg0 and vreg1.

-Andy

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?

Thanks,
Tom

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