Fix bug: test/Regression/Other/2002-03-11-ConstPropCrash.ll
authorChris Lattner <sabre@nondot.org>
Mon, 11 Mar 2002 22:11:07 +0000 (22:11 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 11 Mar 2002 22:11:07 +0000 (22:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1858 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Scalar/ConstantProp.h
lib/Transforms/Scalar/ConstantProp.cpp
lib/Transforms/Scalar/SCCP.cpp

index 3a8fa5b6d9a151a3350fd3badc73eaad4cd44216..0da13e9fdbd9ee52481b98807232b1e51807543b 100644 (file)
@@ -23,9 +23,11 @@ bool doConstantPropogation(BasicBlock *BB, BasicBlock::iterator &I);
 
 // ConstantFoldTerminator - If a terminator instruction is predicated on a
 // constant value, convert it into an unconditional branch to the constant
-// destination.
+// destination.  This is a nontrivial operation because the successors of this
+// basic block must have their PHI nodes updated.
 //
-bool ConstantFoldTerminator(TerminatorInst *T);
+bool ConstantFoldTerminator(BasicBlock *BB, BasicBlock::iterator &I,
+                            TerminatorInst *T);
 
 
 //===----------------------------------------------------------------------===//
index fc4e3bf0e3eaa61c97da373823847458ab9875bb..624e6da39da276ec8b39af85962e7511d4a13b9f 100644 (file)
@@ -102,7 +102,8 @@ ConstantFoldBinaryInst(BasicBlock *BB, BasicBlock::iterator &II,
 // constant value, convert it into an unconditional branch to the constant
 // destination.
 //
-bool ConstantFoldTerminator(TerminatorInst *T) {
+bool ConstantFoldTerminator(BasicBlock *BB, BasicBlock::iterator &II,
+                            TerminatorInst *T) {
   // Branch - See if we are conditional jumping on constant
   if (BranchInst *BI = dyn_cast<BranchInst>(T)) {
     if (BI->isUnconditional()) return false;  // Can't optimize uncond branch
@@ -127,6 +128,7 @@ bool ConstantFoldTerminator(TerminatorInst *T) {
       // Set the unconditional destination, and change the insn to be an
       // unconditional branch.
       BI->setUnconditionalDest(Destination);
+      II = BB->end()-1;  // Update instruction iterator!
       return true;
     }
 #if 0
@@ -171,7 +173,7 @@ bool doConstantPropogation(BasicBlock *BB, BasicBlock::iterator &II) {
     Constant *D = dyn_cast<Constant>(UInst->getOperand(0));
     if (D) return ConstantFoldUnaryInst(BB, II, UInst, D);
   } else if (TerminatorInst *TInst = dyn_cast<TerminatorInst>(Inst)) {
-    return ConstantFoldTerminator(TInst);
+    return ConstantFoldTerminator(BB, II, TInst);
 
   } else if (PHINode *PN = dyn_cast<PHINode>(Inst)) {
     // If it's a PHI node and only has one operand
index 447a3e196000e311f7d91600a17dbb6bb60c46b3..2bf6c86e95acb5c976e99feb0ffb7942bab4819f 100644 (file)
@@ -270,7 +270,7 @@ bool SCCP::doSCCP() {
         // Hey, we just changed something!
         MadeChanges = true;
       } else if (TerminatorInst *TI = dyn_cast<TerminatorInst>(Inst)) {
-        MadeChanges |= ConstantFoldTerminator(TI);
+        MadeChanges |= ConstantFoldTerminator(BB, BI, TI);
       }
 
       ++BI;