#if !defined(LLVM_PASS_H) || defined(LLVM_PASSANALYSISSUPPORT_H)
#error "Do not include <PassAnalysisSupport.h>; include <Pass.h> instead"
-#endif
+#endif
#ifndef LLVM_PASSANALYSISSUPPORT_H
#define LLVM_PASSANALYSISSUPPORT_H
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include <cassert>
#include <tuple>
SmallVector<AnalysisID, 0> Used;
bool PreservesAll = false;
+ void pushUnique(VectorType &Set, AnalysisID ID) {
+ if (!llvm::is_contained(Set, ID))
+ Set.push_back(ID);
+ }
+
public:
AnalysisUsage() = default;
///@{
/// 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<class PassClass>
AnalysisUsage &addPreserved() {
- Preserved.push_back(&PassClass::ID);
+ pushUnique(Preserved, &PassClass::ID);
return *this;
}
///@}
/// 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<class PassClass>
AnalysisUsage &addUsedIfAvailable() {
- Used.push_back(&PassClass::ID);
+ pushUnique(Used, &PassClass::ID);
return *this;
}
///@}
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
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;
}