diff options
author | Chris Lattner <sabre@nondot.org> | 2002-09-24 00:08:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-09-24 00:08:39 +0000 |
commit | d76efa018660e806cd87c0a24512e3c532fc1d36 (patch) | |
tree | 68a1396a73a3736d3d5c565e266be0ff7d2239f9 | |
parent | 119e9ea33be3b1c5af4a8af7fd12817281fdd478 (diff) | |
download | external_llvm-d76efa018660e806cd87c0a24512e3c532fc1d36.zip external_llvm-d76efa018660e806cd87c0a24512e3c532fc1d36.tar.gz external_llvm-d76efa018660e806cd87c0a24512e3c532fc1d36.tar.bz2 |
Add new BreakCriticalEdges pass
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3903 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/BreakCriticalEdges.cpp | 52 | ||||
-rw-r--r-- | lib/Transforms/Utils/BreakCriticalEdges.cpp | 52 |
2 files changed, 104 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/BreakCriticalEdges.cpp b/lib/Transforms/Scalar/BreakCriticalEdges.cpp new file mode 100644 index 0000000..2222a04 --- /dev/null +++ b/lib/Transforms/Scalar/BreakCriticalEdges.cpp @@ -0,0 +1,52 @@ +//===- BreakCriticalEdges.cpp - Critical Edge Elimination Pass ------------===// +// +// BreakCriticalEdges pass - Break all of the critical edges in the CFG by +// inserting a dummy basic block. This pass may be "required" by passes that +// cannot deal with critical edges. For this usage, the structure type is +// forward declared. This pass obviously invalidates the CFG, but can update +// forward dominator (set, immediate dominators, and tree) information. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/Local.h" +#include "llvm/Analysis/Dominators.h" +#include "llvm/Function.h" +#include "llvm/InstrTypes.h" +#include "Support/StatisticReporter.h" + +static Statistic<> NumBroken("break-crit-edges\t- Number of blocks inserted"); + +class BreakCriticalEdges : public FunctionPass { +public: + virtual bool runOnFunction(Function &F); + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addPreserved<DominatorSet>(); + AU.addPreserved<ImmediateDominators>(); + AU.addPreserved<DominatorTree>(); + } +}; + +static RegisterOpt<BreakCriticalEdges> X("break-crit-edges", + "Break critical edges in CFG"); + +Pass *createBreakCriticalEdgesPass() { return new BreakCriticalEdges(); } + +// runOnFunction - Loop over all of the edges in the CFG, breaking critical +// edges as they are found. +// +bool BreakCriticalEdges::runOnFunction(Function &F) { + bool Changed = false; + for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) { + TerminatorInst *TI = I->getTerminator(); + for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) + if (isCriticalEdge(TI, i)) { + SplitCriticalEdge(TI, i, this); + ++NumBroken; + Changed = true; + } + } + + return Changed; +} diff --git a/lib/Transforms/Utils/BreakCriticalEdges.cpp b/lib/Transforms/Utils/BreakCriticalEdges.cpp new file mode 100644 index 0000000..2222a04 --- /dev/null +++ b/lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -0,0 +1,52 @@ +//===- BreakCriticalEdges.cpp - Critical Edge Elimination Pass ------------===// +// +// BreakCriticalEdges pass - Break all of the critical edges in the CFG by +// inserting a dummy basic block. This pass may be "required" by passes that +// cannot deal with critical edges. For this usage, the structure type is +// forward declared. This pass obviously invalidates the CFG, but can update +// forward dominator (set, immediate dominators, and tree) information. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/Local.h" +#include "llvm/Analysis/Dominators.h" +#include "llvm/Function.h" +#include "llvm/InstrTypes.h" +#include "Support/StatisticReporter.h" + +static Statistic<> NumBroken("break-crit-edges\t- Number of blocks inserted"); + +class BreakCriticalEdges : public FunctionPass { +public: + virtual bool runOnFunction(Function &F); + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addPreserved<DominatorSet>(); + AU.addPreserved<ImmediateDominators>(); + AU.addPreserved<DominatorTree>(); + } +}; + +static RegisterOpt<BreakCriticalEdges> X("break-crit-edges", + "Break critical edges in CFG"); + +Pass *createBreakCriticalEdgesPass() { return new BreakCriticalEdges(); } + +// runOnFunction - Loop over all of the edges in the CFG, breaking critical +// edges as they are found. +// +bool BreakCriticalEdges::runOnFunction(Function &F) { + bool Changed = false; + for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) { + TerminatorInst *TI = I->getTerminator(); + for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) + if (isCriticalEdge(TI, i)) { + SplitCriticalEdge(TI, i, this); + ++NumBroken; + Changed = true; + } + } + + return Changed; +} |