From 54959d6cf68a9b575c98c074babe9867682a7271 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Wed, 7 Mar 2007 04:41:30 +0000 Subject: [PATCH] Now LICM is a LoopPass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35001 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/Scalar.h | 2 +- lib/Transforms/Scalar/LICM.cpp | 56 +++++++++++++++----------------- tools/llvm-ld/Optimize.cpp | 1 + tools/lto/lto.cpp | 1 + 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/include/llvm/Transforms/Scalar.h b/include/llvm/Transforms/Scalar.h index 01063f9136d..4da6c99024d 100644 --- a/include/llvm/Transforms/Scalar.h +++ b/include/llvm/Transforms/Scalar.h @@ -112,7 +112,7 @@ FunctionPass *createInstructionCombiningPass(); // // LICM - This pass is a loop invariant code motion and memory promotion pass. // -FunctionPass *createLICMPass(); +LoopPass *createLICMPass(); //===----------------------------------------------------------------------===// // diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index 3a7adef56eb..7a578a8fb42 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -38,6 +38,7 @@ #include "llvm/Instructions.h" #include "llvm/Target/TargetData.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/AliasSetTracker.h" #include "llvm/Analysis/Dominators.h" @@ -61,8 +62,8 @@ namespace { DisablePromotion("disable-licm-promotion", cl::Hidden, cl::desc("Disable memory promotion in LICM pass")); - struct VISIBILITY_HIDDEN LICM : public FunctionPass { - virtual bool runOnFunction(Function &F); + struct VISIBILITY_HIDDEN LICM : public LoopPass { + virtual bool runOnLoop(Loop *L, LPPassManager &LPM); /// This transformation requires natural loop information & requires that /// loop preheaders be inserted into the CFG... @@ -76,6 +77,11 @@ namespace { AU.addRequired(); } + bool doFinalize() { + LoopToAliasMap.clear(); + return false; + } + private: // Various analyses that we use... AliasAnalysis *AA; // Current AliasAnalysis information @@ -88,10 +94,7 @@ namespace { BasicBlock *Preheader; // The preheader block of the current loop... Loop *CurLoop; // The current loop we are working on... AliasSetTracker *CurAST; // AliasSet information for the current loop... - - /// visitLoop - Hoist expressions out of the specified loop... - /// - void visitLoop(Loop *L, AliasSetTracker &AST); + std::map LoopToAliasMap; /// SinkRegion - Walk the specified region of the CFG (defined by all blocks /// dominated by the specified block, and that are in the current loop) in @@ -199,12 +202,11 @@ namespace { RegisterPass X("licm", "Loop Invariant Code Motion"); } -FunctionPass *llvm::createLICMPass() { return new LICM(); } +LoopPass *llvm::createLICMPass() { return new LICM(); } -/// runOnFunction - For LICM, this simply traverses the loop structure of the -/// function, hoisting expressions out of loops if possible. +/// Hoist expressions out of the specified loop... /// -bool LICM::runOnFunction(Function &) { +bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) { Changed = false; // Get our Loop and Alias Analysis information... @@ -213,28 +215,19 @@ bool LICM::runOnFunction(Function &) { DF = &getAnalysis(); DT = &getAnalysis(); - // Hoist expressions out of all of the top-level loops. - for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I) { - AliasSetTracker AST(*AA); - visitLoop(*I, AST); - } - return Changed; -} - + CurAST = new AliasSetTracker(*AA); + // Collect Alias info frmo subloops + for (Loop::iterator LoopItr = L->begin(), LoopItrE = L->end(); + LoopItr != LoopItrE; ++LoopItr) { + Loop *InnerL = *LoopItr; + AliasSetTracker *InnerAST = LoopToAliasMap[InnerL]; + assert (InnerAST && "Where is my AST?"); -/// visitLoop - Hoist expressions out of the specified loop... -/// -void LICM::visitLoop(Loop *L, AliasSetTracker &AST) { - // Recurse through all subloops before we process this loop... - for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) { - AliasSetTracker SubAST(*AA); - visitLoop(*I, SubAST); - - // Incorporate information about the subloops into this loop... - AST.add(SubAST); + // What if InnerLoop was modified by other passes ? + CurAST->add(*InnerAST); } + CurLoop = L; - CurAST = * // Get the preheader block to move instructions into... Preheader = L->getLoopPreheader(); @@ -247,7 +240,7 @@ void LICM::visitLoop(Loop *L, AliasSetTracker &AST) { for (std::vector::const_iterator I = L->getBlocks().begin(), E = L->getBlocks().end(); I != E; ++I) if (LI->getLoopFor(*I) == L) // Ignore blocks in subloops... - AST.add(**I); // Incorporate the specified basic block + CurAST->add(**I); // Incorporate the specified basic block // We want to visit all of the instructions in this loop... that are not parts // of our subloops (they have already had their invariants hoisted out of @@ -270,6 +263,9 @@ void LICM::visitLoop(Loop *L, AliasSetTracker &AST) { // Clear out loops state information for the next iteration CurLoop = 0; Preheader = 0; + + LoopToAliasMap[L] = CurAST; + return Changed; } /// SinkRegion - Walk the specified region of the CFG (defined by all blocks diff --git a/tools/llvm-ld/Optimize.cpp b/tools/llvm-ld/Optimize.cpp index 4a63f8eb09a..9d987721e1c 100644 --- a/tools/llvm-ld/Optimize.cpp +++ b/tools/llvm-ld/Optimize.cpp @@ -15,6 +15,7 @@ #include "llvm/PassManager.h" #include "llvm/Analysis/LoadValueNumbering.h" #include "llvm/Analysis/Passes.h" +#include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/Verifier.h" #include "llvm/Support/CommandLine.h" #include "llvm/System/DynamicLibrary.h" diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 1f707444eec..885edbcbfa3 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -26,6 +26,7 @@ #include "llvm/System/Program.h" #include "llvm/System/Signals.h" #include "llvm/Analysis/Passes.h" +#include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/Verifier.h" #include "llvm/CodeGen/FileWriters.h" #include "llvm/Target/SubtargetFeature.h" -- 2.34.1