diff --git a/llvm/include/llvm/PassAnalysisSupport.h b/llvm/include/llvm/PassAnalysisSupport.h --- a/llvm/include/llvm/PassAnalysisSupport.h +++ b/llvm/include/llvm/PassAnalysisSupport.h @@ -17,11 +17,12 @@ #if !defined(LLVM_PASS_H) || defined(LLVM_PASSANALYSISSUPPORT_H) #error "Do not include ; include instead" -#endif +#endif #ifndef LLVM_PASSANALYSISSUPPORT_H #define LLVM_PASSANALYSISSUPPORT_H +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include #include @@ -58,6 +59,11 @@ SmallVector Used; bool PreservesAll = false; + void pushUnique(VectorType &Set, AnalysisID ID) { + if (!llvm::is_contained(Set, ID)) + Set.push_back(ID); + } + public: AnalysisUsage() = default; @@ -80,17 +86,17 @@ ///@{ /// Add the specified ID to the set of analyses preserved by this pass. AnalysisUsage &addPreservedID(const void *ID) { - Preserved.push_back(ID); + pushUnique(Preserved, ID); return *this; } AnalysisUsage &addPreservedID(char &ID) { - Preserved.push_back(&ID); + pushUnique(Preserved, &ID); return *this; } /// Add the specified Pass class to the set of analyses preserved by this pass. template AnalysisUsage &addPreserved() { - Preserved.push_back(&PassClass::ID); + pushUnique(Preserved, &PassClass::ID); return *this; } ///@} @@ -99,17 +105,17 @@ /// Add the specified ID to the set of analyses used by this pass if they are /// available.. AnalysisUsage &addUsedIfAvailableID(const void *ID) { - Used.push_back(ID); + pushUnique(Used, ID); return *this; } AnalysisUsage &addUsedIfAvailableID(char &ID) { - Used.push_back(&ID); + pushUnique(Used, &ID); return *this; } /// Add the specified Pass class to the set of analyses used by this pass. template AnalysisUsage &addUsedIfAvailable() { - Used.push_back(&PassClass::ID); + pushUnique(Used, &PassClass::ID); return *this; } ///@} diff --git a/llvm/lib/IR/LegacyPassManager.cpp b/llvm/lib/IR/LegacyPassManager.cpp --- a/llvm/lib/IR/LegacyPassManager.cpp +++ b/llvm/lib/IR/LegacyPassManager.cpp @@ -1110,12 +1110,6 @@ UP.push_back(AnalysisPass); else RP_NotAvail.push_back(RequiredID); - - for (const auto &RequiredID : AnUsage->getRequiredTransitiveSet()) - if (Pass *AnalysisPass = findAnalysisPass(RequiredID, true)) - UP.push_back(AnalysisPass); - else - RP_NotAvail.push_back(RequiredID); } // All Required analyses should be available to the pass as it runs! Here diff --git a/llvm/lib/IR/Pass.cpp b/llvm/lib/IR/Pass.cpp --- a/llvm/lib/IR/Pass.cpp +++ b/llvm/lib/IR/Pass.cpp @@ -259,22 +259,23 @@ AnalysisUsage &AnalysisUsage::addPreserved(StringRef Arg) { const PassInfo *PI = Pass::lookupPassInfo(Arg); // If the pass exists, preserve it. Otherwise silently do nothing. - if (PI) Preserved.push_back(PI->getTypeInfo()); + if (PI) + pushUnique(Preserved, PI->getTypeInfo()); return *this; } AnalysisUsage &AnalysisUsage::addRequiredID(const void *ID) { - Required.push_back(ID); + pushUnique(Required, ID); return *this; } AnalysisUsage &AnalysisUsage::addRequiredID(char &ID) { - Required.push_back(&ID); + pushUnique(Required, &ID); return *this; } AnalysisUsage &AnalysisUsage::addRequiredTransitiveID(char &ID) { - Required.push_back(&ID); - RequiredTransitive.push_back(&ID); + pushUnique(Required, &ID); + pushUnique(RequiredTransitive, &ID); return *this; }