summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Pass.h3
-rw-r--r--lib/VMCore/PassManager.cpp15
2 files changed, 9 insertions, 9 deletions
diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h
index 8178598985..0a53cbf8d0 100644
--- a/include/llvm/Pass.h
+++ b/include/llvm/Pass.h
@@ -152,6 +152,7 @@ public:
virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) {
return this;
}
+ virtual ImmutablePass *getAsImmutablePass() { return 0; }
/// verifyAnalysis() - This member can be implemented by a analysis pass to
/// check state of analysis information.
@@ -249,6 +250,8 @@ public:
///
virtual void initializePass();
+ virtual ImmutablePass *getAsImmutablePass() { return this; }
+
/// ImmutablePasses are never run.
///
bool runOnModule(Module &) { return false; }
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index b37b2aeda8..7aa8cb3b01 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -202,9 +202,7 @@ public:
}
inline void addTopLevelPass(Pass *P) {
-
- if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
-
+ if (ImmutablePass *IP = P->getAsImmutablePass()) {
// P is a immutable pass and it will be managed by this
// top level manager. Set up analysis resolver to connect them.
AnalysisResolver *AR = new AnalysisResolver(*this);
@@ -333,8 +331,7 @@ public:
}
inline void addTopLevelPass(Pass *P) {
- if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
-
+ if (ImmutablePass *IP = P->getAsImmutablePass()) {
// P is a immutable pass and it will be managed by this
// top level manager. Set up analysis resolver to connect them.
AnalysisResolver *AR = new AnalysisResolver(*this);
@@ -670,7 +667,7 @@ bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) {
for (SmallVector<Pass *, 8>::iterator I = HigherLevelAnalysis.begin(),
E = HigherLevelAnalysis.end(); I != E; ++I) {
Pass *P1 = *I;
- if (!dynamic_cast<ImmutablePass*>(P1) &&
+ if (P1->getAsImmutablePass() == 0 &&
std::find(PreservedSet.begin(), PreservedSet.end(),
P1->getPassInfo()) ==
PreservedSet.end())
@@ -713,8 +710,8 @@ void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
E = AvailableAnalysis.end(); I != E; ) {
std::map<AnalysisID, Pass*>::iterator Info = I++;
- if (!dynamic_cast<ImmutablePass*>(Info->second)
- && std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
+ if (Info->second->getAsImmutablePass() == 0 &&
+ std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
PreservedSet.end()) {
// Remove this analysis
if (PassDebugging >= Details) {
@@ -737,7 +734,7 @@ void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
I = InheritedAnalysis[Index]->begin(),
E = InheritedAnalysis[Index]->end(); I != E; ) {
std::map<AnalysisID, Pass *>::iterator Info = I++;
- if (!dynamic_cast<ImmutablePass*>(Info->second) &&
+ if (Info->second->getAsImmutablePass() == 0 &&
std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
PreservedSet.end()) {
// Remove this analysis