summaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/BreakCriticalEdges.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-09-24 00:08:39 +0000
committerChris Lattner <sabre@nondot.org>2002-09-24 00:08:39 +0000
commitd76efa018660e806cd87c0a24512e3c532fc1d36 (patch)
tree68a1396a73a3736d3d5c565e266be0ff7d2239f9 /lib/Transforms/Utils/BreakCriticalEdges.cpp
parent119e9ea33be3b1c5af4a8af7fd12817281fdd478 (diff)
downloadllvm-d76efa018660e806cd87c0a24512e3c532fc1d36.tar.gz
llvm-d76efa018660e806cd87c0a24512e3c532fc1d36.tar.bz2
llvm-d76efa018660e806cd87c0a24512e3c532fc1d36.tar.xz
Add new BreakCriticalEdges pass
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3903 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/BreakCriticalEdges.cpp')
-rw-r--r--lib/Transforms/Utils/BreakCriticalEdges.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/BreakCriticalEdges.cpp b/lib/Transforms/Utils/BreakCriticalEdges.cpp
new file mode 100644
index 0000000000..2222a04e1d
--- /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;
+}