diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-09-22 21:39:34 +0000 | 
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-09-22 21:39:34 +0000 | 
| commit | e92e5ee81fe87c036fa41f85a31d4ded35732834 (patch) | |
| tree | 5d54a2b38accac483d2b7a5849ece2898b225660 /llvm/lib | |
| parent | 0f36544c08a75430752acd23b357ed4f7d3febdf (diff) | |
| download | bcm5719-llvm-e92e5ee81fe87c036fa41f85a31d4ded35732834.tar.gz bcm5719-llvm-e92e5ee81fe87c036fa41f85a31d4ded35732834.zip | |
Constrain register classes instead of emitting copies.
Sometimes register class constraints are trivial, like GR32->GR32_NOSP,
or GPR->rGPR.  Teach InstrEmitter to simply constrain the virtual
register instead of emitting a copy in these cases.
Normally, these copies are handled by the coalescer.  This saves some
coalescer work.
llvm-svn: 140340
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp | 8 | 
1 files changed, 5 insertions, 3 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp index 000a7dfcd66..b0239e13b2e 100644 --- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -280,15 +280,17 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,      MCID.OpInfo[IIOpNum].isOptionalDef();    // If the instruction requires a register in a different class, create -  // a new virtual register and copy the value into it. +  // a new virtual register and copy the value into it, but first attempt to +  // shrink VReg's register class within reason.  For example, if VReg == GR32 +  // and II requires a GR32_NOSP, just constrain VReg to GR32_NOSP. +  const unsigned MinRCSize = 4;    if (II) { -    const TargetRegisterClass *SrcRC = MRI->getRegClass(VReg);      const TargetRegisterClass *DstRC = 0;      if (IIOpNum < II->getNumOperands())        DstRC = TII->getRegClass(*II, IIOpNum, TRI);      assert((DstRC || (MCID.isVariadic() && IIOpNum >= MCID.getNumOperands())) &&             "Don't have operand info for this instruction!"); -    if (DstRC && !SrcRC->hasSuperClassEq(DstRC)) { +    if (DstRC && !MRI->constrainRegClass(VReg, DstRC, MinRCSize)) {        unsigned NewVReg = MRI->createVirtualRegister(DstRC);        BuildMI(*MBB, InsertPos, Op.getNode()->getDebugLoc(),                TII->get(TargetOpcode::COPY), NewVReg).addReg(VReg); | 

