X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTransforms%2FUtils%2FBreakCriticalEdges.cpp;h=0c4974db10ac4c325d94ceb981ace69ec4e5d53a;hb=cb2610ea037a17115ef3a01a6bdaab4e3cfdca27;hp=205ca2d46268aecaaaf59229e032f4ea0332bd62;hpb=eb0456c8fd60e6c2ef844d8696baa39d5d55f082;p=oota-llvm.git diff --git a/lib/Transforms/Utils/BreakCriticalEdges.cpp b/lib/Transforms/Utils/BreakCriticalEdges.cpp index 205ca2d4626..0c4974db10a 100644 --- a/lib/Transforms/Utils/BreakCriticalEdges.cpp +++ b/lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -14,10 +14,10 @@ #include "llvm/iTerminators.h" #include "llvm/iPHINode.h" #include "llvm/Support/CFG.h" -#include "Support/StatisticReporter.h" +#include "Support/Statistic.h" namespace { - Statistic<> NumBroken("break-crit-edges\t- Number of blocks inserted"); + Statistic<> NumBroken("break-crit-edges", "Number of blocks inserted"); struct BreakCriticalEdges : public FunctionPass { virtual bool runOnFunction(Function &F); @@ -26,6 +26,7 @@ namespace { AU.addPreserved(); AU.addPreserved(); AU.addPreserved(); + AU.addPreservedID(LoopPreheadersID); // No preheaders deleted. } }; @@ -42,9 +43,9 @@ Pass *createBreakCriticalEdgesPass() { return new BreakCriticalEdges(); } // Critical edges are edges from a block with multiple successors to a block // with multiple predecessors. // -static bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum) { +bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum) { assert(SuccNum < TI->getNumSuccessors() && "Illegal edge specification!"); - assert (TI->getNumSuccessors() > 1); + if (TI->getNumSuccessors() == 1) return false; const BasicBlock *Dest = TI->getSuccessor(SuccNum); pred_const_iterator I = pred_begin(Dest), E = pred_end(Dest); @@ -59,7 +60,7 @@ static bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum) { // will update DominatorSet, ImmediateDominator and DominatorTree information if // it is available, thus calling this pass will not invalidate either of them. // -static void SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P) { +void SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P) { assert(isCriticalEdge(TI, SuccNum) && "Cannot break a critical edge, if it isn't a critical edge"); BasicBlock *TIBB = TI->getParent(); @@ -87,36 +88,38 @@ static void SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P) { PN->replaceUsesOfWith(TIBB, NewBB); } - // Now if we have a pass object, update analysis information. Currently we - // update DominatorSet and DominatorTree information if it's available. - // - if (P) { - // Should we update DominatorSet information? - if (DominatorSet *DS = P->getAnalysisToUpdate()) { - // The blocks that dominate the new one are the blocks that dominate TIBB - // plus the new block itself. - DominatorSet::DomSetType DomSet = DS->getDominators(TIBB); - DomSet.insert(NewBB); // A block always dominates itself. - DS->addBasicBlock(NewBB, DomSet); - } + // If we don't have a pass object, we can't update anything... + if (P == 0) return; - // Should we update ImmdediateDominator information? - if (ImmediateDominators *ID = - P->getAnalysisToUpdate()) { - // TIBB is the new immediate dominator for NewBB. NewBB doesn't dominate - // anything. - ID->addNewBlock(NewBB, TIBB); - } + // Now update analysis information. These are the analyses that we are + // currently capable of updating... + // - // Should we update DominatorTree information? - if (DominatorTree *DT = P->getAnalysisToUpdate()) { - DominatorTree::Node *TINode = DT->getNode(TIBB); + // Should we update DominatorSet information? + if (DominatorSet *DS = P->getAnalysisToUpdate()) { + // The blocks that dominate the new one are the blocks that dominate TIBB + // plus the new block itself. + DominatorSet::DomSetType DomSet = DS->getDominators(TIBB); + DomSet.insert(NewBB); // A block always dominates itself. + DS->addBasicBlock(NewBB, DomSet); + } - // The new block is not the immediate dominator for any other nodes, but - // TINode is the immediate dominator for the new node. - // + // Should we update ImmdediateDominator information? + if (ImmediateDominators *ID = P->getAnalysisToUpdate()) { + // TIBB is the new immediate dominator for NewBB. NewBB doesn't dominate + // anything. + ID->addNewBlock(NewBB, TIBB); + } + + // Should we update DominatorTree information? + if (DominatorTree *DT = P->getAnalysisToUpdate()) { + DominatorTree::Node *TINode = DT->getNode(TIBB); + + // The new block is not the immediate dominator for any other nodes, but + // TINode is the immediate dominator for the new node. + // + if (TINode) // Don't break unreachable code! DT->createNewNode(NewBB, TINode); - } } }