Eliminating copies between overlapping register classes


I have two register classes A and B, where A contains a subset of the
registers in B:

A = [R0, R1, R2, ... R128]

B = [RO, R1, R2, ... R128,
     T0, T1, T2, ... T128]

I am using the Greedy Register Allocator, and I would expect the register
allocator to eliminate this copy:

%vreg0<def> = COPY %vreg1; B:%vreg0 A:%vreg1

but instead I end up with

%R0<def> = COPY %R1

Is there any way I can get the register allocator to eliminate these
kinds of copies?


Such copies should be eliminated as aggressively as normal copies. Perhaps the debug output from RegisterCoalescer can tell you why they aren't.


Thanks for the debugging type, I caught my mistake. Class A wasn't
actually a subset of B. The definitions were actually like this:

A = [R0, R1, R2, ... R128, CC]

B = [RO, R1, R2, ... R128,
     T0, T1, T2, ... T128


If you upgrade to trunk, TableGen will automatically synthesize a register class representing the intersection.