diff options
author | Chris Lattner <sabre@nondot.org> | 2003-04-24 20:07:38 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-04-24 20:07:38 +0000 |
commit | a172846d3a9f28e5db781e05e747a57854177868 (patch) | |
tree | b82d97c40b8e4e85814c4cbe7b8565dd97de58aa | |
parent | a148ccb15888091c42fa986e612a8ae1e448282f (diff) |
Fix a nasty bug where the ConstantMerge pass was invalidating the TargetData pass
even though it was immutable. Immutable passes should never end up in CurrentAnalyses!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5906 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/VMCore/PassManagerT.h | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/lib/VMCore/PassManagerT.h b/lib/VMCore/PassManagerT.h index 123af34656..55beaa457a 100644 --- a/lib/VMCore/PassManagerT.h +++ b/lib/VMCore/PassManagerT.h @@ -332,12 +332,32 @@ public: } } + Pass *getImmutablePassOrNull(const PassInfo *ID) const { + for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) { + const PassInfo *IPID = ImmutablePasses[i]->getPassInfo(); + if (IPID == ID) + return ImmutablePasses[i]; + + // This pass is the current implementation of all of the interfaces it + // implements as well. + // + const std::vector<const PassInfo*> &II = + IPID->getInterfacesImplemented(); + for (unsigned j = 0, e = II.size(); j != e; ++j) + if (II[j] == ID) return ImmutablePasses[i]; + } + return 0; + } + Pass *getAnalysisOrNullDown(const PassInfo *ID) const { std::map<AnalysisID, Pass*>::const_iterator I = CurrentAnalyses.find(ID); if (I != CurrentAnalyses.end()) return I->second; // Found it. + if (Pass *P = getImmutablePassOrNull(ID)) + return P; + if (Batcher) return ((AnalysisResolver*)Batcher)->getAnalysisOrNullDown(ID); return 0; @@ -350,6 +370,8 @@ public: if (Parent) // Try scanning... return Parent->getAnalysisOrNullUp(ID); + else if (!ImmutablePasses.empty()) + return getImmutablePassOrNull(ID); return 0; } @@ -386,7 +408,9 @@ public: if (Parent) { Parent->markPassUsed(P, this); } else { - assert(0 && "Pass available but not found! " + assert(getAnalysisOrNullUp(P) && + dynamic_cast<ImmutablePass*>(getAnalysisOrNullUp(P)) && + "Pass available but not found! " "Perhaps this is a module pass requiring a function pass?"); } } @@ -556,18 +580,6 @@ public: // Initialize the immutable pass... IP->initializePass(); - - // Add this pass to the currently available set... - if (const PassInfo *PI = IP->getPassInfo()) { - CurrentAnalyses[PI] = IP; - - // This pass is the current implementation of all of the interfaces it - // implements as well. - // - const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented(); - for (unsigned i = 0, e = II.size(); i != e; ++i) - CurrentAnalyses[II[i]] = IP; - } } }; |