Eliminating copies between overlapping register classes

Hi,

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?

Thanks,
Tom

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

/jakob

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

Thanks,
Tom

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

/jakob