diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-22 17:35:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-22 17:35:42 +0000 |
commit | 7ca04097ad285f8ead7bf242f5ebb7ff3e7ae0a9 (patch) | |
tree | c0c86aa766085459e90c2d4256bb3b6f4759b92b /lib/Target/X86/InstSelectSimple.cpp | |
parent | 827832c705fb5dae4929fc139c3ff828a61d3331 (diff) |
Reduce the number of pointless copies inserted due to constant pointer refs.
Also, make an assertion actually fireable!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11713 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/InstSelectSimple.cpp')
-rw-r--r-- | lib/Target/X86/InstSelectSimple.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index 4aced20f95..b8873284c0 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -461,8 +461,7 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, // Copy zero (null pointer) to the register. BMI(MBB, IP, X86::MOVri32, 1, R).addZImm(0); } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)) { - unsigned SrcReg = getReg(CPR->getValue(), MBB, IP); - BMI(MBB, IP, X86::MOVrr32, 1, R).addReg(SrcReg); + BMI(MBB, IP, X86::MOVri32, 1, R).addGlobalAddress(CPR->getValue()); } else { std::cerr << "Offending constant: " << C << "\n"; assert(0 && "Type not handled yet!"); @@ -2048,7 +2047,7 @@ void ISel::emitCastOperation(MachineBasicBlock *BB, break; } case Type::ULongTyID: - assert("FIXME: not implemented: cast ulong X to fp type!"); + assert(0 && "FIXME: not implemented: cast ulong X to fp type!"); default: // No promotion needed... break; } @@ -2212,6 +2211,9 @@ void ISel::emitGEPOperation(MachineBasicBlock *MBB, User::op_iterator IdxEnd, unsigned TargetReg) { const TargetData &TD = TM.getTargetData(); + if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(Src)) + Src = CPR->getValue(); + std::vector<Value*> GEPOps; GEPOps.resize(IdxEnd-IdxBegin+1); GEPOps[0] = Src; @@ -2229,9 +2231,13 @@ void ISel::emitGEPOperation(MachineBasicBlock *MBB, // The getGEPIndex operation didn't want to build an LEA. Check to see if // all operands are consumed but the base pointer. If so, just load it // into the register. - unsigned BaseReg = getReg(GEPOps[0], MBB, IP); - BMI(MBB, IP, X86::MOVrr32, 1, TargetReg).addReg(BaseReg); - return; // we are now done + if (GlobalValue *GV = dyn_cast<GlobalValue>(GEPOps[0])) { + BMI(MBB, IP, X86::MOVri32, 1, TargetReg).addGlobalAddress(GV); + } else { + unsigned BaseReg = getReg(GEPOps[0], MBB, IP); + BMI(MBB, IP, X86::MOVrr32, 1, TargetReg).addReg(BaseReg); + } + break; // we are now done } else if (const StructType *StTy = dyn_cast<StructType>(GEPTypes.back())) { // It's a struct access. CUI is the index into the structure, // which names the field. This index must have unsigned type. |