Fix for sanitizer crash introduced in r209049
authorLouis Gerbarg <lgg@apple.com>
Sat, 17 May 2014 06:51:36 +0000 (06:51 +0000)
committerLouis Gerbarg <lgg@apple.com>
Sat, 17 May 2014 06:51:36 +0000 (06:51 +0000)
This patch fixes 3 issues introduced by r209049 that only showed up in on
the sanitizer buildbots. One was a typo in a compare. The other is a check to
confirm that the single differing value in the two incoming GEPs is the same
type. The final issue was the the IRBuilder under some circumstances would
build PHIs in the middle of the block.

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

lib/Transforms/InstCombine/InstructionCombining.cpp

index 35b4889a836290d77b4cb05bfdef8c8e907fb406..b65c4ee8e59ed08e6e7409ec340805c79c56ca30 100644 (file)
@@ -1230,10 +1230,13 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
 
     for (auto I = PN->op_begin()+1, E = PN->op_end(); I !=E; ++I) {
       GetElementPtrInst *Op2 = dyn_cast<GetElementPtrInst>(*I);
-      if (!Op2 || Op1->getNumOperands() != Op1->getNumOperands())
+      if (!Op2 || Op1->getNumOperands() != Op2->getNumOperands())
         return nullptr;
 
       for (unsigned J = 0, F = Op1->getNumOperands(); J != F; ++J) {
+        if (Op1->getOperand(J)->getType() != Op2->getOperand(J)->getType())
+          return nullptr;
+
         if (Op1->getOperand(J) != Op2->getOperand(J)) {
           if (DI == -1) {
             // We have not seen any differences yet in the GEPs feeding the
@@ -1263,8 +1266,12 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
       // All the GEPs feeding the PHI differ at a single offset. Clone a GEP
       // into the current block so it can be merged, and create a new PHI to
       // set that index.
+      Instruction *InsertPt = Builder->GetInsertPoint();
+      Builder->SetInsertPoint(PN);
       PHINode *NewPN = Builder->CreatePHI(Op1->getOperand(DI)->getType(),
                                           PN->getNumOperands());
+      Builder->SetInsertPoint(InsertPt);
+
       for (auto &I : PN->operands())
         NewPN->addIncoming(dyn_cast<GEPOperator>(I)->getOperand(DI),
                            PN->getIncomingBlock(I));