aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Utils
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-10-12 21:43:28 +0000
committerChris Lattner <sabre@nondot.org>2003-10-12 21:43:28 +0000
commitee2c50cca57272b92cf9e0d1fb238d14d57ea1dd (patch)
tree6178998e6dc5f97abaae73bafd5c1ee347ad9fa3 /lib/Transforms/Utils
parent915403f065243e7985dc8e2253b71f0242bc54d3 (diff)
downloadexternal_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.cpp37
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??");