Include forms of SplitCriticalEdge which work correctly with pred/succ iterators
authorChris Lattner <sabre@nondot.org>
Mon, 10 Nov 2003 04:42:13 +0000 (04:42 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 10 Nov 2003 04:42:13 +0000 (04:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9856 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Utils/BasicBlockUtils.h

index 78e5592f44b4823e9823c563e602e517c52a01af..4630d5399af7fbb9d594bc89e159e68694457f61 100644 (file)
@@ -18,6 +18,7 @@
 // FIXME: Move to this file: BasicBlock::removePredecessor, BB::splitBasicBlock
 
 #include "llvm/BasicBlock.h"
+#include "llvm/Support/CFG.h"
 class Instruction;
 class Pass;
 
@@ -64,4 +65,22 @@ bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum);
 ///
 bool SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P = 0);
 
+inline bool SplitCriticalEdge(BasicBlock *BB, succ_iterator SI, Pass *P = 0) {
+  return SplitCriticalEdge(BB->getTerminator(), SI.getSuccessorIndex(), P);
+}
+
+/// SplitCriticalEdge - If the edge from *PI to BB is not critical, return
+/// false.  Otherwise, split all edges between the two blocks and return true.
+/// This updates all of the same analyses as the other SplitCriticalEdge
+/// function.
+inline bool SplitCriticalEdge(BasicBlock *Succ, pred_iterator PI, Pass *P = 0) {
+  BasicBlock *Pred = *PI;
+  bool MadeChange = false;
+  for (succ_iterator SI = succ_begin(Pred), E = succ_end(Pred); SI != E; ++SI)
+    if (*SI == Succ)
+      MadeChange |= SplitCriticalEdge(Pred, SI, P);
+  return MadeChange;
+}
+
+
 #endif