From: Chris Lattner Date: Mon, 25 Apr 2005 20:17:30 +0000 (+0000) Subject: implement getelementptr.ll:test10 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a70b66d49efc0dee658aa03eb843dddfd43f09ca;p=oota-llvm.git implement getelementptr.ll:test10 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21541 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index ad60a75f326..83d390d4aea 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -2277,8 +2277,26 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, Constant::getNullValue(Offset->getType())); } } else if (User *GEPRHS = dyn_castGetElementPtr(RHS)) { - if (PtrBase != GEPRHS->getOperand(0)) + // If the base pointers are different, but the indices are the same, just + // compare the base pointer. + if (PtrBase != GEPRHS->getOperand(0)) { + bool IndicesTheSame = GEPLHS->getNumOperands()==GEPRHS->getNumOperands(); + if (IndicesTheSame) + for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i) + if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) { + IndicesTheSame = false; + break; + } + + // If all indices are the same, just compare the base pointers. + if (IndicesTheSame) + return new SetCondInst(Cond, GEPLHS->getOperand(0), + GEPRHS->getOperand(0)); + + // Otherwise, the base pointers are different and the indices are + // different, bail out. return 0; + } // If one of the GEPs has all zero indices, recurse. bool AllZeros = true;