From 7ca04097ad285f8ead7bf242f5ebb7ff3e7ae0a9 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 22 Feb 2004 17:35:42 +0000 Subject: [PATCH] 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 --- lib/Target/X86/InstSelectSimple.cpp | 18 ++++++++++++------ lib/Target/X86/X86ISelSimple.cpp | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index 4aced20f954..b8873284c07 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(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(Src)) + Src = CPR->getValue(); + std::vector 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(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(GEPTypes.back())) { // It's a struct access. CUI is the index into the structure, // which names the field. This index must have unsigned type. diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index 4aced20f954..b8873284c07 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.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(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(Src)) + Src = CPR->getValue(); + std::vector 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(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(GEPTypes.back())) { // It's a struct access. CUI is the index into the structure, // which names the field. This index must have unsigned type.