Finally, add the required constraint checks to fix Transforms/SimplifyCFG/2005-08...
authorChris Lattner <sabre@nondot.org>
Wed, 3 Aug 2005 00:59:12 +0000 (00:59 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 3 Aug 2005 00:59:12 +0000 (00:59 +0000)
the right way

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

lib/Transforms/Utils/SimplifyCFG.cpp

index 5f368bc786fd53ca1f43135eba144d99778b5bf5..742efe6184420fc3ec657fa4ca59d036ca7d800a 100644 (file)
@@ -98,8 +98,35 @@ static bool CanPropagatePredecessorsForPHIs(BasicBlock *BB, BasicBlock *Succ) {
         }
       }
   }
-
-  return true;
+    
+  // Finally, if BB has PHI nodes that are used by things other than the PHIs in
+  // Succ and Succ has predecessors that are not Succ and not Pred, we cannot
+  // fold these blocks, as we don't know whether BB dominates Succ or not to
+  // update the PHI nodes correctly.
+  if (!isa<PHINode>(BB->begin()) || Succ->getSinglePredecessor()) return true;
+
+  // If the predecessors of Succ are only BB and Succ itself, we can handle this.
+  bool IsSafe = true;
+  for (pred_iterator PI = pred_begin(Succ), E = pred_end(Succ); PI != E; ++PI)
+    if (*PI != Succ && *PI != BB) {
+      IsSafe = false;
+      break;
+    }
+  if (IsSafe) return true;
+  
+  // If the PHI nodes in BB are only used by instructions in Succ, we are ok.
+  IsSafe = true;
+  for (BasicBlock::iterator I = BB->begin(); isa<PHINode>(I) && IsSafe; ++I) {
+    PHINode *PN = cast<PHINode>(I);
+    for (Value::use_iterator UI = PN->use_begin(), E = PN->use_end(); UI != E;
+         ++UI)
+      if (cast<Instruction>(*UI)->getParent() != Succ) {
+        IsSafe = false;
+        break;
+      }
+  }
+  
+  return IsSafe;
 }
 
 /// TryToSimplifyUncondBranchFromEmptyBlock - BB contains an unconditional