add option to isCriticalEdge
authorChris Lattner <sabre@nondot.org>
Sat, 28 Oct 2006 06:58:17 +0000 (06:58 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 28 Oct 2006 06:58:17 +0000 (06:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31258 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Utils/BasicBlockUtils.h
lib/Transforms/Utils/BreakCriticalEdges.cpp

index 0bfb6f750aa97f1adf050454c7f8cfca2e8d8b07..25f3839dc7af77ee1176de9d40c37dde1e630ed7 100644 (file)
@@ -57,7 +57,8 @@ void RemoveSuccessor(TerminatorInst *TI, unsigned SuccNum);
 /// Critical edges are edges from a block with multiple successors to a block
 /// with multiple predecessors.
 ///
-bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum);
+bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum,
+                    bool AllowIdenticalEdges = false);
 
 /// SplitCriticalEdge - If this edge is a critical edge, insert a new node to
 /// split the critical edge.  This will update DominatorSet, ImmediateDominator,
index 5bb513fc3bd3fed14d08959bf90afceb8838fafd..58f0347bf9f2341aa6e3349cab35caa5c61aa07f 100644 (file)
@@ -84,7 +84,8 @@ bool BreakCriticalEdges::runOnFunction(Function &F) {
 // Critical edges are edges from a block with multiple successors to a block
 // with multiple predecessors.
 //
-bool llvm::isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum) {
+bool llvm::isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum,
+                          bool AllowIdenticalEdges) {
   assert(SuccNum < TI->getNumSuccessors() && "Illegal edge specification!");
   if (TI->getNumSuccessors() == 1) return false;
 
@@ -93,8 +94,16 @@ bool llvm::isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum) {
 
   // If there is more than one predecessor, this is a critical edge...
   assert(I != E && "No preds, but we have an edge to the block?");
+  const BasicBlock *FirstPred = *I;
   ++I;        // Skip one edge due to the incoming arc from TI.
-  return I != E;
+  if (!AllowIdenticalEdges)
+    return I != E;
+  
+  // If AllowIdenticalEdges is true, then we allow this edge to be considered
+  // non-critical iff all preds come from TI's block.
+  for (; I != E; ++I)
+    if (*I != FirstPred) return true;
+  return false;
 }
 
 // SplitCriticalEdge - If this edge is a critical edge, insert a new node to
@@ -106,7 +115,7 @@ bool llvm::isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum) {
 //
 bool llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P,
                              bool MergeIdenticalEdges) {
-  if (!isCriticalEdge(TI, SuccNum)) return false;
+  if (!isCriticalEdge(TI, SuccNum, MergeIdenticalEdges)) return false;
   BasicBlock *TIBB = TI->getParent();
   BasicBlock *DestBB = TI->getSuccessor(SuccNum);