[LLVMdev] Eliminating copies between overlapping register classes

Tom Stellard thomas.stellard at amd.com
Thu Feb 23 09:50:45 PST 2012


On Wed, Feb 22, 2012 at 07:00:55PM -0800, Jakob Stoklund Olesen wrote:
> 
> On Feb 22, 2012, at 12:01 PM, Tom Stellard wrote:
> 
> > 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?
> 
> 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




More information about the llvm-dev mailing list