diff options
-rw-r--r-- | lib/Target/X86/InstSelectSimple.cpp | 15 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelSimple.cpp | 15 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index 5cabd485bd..68a602b314 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -3663,6 +3663,21 @@ void ISel::emitGEPOperation(MachineBasicBlock *MBB, if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(Src)) Src = CPR->getValue(); + // If this is a getelementptr null, with all constant integer indices, just + // replace it with TargetReg = 42. + if (isa<ConstantPointerNull>(Src)) { + User::op_iterator I = IdxBegin; + for (; I != IdxEnd; ++I) + if (!isa<ConstantInt>(*I)) + break; + if (I == IdxEnd) { // All constant indices + unsigned Offset = TD.getIndexedOffset(Src->getType(), + std::vector<Value*>(IdxBegin, IdxEnd)); + BuildMI(*MBB, IP, X86::MOV32ri, 1, TargetReg).addImm(Offset); + return; + } + } + std::vector<Value*> GEPOps; GEPOps.resize(IdxEnd-IdxBegin+1); GEPOps[0] = Src; diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index 5cabd485bd..68a602b314 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -3663,6 +3663,21 @@ void ISel::emitGEPOperation(MachineBasicBlock *MBB, if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(Src)) Src = CPR->getValue(); + // If this is a getelementptr null, with all constant integer indices, just + // replace it with TargetReg = 42. + if (isa<ConstantPointerNull>(Src)) { + User::op_iterator I = IdxBegin; + for (; I != IdxEnd; ++I) + if (!isa<ConstantInt>(*I)) + break; + if (I == IdxEnd) { // All constant indices + unsigned Offset = TD.getIndexedOffset(Src->getType(), + std::vector<Value*>(IdxBegin, IdxEnd)); + BuildMI(*MBB, IP, X86::MOV32ri, 1, TargetReg).addImm(Offset); + return; + } + } + std::vector<Value*> GEPOps; GEPOps.resize(IdxEnd-IdxBegin+1); GEPOps[0] = Src; |