From d2995df5b7b94a42899dab266a7e83b316fa818f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 15 Jul 2004 00:58:53 +0000 Subject: [PATCH] Improve codegen for the LLVM offsetof/sizeof "operator". Before we compiled this LLVM function: int %foo() { ret int cast (int** getelementptr (int** null, int 1) to int) } into: foo: mov %EAX, 0 lea %EAX, DWORD PTR [%EAX + 4] ret now we compile it into: foo: mov %EAX, 4 ret This sequence is frequently generated by the MSIL front-end, and soon the malloc lowering pass and Java front-ends as well.. -Chris git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14834 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/InstSelectSimple.cpp | 15 +++++++++++++++ lib/Target/X86/X86ISelSimple.cpp | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index 5cabd485bd0..68a602b3143 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(Src)) Src = CPR->getValue(); + // If this is a getelementptr null, with all constant integer indices, just + // replace it with TargetReg = 42. + if (isa(Src)) { + User::op_iterator I = IdxBegin; + for (; I != IdxEnd; ++I) + if (!isa(*I)) + break; + if (I == IdxEnd) { // All constant indices + unsigned Offset = TD.getIndexedOffset(Src->getType(), + std::vector(IdxBegin, IdxEnd)); + BuildMI(*MBB, IP, X86::MOV32ri, 1, TargetReg).addImm(Offset); + return; + } + } + std::vector GEPOps; GEPOps.resize(IdxEnd-IdxBegin+1); GEPOps[0] = Src; diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index 5cabd485bd0..68a602b3143 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(Src)) Src = CPR->getValue(); + // If this is a getelementptr null, with all constant integer indices, just + // replace it with TargetReg = 42. + if (isa(Src)) { + User::op_iterator I = IdxBegin; + for (; I != IdxEnd; ++I) + if (!isa(*I)) + break; + if (I == IdxEnd) { // All constant indices + unsigned Offset = TD.getIndexedOffset(Src->getType(), + std::vector(IdxBegin, IdxEnd)); + BuildMI(*MBB, IP, X86::MOV32ri, 1, TargetReg).addImm(Offset); + return; + } + } + std::vector GEPOps; GEPOps.resize(IdxEnd-IdxBegin+1); GEPOps[0] = Src;