projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Remove the 'N' modifier from llvm-ar.
[oota-llvm.git]
/
include
/
llvm
/
PassManagers.h
diff --git
a/include/llvm/PassManagers.h
b/include/llvm/PassManagers.h
index 81b7e7af816e4a1f32f957e7905f421f4fb0377b..7afb0a0fbf90cf572fe2ba65176b724ea4727c60 100644
(file)
--- a/
include/llvm/PassManagers.h
+++ b/
include/llvm/PassManagers.h
@@
-7,28
+7,29
@@
//
//===----------------------------------------------------------------------===//
//
//
//===----------------------------------------------------------------------===//
//
-// 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/PassManager.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseMap.h"
-#include <deque>
+#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/Pass.h"
#include <map>
#include <map>
+#include <vector>
//===----------------------------------------------------------------------===//
// Overview:
// The Pass Manager Infrastructure manages passes. It's responsibilities are:
//===----------------------------------------------------------------------===//
// 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
+44,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
+83,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
+97,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
+107,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
+125,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
+165,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 {
+ unsigned getNumContainedManagers() const {
return (unsigned)PassManagers.size();
}
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(
ArrayRef<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
+198,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
+206,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
+224,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
+254,7
@@
private:
};
};
-
+
//===----------------------------------------------------------------------===//
// PMDataManager
//===----------------------------------------------------------------------===//
// PMDataManager
@@
-268,12
+263,12
@@
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.
virtual Pass *getAsPass() = 0;
/// Augment AvailableAnalysis by adding analysis made available by pass P.
@@
-284,16
+279,16
@@
public:
/// 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, StringRef Msg,
+ void removeDeadPasses(Pass *P, StringRef Msg,
enum PassDebuggingString);
/// Remove P.
enum PassDebuggingString);
/// Remove P.
- void freePass(Pass *P, 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);
@@
-302,10
+297,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);
+ 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;
@@
-319,8
+314,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
@@
-338,6
+333,7
@@
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;
// Print routines used by debug-pass
void dumpLastUses(Pass *P, unsigned Offset) const;
@@
-347,16
+343,16
@@
public:
void dumpRequiredSet(const Pass *P) const;
void dumpPreservedSet(const Pass *P) const;
void dumpRequiredSet(const Pass *P) const;
void dumpPreservedSet(const Pass *P) const;
-
virtual
unsigned getNumContainedPasses() const {
+ unsigned getNumContainedPasses() const {
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::m
ap<AnalysisID, Pass*> *getAvailableAnalysis() {
+
DenseM
ap<AnalysisID, Pass*> *getAvailableAnalysis() {
return &AvailableAnalysis;
}
return &AvailableAnalysis;
}
@@
-379,22
+375,21
@@
protected:
// Collection of Analysis provided by Parent pass manager and
// used by current pass manager. At at time there can not be more
// then PMT_Last active pass mangers.
// Collection of Analysis provided by Parent pass manager and
// used by current pass manager. At at time there can not be more
// then PMT_Last active pass mangers.
-
std::m
ap<AnalysisID, Pass *> *InheritedAnalysis[PMT_Last];
+
DenseM
ap<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:
void dumpAnalysisUsage(StringRef Msg, const Pass *P,
const AnalysisUsage::VectorType &Set) const;
private:
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 available then
+ // 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.
// the required analysis pass is scheduled to run before the pass itself is
// scheduled to run.
-
std::m
ap<AnalysisID, Pass*> AvailableAnalysis;
+
DenseM
ap<AnalysisID, Pass*> AvailableAnalysis;
// Collection of higher level analysis used by the pass managed by
// this manager.
// Collection of higher level analysis used by the pass managed by
// this manager.
@@
-407,26
+402,36
@@
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.
class FPPassManager : public ModulePass, public PMDataManager {
public:
static char ID;
/// function.
class FPPassManager : public ModulePass, public PMDataManager {
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();
/// cleanup - After running all passes, clean up pass manager cache.
void cleanup();
+ /// doInitialization - Overrides ModulePass doInitialization for global
+ /// initialization tasks
+ ///
+ using ModulePass::doInitialization;
+
/// doInitialization - Run all of the initializers for the function passes.
///
bool doInitialization(Module &M);
/// doInitialization - Run all of the initializers for the function passes.
///
bool doInitialization(Module &M);
+
+ /// doFinalization - Overrides ModulePass doFinalization for global
+ /// finalization tasks
+ ///
+ using ModulePass::doFinalization;
/// doFinalization - Run all of the finalizers for the function passes.
///
/// doFinalization - Run all of the finalizers for the function passes.
///
@@
-453,8
+458,8
@@
public:
return FP;
}
return FP;
}
- virtual PassManagerType getPassManagerType() const {
- return PMT_FunctionPassManager;
+ virtual PassManagerType getPassManagerType() const {
+ return PMT_FunctionPassManager;
}
};
}
};