fix PR6743, a case where we'd delete an instruction before using it
authorChris Lattner <sabre@nondot.org>
Sat, 10 Apr 2010 18:26:57 +0000 (18:26 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 10 Apr 2010 18:26:57 +0000 (18:26 +0000)
in some cases.

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

lib/Transforms/Scalar/JumpThreading.cpp
test/Transforms/JumpThreading/crash.ll

index a6489ecc2dcf0349a3bba998920f055c767ee098..df05b712dcbf76a8a1d90594518c3e03f804b299 100644 (file)
@@ -670,8 +670,10 @@ bool JumpThreading::ProcessBranchOnDuplicateCond(BasicBlock *PredBB,
     Value *OldCond = DestBI->getCondition();
     DestBI->setCondition(ConstantInt::get(Type::getInt1Ty(BB->getContext()),
                                           BranchDir));
-    ConstantFoldTerminator(BB);
+    // Delete dead instructions before we fold the branch.  Folding the branch
+    // can eliminate edges from the CFG which can end up deleting OldCond.
     RecursivelyDeleteTriviallyDeadInstructions(OldCond);
+    ConstantFoldTerminator(BB);
     return true;
   }
  
index c65fd1014be4dddac31b2299e68b6d814eba4fe7..21620bef9ccce9cc3c5fa929c05d31a338308331 100644 (file)
@@ -324,3 +324,20 @@ A:                                             ; preds = %entry
   call void undef(i64 ptrtoint (i8* blockaddress(@test11, %A) to i64)) nounwind
   unreachable
 }
+
+; PR6743
+define void @test12() nounwind ssp {
+entry:
+  br label %lbl_51
+
+lbl_51:                                           ; preds = %if.then, %entry
+  %tmp3 = phi i1 [ false, %if.then ], [ undef, %entry ] ; <i1> [#uses=2]
+  br i1 %tmp3, label %if.end12, label %if.then
+
+if.then:                                          ; preds = %lbl_51
+  br i1 %tmp3, label %lbl_51, label %if.end12
+
+if.end12:                                         ; preds = %if.then, %lbl_51
+  ret void
+}
+