X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FPassManagers.h;h=22d5062b6b1676e2e1a1b645945858ab14379c3f;hb=0f123cf732ad249117b7471e37bf819633b76a6e;hp=7c29263f3971405594133cea7f3d93f6ba7c26a0;hpb=2bb7d0647e5b3f79ad9b6e7efd0dd99f24a0ca69;p=oota-llvm.git diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 7c29263f397..22d5062b6b1 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -1,9 +1,9 @@ -//===- llvm/PassManager.h - Pass Inftrastructre classes --------*- C++ -*-===// +//===- llvm/PassManagers.h - Pass Infrastructure classes -------*- C++ -*-===// // // 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 is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -11,10 +11,15 @@ // //===----------------------------------------------------------------------===// +#ifndef LLVM_PASSMANAGERS_H +#define LLVM_PASSMANAGERS_H + #include "llvm/PassManager.h" #include "llvm/ADT/SmallVector.h" -class llvm::PMDataManager; -class llvm::PMStack; +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/DenseMap.h" +#include +#include //===----------------------------------------------------------------------===// // Overview: @@ -28,8 +33,8 @@ class llvm::PMStack; // // Pass Manager Infrastructure uses multiple pass managers. They are // PassManager, FunctionPassManager, MPPassManager, FPPassManager, BBPassManager. -// This class hierarcy uses multiple inheritance but pass managers do not derive -// from another pass manager. +// This class hierarchy uses multiple inheritance but pass managers do not +// derive from another pass manager. // // PassManager and FunctionPassManager are two top-level pass manager that // represents the external interface of this entire pass manager infrastucture. @@ -83,9 +88,6 @@ class llvm::PMStack; // MPPassManagers. //===----------------------------------------------------------------------===// -#ifndef PASSMANAGERS_H -#define PASSMANAGERS_H - namespace llvm { /// FunctionPassManager and PassManager, two top level managers, serve @@ -107,6 +109,36 @@ enum PassDebuggingString { ON_CG_MSG // "' on Call Graph ...\n'" }; +//===----------------------------------------------------------------------===// +// PMStack +// +/// PMStack +/// Top level pass managers (see PassManager.cpp) maintain active Pass Managers +/// using PMStack. Each Pass implements assignPassManager() to connect itself +/// with appropriate manager. assignPassManager() walks PMStack to find +/// suitable manager. +/// +/// PMStack is just a wrapper around standard deque that overrides pop() and +/// push() methods. +class PMStack { +public: + typedef std::deque::reverse_iterator iterator; + iterator begin() { return S.rbegin(); } + iterator end() { return S.rend(); } + + void handleLastUserOverflow(); + + void pop(); + inline PMDataManager *top() { return S.back(); } + void push(PMDataManager *PM); + inline bool empty() { return S.empty(); } + + void dump(); +private: + std::deque S; +}; + + //===----------------------------------------------------------------------===// // PMTopLevelManager // @@ -115,8 +147,8 @@ enum PassDebuggingString { class PMTopLevelManager { public: - virtual unsigned getNumContainedManagers() { - return PassManagers.size(); + virtual unsigned getNumContainedManagers() const { + return (unsigned)PassManagers.size(); } /// Schedule pass P for execution. Make sure that passes required by @@ -139,6 +171,9 @@ public: /// then return NULL. Pass *findAnalysisPass(AnalysisID AID); + /// Find analysis usage information for the pass P. + AnalysisUsage *findAnalysisUsage(Pass *P); + explicit PMTopLevelManager(enum TopLevelManagerType t); virtual ~PMTopLevelManager(); @@ -148,11 +183,11 @@ public: ImmutablePasses.push_back(P); } - inline std::vector& getImmutablePasses() { + inline SmallVector& getImmutablePasses() { return ImmutablePasses; } - void addPassManager(Pass *Manager) { + void addPassManager(PMDataManager *Manager) { PassManagers.push_back(Manager); } @@ -174,20 +209,27 @@ public: protected: /// Collection of pass managers - std::vector PassManagers; + SmallVector PassManagers; private: /// Collection of pass managers that are not directly maintained /// by this pass manager - std::vector IndirectPassManagers; + SmallVector IndirectPassManagers; // Map to keep track of last user of the analysis pass. // LastUser->second is the last user of Lastuser->first. - std::map LastUser; + DenseMap LastUser; + + // Map to keep track of passes that are last used by a pass. + // This inverse map is initialized at PM->run() based on + // LastUser map. + DenseMap > InversedLastUser; /// Immutable passes are managed by top level manager. - std::vector ImmutablePasses; + SmallVector ImmutablePasses; + + DenseMap AnUsageMap; }; @@ -206,16 +248,15 @@ public: virtual ~PMDataManager(); - /// Return true IFF pass P's required analysis set does not required new - /// manager. - bool manageablePass(Pass *P); - /// Augment AvailableAnalysis by adding analysis made available by pass P. void recordAvailableAnalysis(Pass *P); /// verifyPreservedAnalysis -- Verify analysis presreved by pass P. void verifyPreservedAnalysis(Pass *P); + /// verifyDomInfo -- Verify dominator information if it is available. + void verifyDomInfo(Pass &P, Function &F); + /// Remove Analysis that is not preserved by the pass void removeNotPreservedAnalysis(Pass *P); @@ -276,11 +317,11 @@ public: void dumpPassArguments() const; void dumpPassInfo(Pass *P, enum PassDebuggingString S1, enum PassDebuggingString S2, const char *Msg); - void dumpAnalysisSetInfo(const char *Msg, Pass *P, - const std::vector &Set) const; + void dumpRequiredSet(const Pass *P) const; + void dumpPreservedSet(const Pass *P) const; - virtual unsigned getNumContainedPasses() { - return PassVector.size(); + virtual unsigned getNumContainedPasses() const { + return (unsigned)PassVector.size(); } virtual PassManagerType getPassManagerType() const { @@ -306,7 +347,7 @@ protected: PMTopLevelManager *TPM; // Collection of pass that are managed by this manager - std::vector PassVector; + SmallVector PassVector; // Collection of Analysis provided by Parent pass manager and // used by current pass manager. At at time there can not be more @@ -314,6 +355,9 @@ protected: std::map *InheritedAnalysis[PMT_Last]; private: + void dumpAnalysisUsage(const char *Msg, const Pass *P, + const AnalysisUsage::VectorType &Set) const; + // Set of available Analysis. This information is used while scheduling // pass. If a pass requires an analysis which is not not available then // equired analysis pass is scheduled to run before the pass itself is @@ -322,7 +366,7 @@ private: // Collection of higher level analysis used by the pass managed by // this manager. - std::vector HigherLevelAnalysis; + SmallVector HigherLevelAnalysis; unsigned Depth; }; @@ -384,4 +428,3 @@ extern void StartPassTimer(llvm::Pass *); extern void StopPassTimer(llvm::Pass *); #endif -