diff options
author | Chris Lattner <sabre@nondot.org> | 2003-10-12 21:43:28 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-10-12 21:43:28 +0000 |
commit | ee2c50cca57272b92cf9e0d1fb238d14d57ea1dd (patch) | |
tree | 6178998e6dc5f97abaae73bafd5c1ee347ad9fa3 /lib/Transforms/Utils | |
parent | 915403f065243e7985dc8e2253b71f0242bc54d3 (diff) | |
download | external_llvm-ee2c50cca57272b92cf9e0d1fb238d14d57ea1dd.zip external_llvm-ee2c50cca57272b92cf9e0d1fb238d14d57ea1dd.tar.gz external_llvm-ee2c50cca57272b92cf9e0d1fb238d14d57ea1dd.tar.bz2 |
First step in renaming the preheaders pass to loopsimplify
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9058 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils')
-rw-r--r-- | lib/Transforms/Utils/LoopSimplify.cpp | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/lib/Transforms/Utils/LoopSimplify.cpp b/lib/Transforms/Utils/LoopSimplify.cpp index fb57a23..b30b71c 100644 --- a/lib/Transforms/Utils/LoopSimplify.cpp +++ b/lib/Transforms/Utils/LoopSimplify.cpp @@ -1,7 +1,8 @@ -//===- LoopPreheaders.cpp - Loop Preheader Insertion Pass -----------------===// +//===- LoopPreheaders.cpp - Loop Canonicalization Pass --------------------===// // -// Insert Loop pre-headers and exit blocks into the CFG for each function in the -// module. This pass updates loop information and dominator information. +// This pass performs several transformations to transform natural loops into a +// simpler form, which makes subsequent analyses and transformations simpler and +// more effective. // // Loop pre-header insertion guarantees that there is a single, non-critical // entry edge from outside of the loop to the loop header. This simplifies a @@ -13,8 +14,11 @@ // as store-sinking that are built into LICM. // // Note that the simplifycfg pass will clean up blocks which are split out but -// end up being unnecessary, so usage of this pass does not necessarily -// pessimize generated code. +// end up being unnecessary, so usage of this pass should not pessimize +// generated code. +// +// This pass obviously modifies the CFG, but updates loop information and +// dominator information. // //===----------------------------------------------------------------------===// @@ -31,9 +35,10 @@ #include "Support/DepthFirstIterator.h" namespace { - Statistic<> NumInserted("preheaders", "Number of pre-header nodes inserted"); + Statistic<> + NumInserted("loopsimplify", "Number of pre-header blocks inserted"); - struct Preheaders : public FunctionPass { + struct LoopSimplify : public FunctionPass { virtual bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { @@ -56,19 +61,19 @@ namespace { void InsertPreheaderForLoop(Loop *L); }; - RegisterOpt<Preheaders> X("preheaders", "Natural loop pre-header insertion", - true); + RegisterOpt<LoopSimplify> + X("loopsimplify", "Canonicalize natural loops", true); } // Publically exposed interface to pass... const PassInfo *LoopPreheadersID = X.getPassInfo(); -Pass *createLoopPreheaderInsertionPass() { return new Preheaders(); } +Pass *createLoopPreheaderInsertionPass() { return new LoopSimplify(); } /// runOnFunction - Run down all loops in the CFG (recursively, but we could do /// it in any convenient order) inserting preheaders... /// -bool Preheaders::runOnFunction(Function &F) { +bool LoopSimplify::runOnFunction(Function &F) { bool Changed = false; LoopInfo &LI = getAnalysis<LoopInfo>(); @@ -82,7 +87,7 @@ bool Preheaders::runOnFunction(Function &F) { /// ProcessLoop - Walk the loop structure in depth first order, ensuring that /// all loops have preheaders. /// -bool Preheaders::ProcessLoop(Loop *L) { +bool LoopSimplify::ProcessLoop(Loop *L) { bool Changed = false; // Does the loop already have a preheader? If so, don't modify the loop... @@ -117,8 +122,8 @@ bool Preheaders::ProcessLoop(Loop *L) { /// block, leaving the remaining predecessors pointing to BB. This method /// updates the SSA PHINode's, but no other analyses. /// -BasicBlock *Preheaders::SplitBlockPredecessors(BasicBlock *BB, - const char *Suffix, +BasicBlock *LoopSimplify::SplitBlockPredecessors(BasicBlock *BB, + const char *Suffix, const std::vector<BasicBlock*> &Preds) { // Create new basic block, insert right before the original block... @@ -189,7 +194,7 @@ static void ChangeExitBlock(Loop *L, BasicBlock *OldExit, BasicBlock *NewExit) { /// preheader, this method is called to insert one. This method has two phases: /// preheader insertion and analysis updating. /// -void Preheaders::InsertPreheaderForLoop(Loop *L) { +void LoopSimplify::InsertPreheaderForLoop(Loop *L) { BasicBlock *Header = L->getHeader(); // Compute the set of predecessors of the loop that are not in the loop. @@ -303,7 +308,7 @@ void Preheaders::InsertPreheaderForLoop(Loop *L) { } } -void Preheaders::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) { +void LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) { DominatorSet &DS = getAnalysis<DominatorSet>(); assert(!DS.dominates(L->getHeader(), Exit) && "Loop already dominates exit block??"); |