Change the implemented interfaces list on PassInfo from a std::vector to a manually implemented

linked list.  This is a little slower and involves more malloc'ing, but these lists are
typically short, and it allows PassInfo to be entirely constant initializable.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108755 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2010-07-19 21:44:48 +00:00
parent 4332792deb
commit 7ee5d35493
2 changed files with 27 additions and 13 deletions

View File

@ -36,6 +36,10 @@ class TargetMachine;
class PassInfo { class PassInfo {
public: public:
typedef Pass* (*NormalCtor_t)(); typedef Pass* (*NormalCtor_t)();
struct InterfaceInfo {
const PassInfo *interface;
const InterfaceInfo *next;
};
private: private:
const char *const PassName; // Nice name for Pass const char *const PassName; // Nice name for Pass
@ -44,7 +48,7 @@ private:
const bool IsCFGOnlyPass; // Pass only looks at the CFG. const bool IsCFGOnlyPass; // Pass only looks at the CFG.
const bool IsAnalysis; // True if an analysis pass. const bool IsAnalysis; // True if an analysis pass.
const bool IsAnalysisGroup; // True if an analysis group. const bool IsAnalysisGroup; // True if an analysis group.
std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass
NormalCtor_t NormalCtor; NormalCtor_t NormalCtor;
@ -116,13 +120,16 @@ public:
/// template. /// template.
/// ///
void addInterfaceImplemented(const PassInfo *ItfPI) { void addInterfaceImplemented(const PassInfo *ItfPI) {
ItfImpl.push_back(ItfPI); InterfaceInfo *NewInfo = new InterfaceInfo();
NewInfo->interface = ItfPI;
NewInfo->next = ItfImpl;
ItfImpl = NewInfo;
} }
/// getInterfacesImplemented - Return a list of all of the analysis group /// getInterfacesImplemented - Return a list of all of the analysis group
/// interfaces implemented by this pass. /// interfaces implemented by this pass.
/// ///
const std::vector<const PassInfo*> &getInterfacesImplemented() const { const InterfaceInfo *getInterfacesImplemented() const {
return ItfImpl; return ItfImpl;
} }

View File

@ -638,10 +638,14 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
// If Pass not found then check the interfaces implemented by Immutable Pass // If Pass not found then check the interfaces implemented by Immutable Pass
if (!P) { if (!P) {
const std::vector<const PassInfo*> &ImmPI = const PassInfo::InterfaceInfo *ImmPI = PI->getInterfacesImplemented();
PI->getInterfacesImplemented(); while (ImmPI) {
if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end()) if (ImmPI->interface == AID) {
P = *I; P = *I;
break;
} else
ImmPI = ImmPI->next;
}
} }
} }
@ -731,9 +735,11 @@ void PMDataManager::recordAvailableAnalysis(Pass *P) {
//This pass is the current implementation of all of the interfaces it //This pass is the current implementation of all of the interfaces it
//implements as well. //implements as well.
const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented(); const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented();
for (unsigned i = 0, e = II.size(); i != e; ++i) while (II) {
AvailableAnalysis[II[i]] = P; AvailableAnalysis[II->interface] = P;
II = II->next;
}
} }
// Return true if P preserves high level analysis used by other // Return true if P preserves high level analysis used by other
@ -867,12 +873,13 @@ void PMDataManager::freePass(Pass *P, StringRef Msg,
// Remove all interfaces this pass implements, for which it is also // Remove all interfaces this pass implements, for which it is also
// listed as the available implementation. // listed as the available implementation.
const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented(); const PassInfo::InterfaceInfo *II = PI->getInterfacesImplemented();
for (unsigned i = 0, e = II.size(); i != e; ++i) { while (II) {
std::map<AnalysisID, Pass*>::iterator Pos = std::map<AnalysisID, Pass*>::iterator Pos =
AvailableAnalysis.find(II[i]); AvailableAnalysis.find(II->interface);
if (Pos != AvailableAnalysis.end() && Pos->second == P) if (Pos != AvailableAnalysis.end() && Pos->second == P)
AvailableAnalysis.erase(Pos); AvailableAnalysis.erase(Pos);
II = II->next;
} }
} }
} }