Now LoopStrengthReduce is a LoopPass.
authorDevang Patel <dpatel@apple.com>
Tue, 6 Mar 2007 21:14:09 +0000 (21:14 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 6 Mar 2007 21:14:09 +0000 (21:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34984 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Scalar.h
lib/CodeGen/LLVMTargetMachine.cpp
lib/Transforms/Scalar/LoopStrengthReduce.cpp

index 8c6e6ccb31ae100c699073a459a998fa29553742..0ce0f3faac370f593bb676052d9aeba33605a0bc 100644 (file)
@@ -20,6 +20,7 @@
 namespace llvm {
 
 class FunctionPass;
+class LoopPass;
 class Pass;
 class GetElementPtrInst;
 class PassInfo;
@@ -120,7 +121,7 @@ FunctionPass *createLICMPass();
 // optional parameter used to consult the target machine whether certain
 // transformations are profitable.
 //
-FunctionPass *createLoopStrengthReducePass(const TargetLowering *TLI = NULL);
+LoopPass *createLoopStrengthReducePass(const TargetLowering *TLI = NULL);
 
 //===----------------------------------------------------------------------===//
 //
index d4f3645d7569d11bd4a89b7c19951e3e611c85de..d7b27bd84d2cf0b0772992384e52bfdda224e8b5 100644 (file)
@@ -14,6 +14,7 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/PassManager.h"
 #include "llvm/Pass.h"
+#include "llvm/Analysis/LoopPass.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Transforms/Scalar.h"
index 329da542d50aa9c0815a63a49e56bda9d70c9d0d..fcbf9e301cfee558d32bb7a67afafd4d23f3fc01 100644 (file)
@@ -23,6 +23,7 @@
 #include "llvm/DerivedTypes.h"
 #include "llvm/Analysis/Dominators.h"
 #include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Analysis/LoopPass.h"
 #include "llvm/Analysis/ScalarEvolutionExpander.h"
 #include "llvm/Support/CFG.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
@@ -104,7 +105,7 @@ namespace {
     }
   };
 
-  class VISIBILITY_HIDDEN LoopStrengthReduce : public FunctionPass {
+  class VISIBILITY_HIDDEN LoopStrengthReduce : public LoopPass {
     LoopInfo *LI;
     ETForest *EF;
     ScalarEvolution *SE;
@@ -143,19 +144,7 @@ namespace {
       : TLI(tli) {
     }
 
-    virtual bool runOnFunction(Function &) {
-      LI = &getAnalysis<LoopInfo>();
-      EF = &getAnalysis<ETForest>();
-      SE = &getAnalysis<ScalarEvolution>();
-      TD = &getAnalysis<TargetData>();
-      UIntPtrTy = TD->getIntPtrType();
-      Changed = false;
-
-      for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
-        runOnLoop(*I);
-      
-      return Changed;
-    }
+    bool runOnLoop(Loop *L, LPPassManager &LPM);
 
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       // We split critical edges, so we change the CFG.  However, we do update
@@ -179,7 +168,6 @@ namespace {
     ///
     Value *getCastedVersionOf(Instruction::CastOps opcode, Value *V);
 private:
-    void runOnLoop(Loop *L);
     bool AddUsersIfInteresting(Instruction *I, Loop *L,
                                std::set<Instruction*> &Processed);
     SCEVHandle GetExpressionSCEV(Instruction *E, Loop *L);
@@ -196,7 +184,7 @@ private:
   RegisterPass<LoopStrengthReduce> X("loop-reduce", "Loop Strength Reduction");
 }
 
-FunctionPass *llvm::createLoopStrengthReducePass(const TargetLowering *TLI) {
+LoopPass *llvm::createLoopStrengthReducePass(const TargetLowering *TLI) {
   return new LoopStrengthReduce(TLI);
 }
 
@@ -1271,12 +1259,15 @@ namespace {
   };
 }
 
-void LoopStrengthReduce::runOnLoop(Loop *L) {
-  // First step, transform all loops nesting inside of this loop.
-  for (LoopInfo::iterator I = L->begin(), E = L->end(); I != E; ++I)
-    runOnLoop(*I);
+bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager &LPM) {
 
-  // Next, find all uses of induction variables in this loop, and catagorize
+  LI = &getAnalysis<LoopInfo>();
+  EF = &getAnalysis<ETForest>();
+  SE = &getAnalysis<ScalarEvolution>();
+  TD = &getAnalysis<TargetData>();
+  UIntPtrTy = TD->getIntPtrType();
+
+  // Find all uses of induction variables in this loop, and catagorize
   // them by stride.  Start by finding all of the PHI nodes in the header for
   // this loop.  If they are induction variables, inspect their uses.
   std::set<Instruction*> Processed;   // Don't reprocess instructions.
@@ -1284,7 +1275,7 @@ void LoopStrengthReduce::runOnLoop(Loop *L) {
     AddUsersIfInteresting(I, L, Processed);
 
   // If we have nothing to do, return.
-  if (IVUsesByStride.empty()) return;
+  if (IVUsesByStride.empty()) return false;
 
   // Optimize induction variables.  Some indvar uses can be transformed to use
   // strides that will be needed for other purposes.  A common example of this
@@ -1368,5 +1359,5 @@ void LoopStrengthReduce::runOnLoop(Loop *L) {
   CastedPointers.clear();
   IVUsesByStride.clear();
   StrideOrder.clear();
-  return;
+  return false;
 }