From aeef8c70f07d14f811baf5838a2d4b2f04ee95c1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 10 Nov 2003 04:42:13 +0000 Subject: [PATCH] Include forms of SplitCriticalEdge which work correctly with pred/succ iterators git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9856 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm/Transforms/Utils/BasicBlockUtils.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/include/llvm/Transforms/Utils/BasicBlockUtils.h b/include/llvm/Transforms/Utils/BasicBlockUtils.h index 78e5592f44b..4630d5399af 100644 --- a/include/llvm/Transforms/Utils/BasicBlockUtils.h +++ b/include/llvm/Transforms/Utils/BasicBlockUtils.h @@ -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