diff options
author | Devang Patel <dpatel@apple.com> | 2007-03-07 06:39:01 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-03-07 06:39:01 +0000 |
commit | 2ac57e1f026a8aca0d374ff0624a97dd249220a8 (patch) | |
tree | 69864df12e35791e24e0dc0f3f9f6e61b8781295 /llvm/lib/Transforms | |
parent | 97905b4027887810b1fc620350f4e2cac56814e6 (diff) | |
download | bcm5719-llvm-2ac57e1f026a8aca0d374ff0624a97dd249220a8.tar.gz bcm5719-llvm-2ac57e1f026a8aca0d374ff0624a97dd249220a8.zip |
Now IndVarSimplify is a LoopPass.
llvm-svn: 35003
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index c75627e3152..aad6cc9a5e8 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -45,6 +45,7 @@ #include "llvm/Type.h" #include "llvm/Analysis/ScalarEvolutionExpander.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Analysis/LoopPass.h" #include "llvm/Support/CFG.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" @@ -62,33 +63,26 @@ STATISTIC(NumReplaced, "Number of exit values replaced"); STATISTIC(NumLFTR , "Number of loop exit tests replaced"); namespace { - class VISIBILITY_HIDDEN IndVarSimplify : public FunctionPass { + class VISIBILITY_HIDDEN IndVarSimplify : public LoopPass { LoopInfo *LI; ScalarEvolution *SE; bool Changed; public: - virtual bool runOnFunction(Function &) { - LI = &getAnalysis<LoopInfo>(); - SE = &getAnalysis<ScalarEvolution>(); - Changed = false; - - // Induction Variables live in the header nodes of loops - for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I) - runOnLoop(*I); - return Changed; - } + + bool runOnLoop(Loop *L, LPPassManager &LPM); + bool doInitialization(Loop *L, LPPassManager &LPM); + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequiredID(LCSSAID); + AU.addRequiredID(LoopSimplifyID); + AU.addRequired<ScalarEvolution>(); + AU.addRequired<LoopInfo>(); + AU.addPreservedID(LoopSimplifyID); + AU.addPreservedID(LCSSAID); + AU.setPreservesCFG(); + } - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequiredID(LCSSAID); - AU.addRequiredID(LoopSimplifyID); - AU.addRequired<ScalarEvolution>(); - AU.addRequired<LoopInfo>(); - AU.addPreservedID(LoopSimplifyID); - AU.addPreservedID(LCSSAID); - AU.setPreservesCFG(); - } private: - void runOnLoop(Loop *L); + void EliminatePointerRecurrence(PHINode *PN, BasicBlock *Preheader, std::set<Instruction*> &DeadInsts); Instruction *LinearFunctionTestReplace(Loop *L, SCEV *IterationCount, @@ -100,7 +94,7 @@ namespace { RegisterPass<IndVarSimplify> X("indvars", "Canonicalize Induction Variables"); } -FunctionPass *llvm::createIndVarSimplifyPass() { +LoopPass *llvm::createIndVarSimplifyPass() { return new IndVarSimplify(); } @@ -410,14 +404,16 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) { DeleteTriviallyDeadInstructions(InstructionsToDelete); } +bool IndVarSimplify::doInitialization(Loop *L, LPPassManager &LPM) { -void IndVarSimplify::runOnLoop(Loop *L) { + Changed = false; // First step. Check to see if there are any trivial GEP pointer recurrences. // If there are, change them into integer recurrences, permitting analysis by // the SCEV routines. // BasicBlock *Header = L->getHeader(); BasicBlock *Preheader = L->getLoopPreheader(); + SE = &LPM.getAnalysis<ScalarEvolution>(); std::set<Instruction*> DeadInsts; for (BasicBlock::iterator I = Header->begin(); isa<PHINode>(I); ++I) { @@ -429,11 +425,19 @@ void IndVarSimplify::runOnLoop(Loop *L) { if (!DeadInsts.empty()) DeleteTriviallyDeadInstructions(DeadInsts); + return Changed; +} + +bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) { + - // Next, transform all loops nesting inside of this loop. - for (LoopInfo::iterator I = L->begin(), E = L->end(); I != E; ++I) - runOnLoop(*I); + LI = &getAnalysis<LoopInfo>(); + SE = &getAnalysis<ScalarEvolution>(); + Changed = false; + BasicBlock *Header = L->getHeader(); + std::set<Instruction*> DeadInsts; + // Verify the input to the pass in already in LCSSA form. assert(L->isLCSSAForm()); @@ -483,7 +487,7 @@ void IndVarSimplify::runOnLoop(Loop *L) { DeleteTriviallyDeadInstructions(InstructionsToDelete); } } - return; + return Changed; } // Compute the type of the largest recurrence expression. @@ -585,4 +589,5 @@ void IndVarSimplify::runOnLoop(Loop *L) { DeleteTriviallyDeadInstructions(DeadInsts); assert(L->isLCSSAForm()); + return Changed; } |