Fix Bug: LowerSwitch/2003-05-01-PHIProblem.ll
authorChris Lattner <sabre@nondot.org>
Thu, 1 May 2003 22:21:21 +0000 (22:21 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 1 May 2003 22:21:21 +0000 (22:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5979 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/LowerSwitch.cpp

index a30a016c45b9feb22b63a29f763235fb6bc49e93..f71c08c3cfde4cee2b7fcd43294ac1bc3330656c 100644 (file)
@@ -84,7 +84,7 @@ void LowerSwitch::processSwitchInst(SwitchInst *SI) {
     Instruction *Br = new BranchInst(Succ, NextBlock, Comp);
     CurBlock->getInstList().push_back(Br);
 
-    // If there were any PHI nodes in this success, rewrite one entry from
+    // If there were any PHI nodes in this successor, rewrite one entry from
     // OrigBlock to come from CurBlock.
     for (BasicBlock::iterator I = Succ->begin();
          PHINode *PN = dyn_cast<PHINode>(I); ++I) {
@@ -93,10 +93,20 @@ void LowerSwitch::processSwitchInst(SwitchInst *SI) {
       PN->setIncomingBlock((unsigned)BlockIdx, CurBlock);
     }
 
+    if (i == e-2) {  // Is this looking at the default destination?
+      // If there is an entry in any PHI nodes for the default edge, make sure
+      // to update them as well.
+      for (BasicBlock::iterator I = NextBlock->begin();
+           PHINode *PN = dyn_cast<PHINode>(I); ++I) {
+        int BlockIdx = PN->getBasicBlockIndex(OrigBlock);
+        assert(BlockIdx != -1 && "Switch didn't go to this successor??");
+        PN->setIncomingBlock((unsigned)BlockIdx, CurBlock);
+      }
+    }
+
     CurBlock = NextBlock;  // Move on to the next condition
   }
 
-
   // We are now done with the switch instruction, delete it.
   delete SI;
 }