From 20525d2836f2f82c58173320ab7dd189aeac7159 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Thu, 22 Feb 2007 08:56:17 +0000 Subject: [PATCH] Add Loop Pass Manager. llvm-svn: 34487 --- llvm/include/llvm/Analysis/LoopPass.h | 86 +++++++++++++++++++++++++++ llvm/lib/Analysis/LoopPass.cpp | 69 +++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 llvm/include/llvm/Analysis/LoopPass.h create mode 100644 llvm/lib/Analysis/LoopPass.cpp diff --git a/llvm/include/llvm/Analysis/LoopPass.h b/llvm/include/llvm/Analysis/LoopPass.h new file mode 100644 index 000000000000..eb153738fe91 --- /dev/null +++ b/llvm/include/llvm/Analysis/LoopPass.h @@ -0,0 +1,86 @@ +//===- LoopPass.h - LoopPass class ----------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by Devang Patel and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines LoopPass class. All loop optimization +// and transformation passes are derived from LoopPass. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LOOP_PASS_H +#define LLVM_LOOP_PASS_H + +#include "llvm/Analysis/LoopInfo.h" +#include "llvm/Pass.h" +#include "llvm/PassManagers.h" +#include "llvm/Function.h" + +namespace llvm { + +class LPPassManager; +class Loop; +class Function; + +class LoopPass : public Pass { + + public: + // runOnLoop - THis method should be implemented by the subclass to perform + // whatever action is necessary for the specfied Loop. + virtual bool runOnLoop (Loop &L, LPPassManager &LPM) = 0; + virtual bool runOnFunctionBody (Function &F, LPPassManager &LPM) { + return false; + } + +}; + +class LPPassManager : public FunctionPass, public PMDataManager { + +public: + LPPassManager(int Depth) : PMDataManager(Depth) { } + + /// run - Execute all of the passes scheduled for execution. Keep track of + /// whether any of the passes modifies the module, and if so, return true. + bool runOnFunction(Function &F); + + /// Pass Manager itself does not invalidate any analysis info. + void getAnalysisUsage(AnalysisUsage &Info) const { + // LPPassManager needs LoopInfo. In the long term LoopInfo class will + // be consumed by LPPassManager. + Info.addRequired(); + Info.setPreservesAll(); + } + + virtual const char *getPassName() const { + return "Loop Pass Manager"; + } + + // Print passes managed by this manager + void dumpPassStructure(unsigned Offset) { + llvm::cerr << std::string(Offset*2, ' ') << "Loop Pass Manager\n"; + for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { + Pass *P = getContainedPass(Index); + P->dumpPassStructure(Offset + 1); + dumpLastUses(P, Offset+1); + } + } + + Pass *getContainedPass(unsigned N) { + assert ( N < PassVector.size() && "Pass number out of range!"); + Pass *FP = static_cast(PassVector[N]); + return FP; + } + + virtual PassManagerType getPassManagerType() { + return PMT_LoopPassManager; + } + +}; + +} // End llvm namespace + +#endif diff --git a/llvm/lib/Analysis/LoopPass.cpp b/llvm/lib/Analysis/LoopPass.cpp new file mode 100644 index 000000000000..ee18ed57333c --- /dev/null +++ b/llvm/lib/Analysis/LoopPass.cpp @@ -0,0 +1,69 @@ +//===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by Devang Patel and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements LoopPass and LPPassManager. All loop optimization +// and transformation passes are derived from LoopPass. LPPassManager is +// responsible for managing LoopPasses. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Analysis/LoopPass.h" +using namespace llvm; + +//===----------------------------------------------------------------------===// +// LPPassManager +// +/// LPPassManager manages FPPassManagers and CalLGraphSCCPasses. + +/// run - Execute all of the passes scheduled for execution. Keep track of +/// whether any of the passes modifies the function, and if so, return true. +bool LPPassManager::runOnFunction(Function &F) { + LoopInfo &LI = getAnalysis(); + bool Changed = false; + + std::string Msg1 = "Executing Pass '"; + std::string Msg3 = "' Made Modification '"; + + // Walk Loops + for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) { + + Loop *L = *I; + // Run all passes on current SCC + for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { + + Pass *P = getContainedPass(Index); + AnalysisUsage AnUsage; + P->getAnalysisUsage(AnUsage); + + std::string Msg2 = "' on Loop ...\n'"; + dumpPassInfo(P, Msg1, Msg2); + dumpAnalysisSetInfo("Required", P, AnUsage.getRequiredSet()); + + initializeAnalysisImpl(P); + + StartPassTimer(P); + LoopPass *LP = dynamic_cast(P); + assert (LP && "Invalid LPPassManager member"); + LP->runOnLoop(*L, *this); + StopPassTimer(P); + + if (Changed) + dumpPassInfo(P, Msg3, Msg2); + dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet()); + + removeNotPreservedAnalysis(P); + recordAvailableAnalysis(P); + removeDeadPasses(P, Msg2); + } + } + + return Changed; +} + +