projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Unbreak the MSVC build, that next() thing again.
[oota-llvm.git]
/
include
/
llvm
/
PassManagers.h
diff --git
a/include/llvm/PassManagers.h
b/include/llvm/PassManagers.h
index a067294e9fa4748668a641ed942b43f18f3ab8fe..fa29f50ccf771d04def5557024ed8887e44e3f63 100644
(file)
--- a/
include/llvm/PassManagers.h
+++ b/
include/llvm/PassManagers.h
@@
-7,28
+7,28
@@
//
//===----------------------------------------------------------------------===//
//
//
//===----------------------------------------------------------------------===//
//
-// This file declares the LLVM Pass Manager infrastructure.
+// This file declares the LLVM Pass Manager infrastructure.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_PASSMANAGERS_H
#define LLVM_PASSMANAGERS_H
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_PASSMANAGERS_H
#define LLVM_PASSMANAGERS_H
-#include "llvm/Pass
Manager
.h"
+#include "llvm/Pass.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/DenseMap.h"
-#include <
deque
>
+#include <
vector
>
#include <map>
//===----------------------------------------------------------------------===//
// Overview:
// The Pass Manager Infrastructure manages passes. It's responsibilities are:
#include <map>
//===----------------------------------------------------------------------===//
// Overview:
// The Pass Manager Infrastructure manages passes. It's responsibilities are:
-//
+//
// o Manage optimization pass execution order
// o Make required Analysis information available before pass P is run
// o Release memory occupied by dead passes
// o Manage optimization pass execution order
// o Make required Analysis information available before pass P is run
// o Release memory occupied by dead passes
-// o If Analysis information is dirtied by a pass then regenerate Analysis
+// o If Analysis information is dirtied by a pass then regenerate Analysis
// information before it is consumed by another pass.
//
// Pass Manager Infrastructure uses multiple pass managers. They are
// information before it is consumed by another pass.
//
// Pass Manager Infrastructure uses multiple pass managers. They are
@@
-43,13
+43,13
@@
//
// [o] class PMTopLevelManager;
//
//
// [o] class PMTopLevelManager;
//
-// Two top level managers, PassManager and FunctionPassManager, derive from
-// PMTopLevelManager. PMTopLevelManager manages information used by top level
+// Two top level managers, PassManager and FunctionPassManager, derive from
+// PMTopLevelManager. PMTopLevelManager manages information used by top level
// managers such as last user info.
//
// [o] class PMDataManager;
//
// managers such as last user info.
//
// [o] class PMDataManager;
//
-// PMDataManager manages information, e.g. list of available analysis info,
+// PMDataManager manages information, e.g. list of available analysis info,
// used by a pass manager to manage execution order of passes. It also provides
// a place to implement common pass manager APIs. All pass managers derive from
// PMDataManager.
// used by a pass manager to manage execution order of passes. It also provides
// a place to implement common pass manager APIs. All pass managers derive from
// PMDataManager.
@@
-82,7
+82,7
@@
// relies on PassManagerImpl to do all the tasks.
//
// [o] class PassManagerImpl : public Pass, public PMDataManager,
// relies on PassManagerImpl to do all the tasks.
//
// [o] class PassManagerImpl : public Pass, public PMDataManager,
-// public PM
D
TopLevelManager
+// public PMTopLevelManager
//
// PassManagerImpl is a top level pass manager responsible for managing
// MPPassManagers.
//
// PassManagerImpl is a top level pass manager responsible for managing
// MPPassManagers.
@@
-96,14
+96,8
@@
namespace llvm {
class StringRef;
class Value;
class Timer;
class StringRef;
class Value;
class Timer;
+ class PMDataManager;
-/// FunctionPassManager and PassManager, two top level managers, serve
-/// as the public interface of pass manager infrastructure.
-enum TopLevelManagerType {
- TLM_Function, // FunctionPassManager
- TLM_Pass // PassManager
-};
-
// enums for debugging strings
enum PassDebuggingString {
EXECUTION_MSG, // "Executing Pass '"
// enums for debugging strings
enum PassDebuggingString {
EXECUTION_MSG, // "Executing Pass '"
@@
-112,9
+106,10
@@
enum PassDebuggingString {
ON_BASICBLOCK_MSG, // "' on BasicBlock '" + PassName + "'...\n"
ON_FUNCTION_MSG, // "' on Function '" + FunctionName + "'...\n"
ON_MODULE_MSG, // "' on Module '" + ModuleName + "'...\n"
ON_BASICBLOCK_MSG, // "' on BasicBlock '" + PassName + "'...\n"
ON_FUNCTION_MSG, // "' on Function '" + FunctionName + "'...\n"
ON_MODULE_MSG, // "' on Module '" + ModuleName + "'...\n"
+ ON_REGION_MSG, // " 'on Region ...\n'"
ON_LOOP_MSG, // " 'on Loop ...\n'"
ON_CG_MSG // "' on Call Graph ...\n'"
ON_LOOP_MSG, // " 'on Loop ...\n'"
ON_CG_MSG // "' on Call Graph ...\n'"
-};
+};
/// PassManagerPrettyStackEntry - This is used to print informative information
/// about what pass is running when/if a stack trace is generated.
/// PassManagerPrettyStackEntry - This is used to print informative information
/// about what pass is running when/if a stack trace is generated.
@@
-129,39
+124,37
@@
public:
: P(p), V(&v), M(0) {} // When P is run on V
PassManagerPrettyStackEntry(Pass *p, Module &m)
: P(p), V(0), M(&m) {} // When P is run on M
: P(p), V(&v), M(0) {} // When P is run on V
PassManagerPrettyStackEntry(Pass *p, Module &m)
: P(p), V(0), M(&m) {} // When P is run on M
-
+
/// print - Emit information about this stack frame to OS.
virtual void print(raw_ostream &OS) const;
};
/// print - Emit information about this stack frame to OS.
virtual void print(raw_ostream &OS) const;
};
-
-
+
+
//===----------------------------------------------------------------------===//
// PMStack
//
//===----------------------------------------------------------------------===//
// PMStack
//
-/// PMStack
-/// Top level pass managers (see PassManager.cpp) maintain active Pass Managers
+/// PMStack - This class implements a stack data structure of PMDataManager
+/// pointers.
+///
+/// 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.
/// 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:
class PMStack {
public:
- typedef std::deque<PMDataManager *>::reverse_iterator iterator;
- iterator begin() { return S.rbegin(); }
- iterator end() { return S.rend(); }
-
- void handleLastUserOverflow();
+ typedef std::vector<PMDataManager *>::const_reverse_iterator iterator;
+ iterator begin() const { return S.rbegin(); }
+ iterator end() const { return S.rend(); }
void pop();
void pop();
-
inline PMDataManager *top()
{ return S.back(); }
+
PMDataManager *top() const
{ return S.back(); }
void push(PMDataManager *PM);
void push(PMDataManager *PM);
- inline bool empty() { return S.empty(); }
+ bool empty() const { return S.empty(); }
+
+ void dump() const;
- void dump();
private:
private:
- std::
deque
<PMDataManager *> S;
+ std::
vector
<PMDataManager *> S;
};
};
@@
-171,26
+164,30
@@
private:
/// PMTopLevelManager manages LastUser info and collects common APIs used by
/// top level pass managers.
class PMTopLevelManager {
/// PMTopLevelManager manages LastUser info and collects common APIs used by
/// top level pass managers.
class PMTopLevelManager {
-public:
+protected:
+ explicit PMTopLevelManager(PMDataManager *PMDM);
virtual unsigned getNumContainedManagers() const {
return (unsigned)PassManagers.size();
}
virtual unsigned getNumContainedManagers() const {
return (unsigned)PassManagers.size();
}
+ void initializeAllAnalysisInfo();
+
+private:
+ virtual PMDataManager *getAsPMDataManager() = 0;
+ virtual PassManagerType getTopLevelPassManagerType() = 0;
+
+public:
/// Schedule pass P for execution. Make sure that passes required by
/// P are run before P is run. Update analysis info maintained by
/// the manager. Remove dead passes. This is a recursive function.
void schedulePass(Pass *P);
/// Schedule pass P for execution. Make sure that passes required by
/// P are run before P is run. Update analysis info maintained by
/// the manager. Remove dead passes. This is a recursive function.
void schedulePass(Pass *P);
- /// This is implemented by top level pass manager and used by
- /// schedulePass() to add analysis info passes that are not available.
- virtual void addTopLevelPass(Pass *P) = 0;
-
/// Set pass P as the last user of the given analysis passes.
/// Set pass P as the last user of the given analysis passes.
- void setLastUser(
SmallVector<Pass *, 12
> &AnalysisPasses, Pass *P);
+ void setLastUser(
const SmallVectorImpl<Pass *
> &AnalysisPasses, Pass *P);
/// Collect passes whose last user is P
/// Collect passes whose last user is P
- void collectLastUses(SmallVector
<Pass *, 12
> &LastUses, Pass *P);
+ void collectLastUses(SmallVector
Impl<Pass *
> &LastUses, Pass *P);
/// Find the pass that implements Analysis AID. Search immutable
/// passes and all pass managers. If desired pass is not found
/// Find the pass that implements Analysis AID. Search immutable
/// passes and all pass managers. If desired pass is not found
@@
-200,8
+197,7
@@
public:
/// Find analysis usage information for the pass P.
AnalysisUsage *findAnalysisUsage(Pass *P);
/// Find analysis usage information for the pass P.
AnalysisUsage *findAnalysisUsage(Pass *P);
- explicit PMTopLevelManager(enum TopLevelManagerType t);
- virtual ~PMTopLevelManager();
+ virtual ~PMTopLevelManager();
/// Add immutable pass and initialize it.
inline void addImmutablePass(ImmutablePass *P) {
/// Add immutable pass and initialize it.
inline void addImmutablePass(ImmutablePass *P) {
@@
-209,7
+205,7
@@
public:
ImmutablePasses.push_back(P);
}
ImmutablePasses.push_back(P);
}
- inline SmallVector
<ImmutablePass *, 8
>& getImmutablePasses() {
+ inline SmallVector
Impl<ImmutablePass *
>& getImmutablePasses() {
return ImmutablePasses;
}
return ImmutablePasses;
}
@@
-227,13
+223,11
@@
public:
void dumpPasses() const;
void dumpArguments() const;
void dumpPasses() const;
void dumpArguments() const;
- void initializeAllAnalysisInfo();
-
// Active Pass Managers
PMStack activeStack;
protected:
// Active Pass Managers
PMStack activeStack;
protected:
-
+
/// Collection of pass managers
SmallVector<PMDataManager *, 8> PassManagers;
/// Collection of pass managers
SmallVector<PMDataManager *, 8> PassManagers;
@@
-259,7
+253,7
@@
private:
};
};
-
+
//===----------------------------------------------------------------------===//
// PMDataManager
//===----------------------------------------------------------------------===//
// PMDataManager
@@
-268,33
+262,32
@@
private:
class PMDataManager {
public:
class PMDataManager {
public:
- explicit PMDataManager(
int Depth) : TPM(NULL), Depth(Depth
) {
+ explicit PMDataManager(
) : TPM(NULL), Depth(0
) {
initializeAnalysisInfo();
}
virtual ~PMDataManager();
initializeAnalysisInfo();
}
virtual ~PMDataManager();
+ virtual Pass *getAsPass() = 0;
+
/// 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);
/// 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);
/// Remove Analysis that is not preserved by the pass
void removeNotPreservedAnalysis(Pass *P);
-
+
/// Remove dead passes used by P.
/// Remove dead passes used by P.
- void removeDeadPasses(Pass *P,
const StringRef &Msg,
+ void removeDeadPasses(Pass *P,
StringRef Msg,
enum PassDebuggingString);
/// Remove P.
enum PassDebuggingString);
/// Remove P.
- void freePass(Pass *P,
const StringRef &Msg,
+ void freePass(Pass *P,
StringRef Msg,
enum PassDebuggingString);
enum PassDebuggingString);
- /// Add pass P into the PassVector. Update
+ /// Add pass P into the PassVector. Update
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
void add(Pass *P, bool ProcessAnalysis = true);
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
void add(Pass *P, bool ProcessAnalysis = true);
@@
-303,13
+296,10
@@
public:
/// through getAnalysis interface.
virtual void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass);
/// through getAnalysis interface.
virtual void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass);
- virtual Pass * getOnTheFlyPass(Pass *P, const PassInfo *PI, Function &F) {
- assert (0 && "Unable to find on the fly pass");
- return NULL;
- }
+ virtual Pass *getOnTheFlyPass(Pass *P, AnalysisID PI, Function &F);
/// Initialize available analysis information.
/// Initialize available analysis information.
- void initializeAnalysisInfo() {
+ void initializeAnalysisInfo() {
AvailableAnalysis.clear();
for (unsigned i = 0; i < PMT_Last; ++i)
InheritedAnalysis[i] = NULL;
AvailableAnalysis.clear();
for (unsigned i = 0; i < PMT_Last; ++i)
InheritedAnalysis[i] = NULL;
@@
-323,8
+313,8
@@
public:
/// Populate RequiredPasses with analysis pass that are required by
/// pass P and are available. Populate ReqPassNotAvailable with analysis
/// pass that are required by pass P but are not available.
/// Populate RequiredPasses with analysis pass that are required by
/// pass P and are available. Populate ReqPassNotAvailable with analysis
/// pass that are required by pass P but are not available.
- void collectRequiredAnalysis(SmallVector
<Pass *, 8
> &RequiredPasses,
- SmallVector
<AnalysisID, 8
> &ReqPassNotAvailable,
+ void collectRequiredAnalysis(SmallVector
Impl<Pass *
> &RequiredPasses,
+ SmallVector
Impl<AnalysisID
> &ReqPassNotAvailable,
Pass *P);
/// All Required analyses should be available to the pass as it runs! Here
Pass *P);
/// All Required analyses should be available to the pass as it runs! Here
@@
-342,12
+332,13
@@
public:
void setTopLevelManager(PMTopLevelManager *T) { TPM = T; }
unsigned getDepth() const { return Depth; }
void setTopLevelManager(PMTopLevelManager *T) { TPM = T; }
unsigned getDepth() const { return Depth; }
+ void setDepth(unsigned newDepth) { Depth = newDepth; }
// Print routines used by debug-pass
void dumpLastUses(Pass *P, unsigned Offset) const;
void dumpPassArguments() const;
void dumpPassInfo(Pass *P, enum PassDebuggingString S1,
// Print routines used by debug-pass
void dumpLastUses(Pass *P, unsigned Offset) const;
void dumpPassArguments() const;
void dumpPassInfo(Pass *P, enum PassDebuggingString S1,
- enum PassDebuggingString S2,
const StringRef &
Msg);
+ enum PassDebuggingString S2,
StringRef
Msg);
void dumpRequiredSet(const Pass *P) const;
void dumpPreservedSet(const Pass *P) const;
void dumpRequiredSet(const Pass *P) const;
void dumpPreservedSet(const Pass *P) const;
@@
-355,9
+346,9
@@
public:
return (unsigned)PassVector.size();
}
return (unsigned)PassVector.size();
}
- virtual PassManagerType getPassManagerType() const {
+ virtual PassManagerType getPassManagerType() const {
assert ( 0 && "Invalid use of getPassManagerType");
assert ( 0 && "Invalid use of getPassManagerType");
- return PMT_Unknown;
+ return PMT_Unknown;
}
std::map<AnalysisID, Pass*> *getAvailableAnalysis() {
}
std::map<AnalysisID, Pass*> *getAvailableAnalysis() {
@@
-385,18
+376,18
@@
protected:
// then PMT_Last active pass mangers.
std::map<AnalysisID, Pass *> *InheritedAnalysis[PMT_Last];
// then PMT_Last active pass mangers.
std::map<AnalysisID, Pass *> *InheritedAnalysis[PMT_Last];
-
+
/// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
/// or higher is specified.
bool isPassDebuggingExecutionsOrMore() const;
/// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
/// or higher is specified.
bool isPassDebuggingExecutionsOrMore() const;
-
+
private:
private:
- void dumpAnalysisUsage(
const StringRef &
Msg, const Pass *P,
-
const AnalysisUsage::VectorType &Set) const;
+ void dumpAnalysisUsage(
StringRef
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
+ // Set of available Analysis. This information is used while scheduling
+ // pass. If a pass requires an analysis which is not
available then
+ //
the required analysis pass is scheduled to run before the pass itself is
// scheduled to run.
std::map<AnalysisID, Pass*> AvailableAnalysis;
// scheduled to run.
std::map<AnalysisID, Pass*> AvailableAnalysis;
@@
-411,33
+402,34
@@
private:
// FPPassManager
//
/// FPPassManager manages BBPassManagers and FunctionPasses.
// FPPassManager
//
/// FPPassManager manages BBPassManagers and FunctionPasses.
-/// It batches all function passes and basic block pass managers together and
-/// sequence them to process one function at a time before processing next
+/// It batches all function passes and basic block pass managers together and
+/// sequence them to process one function at a time before processing next
/// function.
/// function.
-
class FPPassManager : public ModulePass, public PMDataManager {
class FPPassManager : public ModulePass, public PMDataManager {
-
public:
static char ID;
public:
static char ID;
- explicit FPPassManager(
int Depth)
- : ModulePass(
&ID), PMDataManager(Depth
) { }
-
+ explicit FPPassManager(
)
+ : ModulePass(
ID), PMDataManager(
) { }
+
/// 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);
bool runOnModule(Module &M);
/// 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);
bool runOnModule(Module &M);
-
+
/// cleanup - After running all passes, clean up pass manager cache.
void cleanup();
/// doInitialization - Run all of the initializers for the function passes.
///
bool doInitialization(Module &M);
/// cleanup - After running all passes, clean up pass manager cache.
void cleanup();
/// doInitialization - Run all of the initializers for the function passes.
///
bool doInitialization(Module &M);
-
+
/// doFinalization - Run all of the finalizers for the function passes.
///
bool doFinalization(Module &M);
/// doFinalization - Run all of the finalizers for the function passes.
///
bool doFinalization(Module &M);
+ virtual PMDataManager *getAsPMDataManager() { return this; }
+ virtual Pass *getAsPass() { return this; }
+
/// Pass Manager itself does not invalidate any analysis info.
void getAnalysisUsage(AnalysisUsage &Info) const {
Info.setPreservesAll();
/// Pass Manager itself does not invalidate any analysis info.
void getAnalysisUsage(AnalysisUsage &Info) const {
Info.setPreservesAll();
@@
-456,13
+448,12
@@
public:
return FP;
}
return FP;
}
- virtual PassManagerType getPassManagerType() const {
- return PMT_FunctionPassManager;
+ virtual PassManagerType getPassManagerType() const {
+ return PMT_FunctionPassManager;
}
};
}
};
-extern Timer *StartPassTimer(Pass *);
-extern void StopPassTimer(Pass *, Timer *);
+Timer *getPassTimer(Pass *);
}
}