[SwitchLowering] Handle destinations on multiple phi instructions
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 2 Dec 2014 18:31:53 +0000 (18:31 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 2 Dec 2014 18:31:53 +0000 (18:31 +0000)
Follow up from r222926. Also handle multiple destinations from merged
cases on multiple and subsequent phi instructions.

rdar://problem/19106978

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

lib/Transforms/Utils/LowerSwitch.cpp
test/Transforms/Util/lowerswitch.ll

index e25956299c651ad40697b6aa9034811bbb67c0ff..35cd917330ab21e4322ba7a432d8e978e09bf952 100644 (file)
@@ -149,6 +149,7 @@ static void fixPhis(BasicBlock *SuccBB, BasicBlock *OrigBB, BasicBlock *NewBB,
 
     // Only update the first occurence.
     unsigned Idx = 0, E = PN->getNumIncomingValues();
+    unsigned LocalNumMergedCases = NumMergedCases;
     for (; Idx != E; ++Idx) {
       if (PN->getIncomingBlock(Idx) == OrigBB) {
         PN->setIncomingBlock(Idx, NewBB);
@@ -158,10 +159,10 @@ static void fixPhis(BasicBlock *SuccBB, BasicBlock *OrigBB, BasicBlock *NewBB,
 
     // Remove additional occurences coming from condensed cases and keep the
     // number of incoming values equal to the number of branches to SuccBB.
-    for (++Idx; NumMergedCases > 0 && Idx != E; ++Idx)
+    for (++Idx; LocalNumMergedCases > 0 && Idx < E; ++Idx)
       if (PN->getIncomingBlock(Idx) == OrigBB) {
         PN->removeIncomingValue(Idx);
-        NumMergedCases--;
+        LocalNumMergedCases--;
       }
   }
 }
index adbfbda90167bc674aab2590eba35b7ab4915d9e..17c12028705f5271b28270914bfaf78ba6f6efd2 100644 (file)
@@ -45,6 +45,8 @@ bb3:
 ; CHECK-LABEL: bb3
 ; CHECK: %tmp = phi i32 [ 1, %NodeBlock ], [ 0, %bb2 ], [ 1, %LeafBlock3 ]
   %tmp = phi i32 [ 1, %bb1 ], [ 0, %bb2 ], [ 1, %bb1 ], [ 1, %bb1 ]
+; CHECK-NEXT: %tmp2 = phi i32 [ 2, %NodeBlock ], [ 5, %bb2 ], [ 2, %LeafBlock3 ]
+  %tmp2 = phi i32 [ 2, %bb1 ], [ 2, %bb1 ], [ 5, %bb2 ], [ 2, %bb1 ]
   br label %exit
 
 exit: