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


I am working on a simple copy propagation pass for the R600 backend that
propagates immediates rather than registers. For example, I want to

%vreg1 = V_MOV_B32 1
%vreg2 = V_ADD_I32 %vreg1, %vreg0


%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 :wink: 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.