Instcombine this away:
authorChris Lattner <sabre@nondot.org>
Mon, 4 Nov 2002 16:43:32 +0000 (16:43 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 4 Nov 2002 16:43:32 +0000 (16:43 +0000)
        %A = getelementptr [4 x int]* %M, long 0, long 0
        %B = getelementptr int* %A, long 2

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4536 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index df3a611ba27c0a9f3f828fca89c04d950ee9696a..e540310f6b3022492228e347de4f9b42c1e1b726 100644 (file)
@@ -681,11 +681,17 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
                    *cast<Constant>(GEP.getOperand(1));
       assert(Indices[0] != 0 && "Constant folding of uint's failed!?");
 
-    } else if (*GEP.idx_begin() == ConstantUInt::getNullValue(Type::LongTy) &&
+    } else if (*GEP.idx_begin() == Constant::getNullValue(Type::LongTy) &&
                Src->getNumOperands() != 1) { 
       // Otherwise we can do the fold if the first index of the GEP is a zero
       Indices.insert(Indices.end(), Src->idx_begin(), Src->idx_end());
       Indices.insert(Indices.end(), GEP.idx_begin()+1, GEP.idx_end());
+    } else if (Src->getOperand(Src->getNumOperands()-1) == 
+               Constant::getNullValue(Type::LongTy)) {
+      // If the src gep ends with a constant array index, merge this get into
+      // it, even if we have a non-zero array index.
+      Indices.insert(Indices.end(), Src->idx_begin(), Src->idx_end()-1);
+      Indices.insert(Indices.end(), GEP.idx_begin(), GEP.idx_end());
     }
 
     if (!Indices.empty())