140 changes: 75 additions & 65 deletions llvm/include/llvm/IR/PassManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@

namespace llvm {

/// A special type used by analysis passes to provide an address that
/// identifies that particular analysis pass type.
///
/// Analysis passes should have a static data member of this type and derive
/// from the \c AnalysisInfoMixin to get a static ID method used to identify
/// the analysis in the pass management infrastructure.
struct alignas(8) AnalysisKey {};

/// \brief An abstract set of preserved analyses following a transformation pass
/// run.
///
Expand All @@ -71,17 +79,17 @@ class PreservedAnalyses {
/// \brief Construct a special preserved set that preserves all passes.
static PreservedAnalyses all() {
PreservedAnalyses PA;
PA.PreservedPassIDs.insert((void *)AllPassesID);
PA.PreservedAnalysisIDs.insert(&AllAnalysesKey);
return PA;
}

/// \brief Mark a particular pass as preserved, adding it to the set.
template <typename PassT> void preserve() { preserve(PassT::ID()); }

/// \brief Mark an abstract PassID as preserved, adding it to the set.
void preserve(void *PassID) {
/// \brief Mark an abstract ID as preserved, adding it to the set.
void preserve(AnalysisKey *ID) {
if (!areAllPreserved())
PreservedPassIDs.insert(PassID);
PreservedAnalysisIDs.insert(ID);
}

/// \brief Intersect this set with another in place.
Expand All @@ -92,12 +100,12 @@ class PreservedAnalyses {
if (Arg.areAllPreserved())
return;
if (areAllPreserved()) {
PreservedPassIDs = Arg.PreservedPassIDs;
PreservedAnalysisIDs = Arg.PreservedAnalysisIDs;
return;
}
for (void *P : PreservedPassIDs)
if (!Arg.PreservedPassIDs.count(P))
PreservedPassIDs.erase(P);
for (auto ID : PreservedAnalysisIDs)
if (!Arg.PreservedAnalysisIDs.count(ID))
PreservedAnalysisIDs.erase(ID);
}

/// \brief Intersect this set with a temporary other set in place.
Expand All @@ -108,12 +116,12 @@ class PreservedAnalyses {
if (Arg.areAllPreserved())
return;
if (areAllPreserved()) {
PreservedPassIDs = std::move(Arg.PreservedPassIDs);
PreservedAnalysisIDs = std::move(Arg.PreservedAnalysisIDs);
return;
}
for (void *P : PreservedPassIDs)
if (!Arg.PreservedPassIDs.count(P))
PreservedPassIDs.erase(P);
for (auto ID : PreservedAnalysisIDs)
if (!Arg.PreservedAnalysisIDs.count(ID))
PreservedAnalysisIDs.erase(ID);
}

/// \brief Query whether a pass is marked as preserved by this set.
Expand All @@ -123,17 +131,17 @@ class PreservedAnalyses {

/// \brief Query whether an abstract pass ID is marked as preserved by this
/// set.
bool preserved(void *PassID) const {
return PreservedPassIDs.count((void *)AllPassesID) ||
PreservedPassIDs.count(PassID);
bool preserved(AnalysisKey *ID) const {
return PreservedAnalysisIDs.count(&AllAnalysesKey) ||
PreservedAnalysisIDs.count(ID);
}

/// \brief Query whether all of the analyses in the set are preserved.
bool preserved(PreservedAnalyses Arg) {
if (Arg.areAllPreserved())
return areAllPreserved();
for (void *P : Arg.PreservedPassIDs)
if (!preserved(P))
for (auto ID : Arg.PreservedAnalysisIDs)
if (!preserved(ID))
return false;
return true;
}
Expand All @@ -143,15 +151,14 @@ class PreservedAnalyses {
/// This is used primarily to optimize for the case of no changes which will
/// common in many scenarios.
bool areAllPreserved() const {
return PreservedPassIDs.count((void *)AllPassesID);
return PreservedAnalysisIDs.count(&AllAnalysesKey);
}

private:
// Note that this must not be -1 or -2 as those are already used by the
// SmallPtrSet.
static const uintptr_t AllPassesID = (intptr_t)(-3);
// A special key used to indicate all analyses.
static AnalysisKey AllAnalysesKey;

SmallPtrSet<void *, 2> PreservedPassIDs;
SmallPtrSet<AnalysisKey *, 2> PreservedAnalysisIDs;
};

// Forward declare the analysis manager template.
Expand Down Expand Up @@ -179,10 +186,14 @@ template <typename DerivedT> struct PassInfoMixin {
/// specifically used for analyses.
template <typename DerivedT>
struct AnalysisInfoMixin : PassInfoMixin<DerivedT> {
/// Returns an opaque, unique ID for this pass type.
/// Returns an opaque, unique ID for this analysis type.
///
/// This ID is a pointer type that is guaranteed to be 8-byte aligned and
/// thus suitable for use in sets, maps, and other data structures optimized
/// for pointer-like types using the alignment-provided low bits.
///
/// Note that this requires the derived type provide a static member whose
/// address can be converted to a void pointer.
/// Note that this requires the derived type provide a static \c AnalysisKey
/// member called \c Key.
///
/// FIXME: The only reason the derived type needs to provide this rather than
/// this mixin providing it is due to broken implementations which cannot
Expand All @@ -191,8 +202,8 @@ struct AnalysisInfoMixin : PassInfoMixin<DerivedT> {
/// instantiation. The only currently known platform with this limitation are
/// Windows DLL builds, specifically building each part of LLVM as a DLL. If
/// we ever remove that build configuration, this mixin can provide the
/// static PassID as well.
static void *ID() { return (void *)&DerivedT::PassID; }
/// static key as well.
static AnalysisKey *ID() { return &DerivedT::Key; }
};

/// A class template to provide analysis sets for IR units.
Expand All @@ -205,17 +216,17 @@ struct AnalysisInfoMixin : PassInfoMixin<DerivedT> {
///
/// Note that you must provide an explicit instantiation declaration and
/// definition for this template in order to get the correct behavior on
/// Windows. Otherwise, the address of SetID will not be stable.
/// Windows. Otherwise, the address of SetKey will not be stable.
template <typename IRUnitT>
class AllAnalysesOn {
public:
static void *ID() { return (void *)&SetID; }
static AnalysisKey *ID() { return &SetKey; }

private:
static char SetID;
static AnalysisKey SetKey;
};

template <typename IRUnitT> char AllAnalysesOn<IRUnitT>::SetID;
template <typename IRUnitT> AnalysisKey AllAnalysesOn<IRUnitT>::SetKey;

extern template class AllAnalysesOn<Module>;
extern template class AllAnalysesOn<Function>;
Expand Down Expand Up @@ -363,13 +374,13 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {

// Clear all the invalidated results associated specifically with this
// function.
SmallVector<void *, 8> InvalidatedPassIDs;
SmallVector<AnalysisKey *, 8> InvalidatedIDs;
auto ResultsListI = AnalysisResultLists.find(&IR);
if (ResultsListI == AnalysisResultLists.end())
return;
// Clear the map pointing into the results list.
for (auto &PassIDAndResult : ResultsListI->second)
AnalysisResults.erase(std::make_pair(PassIDAndResult.first, &IR));
for (auto &IDAndResult : ResultsListI->second)
AnalysisResults.erase(std::make_pair(IDAndResult.first, &IR));

// And actually destroy and erase the results associated with this IR.
AnalysisResultLists.erase(ResultsListI);
Expand Down Expand Up @@ -479,22 +490,22 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {

// Clear all the invalidated results associated specifically with this
// function.
SmallVector<void *, 8> InvalidatedPassIDs;
SmallVector<AnalysisKey *, 8> InvalidatedIDs;
AnalysisResultListT &ResultsList = AnalysisResultLists[&IR];
for (typename AnalysisResultListT::iterator I = ResultsList.begin(),
E = ResultsList.end();
I != E;) {
void *PassID = I->first;
AnalysisKey *ID = I->first;

// Pass the invalidation down to the pass itself to see if it thinks it is
// necessary. The analysis pass can return false if no action on the part
// of the analysis manager is required for this invalidation event.
if (I->second->invalidate(IR, PA)) {
if (DebugLogging)
dbgs() << "Invalidating analysis: " << this->lookupPass(PassID).name()
dbgs() << "Invalidating analysis: " << this->lookupPass(ID).name()
<< "\n";

InvalidatedPassIDs.push_back(I->first);
InvalidatedIDs.push_back(I->first);
I = ResultsList.erase(I);
} else {
++I;
Expand All @@ -503,11 +514,10 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {
// After handling each pass, we mark it as preserved. Once we've
// invalidated any stale results, the rest of the system is allowed to
// start preserving this analysis again.
PA.preserve(PassID);
PA.preserve(ID);
}
while (!InvalidatedPassIDs.empty())
AnalysisResults.erase(
std::make_pair(InvalidatedPassIDs.pop_back_val(), &IR));
while (!InvalidatedIDs.empty())
AnalysisResults.erase(std::make_pair(InvalidatedIDs.pop_back_val(), &IR));
if (ResultsList.empty())
AnalysisResultLists.erase(&IR);

Expand All @@ -516,41 +526,41 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {

private:
/// \brief Lookup a registered analysis pass.
PassConceptT &lookupPass(void *PassID) {
typename AnalysisPassMapT::iterator PI = AnalysisPasses.find(PassID);
PassConceptT &lookupPass(AnalysisKey *ID) {
typename AnalysisPassMapT::iterator PI = AnalysisPasses.find(ID);
assert(PI != AnalysisPasses.end() &&
"Analysis passes must be registered prior to being queried!");
return *PI->second;
}

/// \brief Lookup a registered analysis pass.
const PassConceptT &lookupPass(void *PassID) const {
typename AnalysisPassMapT::const_iterator PI = AnalysisPasses.find(PassID);
const PassConceptT &lookupPass(AnalysisKey *ID) const {
typename AnalysisPassMapT::const_iterator PI = AnalysisPasses.find(ID);
assert(PI != AnalysisPasses.end() &&
"Analysis passes must be registered prior to being queried!");
return *PI->second;
}

/// \brief Get an analysis result, running the pass if necessary.
ResultConceptT &getResultImpl(void *PassID, IRUnitT &IR,
ResultConceptT &getResultImpl(AnalysisKey *ID, IRUnitT &IR,
ExtraArgTs... ExtraArgs) {
typename AnalysisResultMapT::iterator RI;
bool Inserted;
std::tie(RI, Inserted) = AnalysisResults.insert(std::make_pair(
std::make_pair(PassID, &IR), typename AnalysisResultListT::iterator()));
std::make_pair(ID, &IR), typename AnalysisResultListT::iterator()));

// If we don't have a cached result for this function, look up the pass and
// run it to produce a result, which we then add to the cache.
if (Inserted) {
auto &P = this->lookupPass(PassID);
auto &P = this->lookupPass(ID);
if (DebugLogging)
dbgs() << "Running analysis: " << P.name() << "\n";
AnalysisResultListT &ResultList = AnalysisResultLists[&IR];
ResultList.emplace_back(PassID, P.run(IR, *this, ExtraArgs...));
ResultList.emplace_back(ID, P.run(IR, *this, ExtraArgs...));

// P.run may have inserted elements into AnalysisResults and invalidated
// RI.
RI = AnalysisResults.find(std::make_pair(PassID, &IR));
RI = AnalysisResults.find(std::make_pair(ID, &IR));
assert(RI != AnalysisResults.end() && "we just inserted it!");

RI->second = std::prev(ResultList.end());
Expand All @@ -560,28 +570,28 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {
}

/// \brief Get a cached analysis result or return null.
ResultConceptT *getCachedResultImpl(void *PassID, IRUnitT &IR) const {
ResultConceptT *getCachedResultImpl(AnalysisKey *ID, IRUnitT &IR) const {
typename AnalysisResultMapT::const_iterator RI =
AnalysisResults.find(std::make_pair(PassID, &IR));
AnalysisResults.find(std::make_pair(ID, &IR));
return RI == AnalysisResults.end() ? nullptr : &*RI->second->second;
}

/// \brief Invalidate a function pass result.
void invalidateImpl(void *PassID, IRUnitT &IR) {
void invalidateImpl(AnalysisKey *ID, IRUnitT &IR) {
typename AnalysisResultMapT::iterator RI =
AnalysisResults.find(std::make_pair(PassID, &IR));
AnalysisResults.find(std::make_pair(ID, &IR));
if (RI == AnalysisResults.end())
return;

if (DebugLogging)
dbgs() << "Invalidating analysis: " << this->lookupPass(PassID).name()
dbgs() << "Invalidating analysis: " << this->lookupPass(ID).name()
<< "\n";
AnalysisResultLists[&IR].erase(RI->second);
AnalysisResults.erase(RI);
}

/// \brief Map type from module analysis pass ID to pass concept pointer.
typedef DenseMap<void *, std::unique_ptr<PassConceptT>> AnalysisPassMapT;
typedef DenseMap<AnalysisKey *, std::unique_ptr<PassConceptT>> AnalysisPassMapT;

/// \brief Collection of module analysis passes, indexed by ID.
AnalysisPassMapT AnalysisPasses;
Expand All @@ -592,7 +602,7 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {
/// erases. Provides both the pass ID and concept pointer such that it is
/// half of a bijection and provides storage for the actual result concept.
typedef std::list<std::pair<
void *, std::unique_ptr<detail::AnalysisResultConcept<IRUnitT>>>>
AnalysisKey *, std::unique_ptr<detail::AnalysisResultConcept<IRUnitT>>>>
AnalysisResultListT;

/// \brief Map type from function pointer to our custom list type.
Expand All @@ -606,7 +616,7 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {

/// \brief Map type from a pair of analysis ID and function pointer to an
/// iterator into a particular result list.
typedef DenseMap<std::pair<void *, IRUnitT *>,
typedef DenseMap<std::pair<AnalysisKey *, IRUnitT *>,
typename AnalysisResultListT::iterator>
AnalysisResultMapT;

Expand Down Expand Up @@ -718,14 +728,14 @@ class InnerAnalysisManagerProxy
private:
friend AnalysisInfoMixin<
InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT>>;
static char PassID;
static AnalysisKey Key;

AnalysisManagerT *AM;
};

template <typename AnalysisManagerT, typename IRUnitT, typename... ExtraArgTs>
char
InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT, ExtraArgTs...>::PassID;
AnalysisKey
InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT, ExtraArgTs...>::Key;

extern template class InnerAnalysisManagerProxy<FunctionAnalysisManager,
Module>;
Expand Down Expand Up @@ -777,14 +787,14 @@ class OuterAnalysisManagerProxy
private:
friend AnalysisInfoMixin<
OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT>>;
static char PassID;
static AnalysisKey Key;

const AnalysisManagerT *AM;
};

template <typename AnalysisManagerT, typename IRUnitT, typename... ExtraArgTs>
char
OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT, ExtraArgTs...>::PassID;
AnalysisKey
OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT, ExtraArgTs...>::Key;

extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
Function>;
Expand Down
3 changes: 1 addition & 2 deletions llvm/include/llvm/IR/Verifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,12 @@ FunctionPass *createVerifierPass(bool FatalErrors = true);
/// and debug info errors.
class VerifierAnalysis : public AnalysisInfoMixin<VerifierAnalysis> {
friend AnalysisInfoMixin<VerifierAnalysis>;
static char PassID;
static AnalysisKey Key;

public:
struct Result {
bool IRBroken, DebugInfoBroken;
};
static void *ID() { return (void *)&PassID; }
Result run(Module &M, ModuleAnalysisManager &);
Result run(Function &F, FunctionAnalysisManager &);
};
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/Transforms/Utils/MemorySSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ class MemorySSAPrinterLegacyPass : public FunctionPass {
///
class MemorySSAAnalysis : public AnalysisInfoMixin<MemorySSAAnalysis> {
friend AnalysisInfoMixin<MemorySSAAnalysis>;
static char PassID;
static AnalysisKey Key;

public:
// Wrap MemorySSA result to ensure address stability of internal MemorySSA
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/AliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ bool AAResults::canInstructionRangeModRef(const Instruction &I1,
AAResults::Concept::~Concept() {}

// Provide a definition for the static object used to identify passes.
char AAManager::PassID;
AnalysisKey AAManager::Key;

namespace {
/// A wrapper pass for external alias analyses. This just squirrels away the
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/AssumptionCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ void AssumptionCache::registerAssumption(CallInst *CI) {
#endif
}

char AssumptionAnalysis::PassID;
AnalysisKey AssumptionAnalysis::Key;

PreservedAnalyses AssumptionPrinterPass::run(Function &F,
FunctionAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/BasicAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1715,7 +1715,7 @@ bool BasicAAResult::constantOffsetHeuristic(
// BasicAliasAnalysis Pass
//===----------------------------------------------------------------------===//

char BasicAA::PassID;
AnalysisKey BasicAA::Key;

BasicAAResult BasicAA::run(Function &F, FunctionAnalysisManager &AM) {
return BasicAAResult(F.getParent()->getDataLayout(),
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/BlockFrequencyInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ bool BlockFrequencyInfoWrapperPass::runOnFunction(Function &F) {
return false;
}

char BlockFrequencyAnalysis::PassID;
AnalysisKey BlockFrequencyAnalysis::Key;
BlockFrequencyInfo BlockFrequencyAnalysis::run(Function &F,
FunctionAnalysisManager &AM) {
BlockFrequencyInfo BFI;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/BranchProbabilityInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -711,7 +711,7 @@ void BranchProbabilityInfoWrapperPass::print(raw_ostream &OS,
BPI.print(OS);
}

char BranchProbabilityAnalysis::PassID;
AnalysisKey BranchProbabilityAnalysis::Key;
BranchProbabilityInfo
BranchProbabilityAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
BranchProbabilityInfo BPI;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/CFLAndersAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -865,7 +865,7 @@ AliasResult CFLAndersAAResult::alias(const MemoryLocation &LocA,
return QueryResult;
}

char CFLAndersAA::PassID;
AnalysisKey CFLAndersAA::Key;

CFLAndersAAResult CFLAndersAA::run(Function &F, FunctionAnalysisManager &AM) {
return CFLAndersAAResult(AM.getResult<TargetLibraryAnalysis>(F));
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/CFLSteensAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ AliasResult CFLSteensAAResult::query(const MemoryLocation &LocA,
return NoAlias;
}

char CFLSteensAA::PassID;
AnalysisKey CFLSteensAA::Key;

CFLSteensAAResult CFLSteensAA::run(Function &F, FunctionAnalysisManager &AM) {
return CFLSteensAAResult(AM.getResult<TargetLibraryAnalysis>(F));
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/CallGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ void CallGraphNode::replaceCallEdge(CallSite CS,
}

// Provide an explicit template instantiation for the static ID.
char CallGraphAnalysis::PassID;
AnalysisKey CallGraphAnalysis::Key;

PreservedAnalyses CallGraphPrinterPass::run(Module &M,
ModuleAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/DemandedBits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ FunctionPass *llvm::createDemandedBitsWrapperPass() {
return new DemandedBitsWrapperPass();
}

char DemandedBitsAnalysis::PassID;
AnalysisKey DemandedBitsAnalysis::Key;

DemandedBits DemandedBitsAnalysis::run(Function &F,
FunctionAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/DependenceAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ DependenceAnalysis::run(Function &F, FunctionAnalysisManager &FAM) {
return DependenceInfo(&F, &AA, &SE, &LI);
}

char DependenceAnalysis::PassID;
AnalysisKey DependenceAnalysis::Key;

INITIALIZE_PASS_BEGIN(DependenceAnalysisWrapperPass, "da",
"Dependence Analysis", true, true)
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/DominanceFrontier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ LLVM_DUMP_METHOD void DominanceFrontierWrapperPass::dump() const {
}
#endif

char DominanceFrontierAnalysis::PassID;
AnalysisKey DominanceFrontierAnalysis::Key;

DominanceFrontier DominanceFrontierAnalysis::run(Function &F,
FunctionAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/GlobalsModRef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -941,7 +941,7 @@ GlobalsAAResult::analyzeModule(Module &M, const TargetLibraryInfo &TLI,
return Result;
}

char GlobalsAA::PassID;
AnalysisKey GlobalsAA::Key;

GlobalsAAResult GlobalsAA::run(Module &M, ModuleAnalysisManager &AM) {
return GlobalsAAResult::analyzeModule(M,
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/IVUsers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ using namespace llvm;

#define DEBUG_TYPE "iv-users"

char IVUsersAnalysis::PassID;
AnalysisKey IVUsersAnalysis::Key;

IVUsers IVUsersAnalysis::run(Loop &L, LoopAnalysisManager &AM) {
const auto &FAM =
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/LazyCallGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1833,7 +1833,7 @@ bool LazyCallGraph::buildNextRefSCCInPostOrder() {
}
}

char LazyCallGraphAnalysis::PassID;
AnalysisKey LazyCallGraphAnalysis::Key;

LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/LazyValueInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ namespace llvm {
FunctionPass *createLazyValueInfoPass() { return new LazyValueInfoWrapperPass(); }
}

char LazyValueAnalysis::PassID;
AnalysisKey LazyValueAnalysis::Key;

//===----------------------------------------------------------------------===//
// LVILatticeVal
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/LoopAccessAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2067,7 +2067,7 @@ INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
INITIALIZE_PASS_END(LoopAccessLegacyAnalysis, LAA_NAME, laa_name, false, true)

char LoopAccessAnalysis::PassID;
AnalysisKey LoopAccessAnalysis::Key;

LoopAccessInfo LoopAccessAnalysis::run(Loop &L, LoopAnalysisManager &AM) {
const FunctionAnalysisManager &FAM =
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/LoopInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,7 @@ void LoopInfo::markAsRemoved(Loop *Unloop) {
}
}

char LoopAnalysis::PassID;
AnalysisKey LoopAnalysis::Key;

LoopInfo LoopAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
// FIXME: Currently we create a LoopInfo from scratch for every function.
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1643,7 +1643,7 @@ void MemoryDependenceResults::verifyRemoved(Instruction *D) const {
#endif
}

char MemoryDependenceAnalysis::PassID;
AnalysisKey MemoryDependenceAnalysis::Key;

MemoryDependenceResults
MemoryDependenceAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
return Index;
}

char ModuleSummaryIndexAnalysis::PassID;
AnalysisKey ModuleSummaryIndexAnalysis::Key;

ModuleSummaryIndex
ModuleSummaryIndexAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ void OptimizationRemarkEmitterWrapperPass::getAnalysisUsage(
AU.setPreservesAll();
}

char OptimizationRemarkEmitterAnalysis::PassID;
AnalysisKey OptimizationRemarkEmitterAnalysis::Key;

OptimizationRemarkEmitter
OptimizationRemarkEmitterAnalysis::run(Function &F,
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/PostDominators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ FunctionPass* llvm::createPostDomTree() {
return new PostDominatorTreeWrapperPass();
}

char PostDominatorTreeAnalysis::PassID;
AnalysisKey PostDominatorTreeAnalysis::Key;

PostDominatorTree PostDominatorTreeAnalysis::run(Function &F,
FunctionAnalysisManager &) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/ProfileSummaryInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ bool ProfileSummaryInfoWrapperPass::doFinalization(Module &M) {
return false;
}

char ProfileSummaryAnalysis::PassID;
AnalysisKey ProfileSummaryAnalysis::Key;
ProfileSummaryInfo ProfileSummaryAnalysis::run(Module &M,
ModuleAnalysisManager &) {
return ProfileSummaryInfo(M);
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/RegionInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ namespace llvm {
// RegionInfoAnalysis implementation
//

char RegionInfoAnalysis::PassID;
AnalysisKey RegionInfoAnalysis::Key;

RegionInfo RegionInfoAnalysis::run(Function &F, FunctionAnalysisManager &AM) {
RegionInfo RI;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/ScalarEvolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10013,7 +10013,7 @@ void ScalarEvolution::verify() const {
// TODO: Verify more things.
}

char ScalarEvolutionAnalysis::PassID;
AnalysisKey ScalarEvolutionAnalysis::Key;

ScalarEvolution ScalarEvolutionAnalysis::run(Function &F,
FunctionAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ Value *SCEVAAResult::GetBaseValue(const SCEV *S) {
return nullptr;
}

char SCEVAA::PassID;
AnalysisKey SCEVAA::Key;

SCEVAAResult SCEVAA::run(Function &F, FunctionAnalysisManager &AM) {
return SCEVAAResult(AM.getResult<ScalarEvolutionAnalysis>(F));
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/ScopedNoAliasAA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ bool ScopedNoAliasAAResult::mayAliasInScopes(const MDNode *Scopes,
return true;
}

char ScopedNoAliasAA::PassID;
AnalysisKey ScopedNoAliasAA::Key;

ScopedNoAliasAAResult ScopedNoAliasAA::run(Function &F,
FunctionAnalysisManager &AM) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/TargetLibraryInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1265,7 +1265,7 @@ TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass(
initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
}

char TargetLibraryAnalysis::PassID;
AnalysisKey TargetLibraryAnalysis::Key;

// Register the basic pass.
INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/TargetTransformInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ TargetIRAnalysis::Result TargetIRAnalysis::run(const Function &F,
return TTICallback(F);
}

char TargetIRAnalysis::PassID;
AnalysisKey TargetIRAnalysis::Key;

TargetIRAnalysis::Result TargetIRAnalysis::getDefaultTTI(const Function &F) {
return Result(F.getParent()->getDataLayout());
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -550,7 +550,7 @@ bool TypeBasedAAResult::Aliases(const MDNode *A, const MDNode *B) const {
return false;
}

char TypeBasedAA::PassID;
AnalysisKey TypeBasedAA::Key;

TypeBasedAAResult TypeBasedAA::run(Function &F, FunctionAnalysisManager &AM) {
return TypeBasedAAResult();
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/IR/Dominators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ DominatorTree DominatorTreeAnalysis::run(Function &F,
return DT;
}

char DominatorTreeAnalysis::PassID;
AnalysisKey DominatorTreeAnalysis::Key;

DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {}

Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/IR/PassManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,5 @@ template class AnalysisManager<Function>;
template class InnerAnalysisManagerProxy<FunctionAnalysisManager, Module>;
template class OuterAnalysisManagerProxy<ModuleAnalysisManager, Function>;
}

AnalysisKey PreservedAnalyses::AllAnalysesKey;
2 changes: 1 addition & 1 deletion llvm/lib/IR/Verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4473,7 +4473,7 @@ FunctionPass *llvm::createVerifierPass(bool FatalErrors) {
return new VerifierLegacyPass(FatalErrors);
}

char VerifierAnalysis::PassID;
AnalysisKey VerifierAnalysis::Key;
VerifierAnalysis::Result VerifierAnalysis::run(Module &M,
ModuleAnalysisManager &) {
Result Res;
Expand Down
16 changes: 8 additions & 8 deletions llvm/lib/Passes/PassBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ struct NoOpModulePass {
/// \brief No-op module analysis.
class NoOpModuleAnalysis : public AnalysisInfoMixin<NoOpModuleAnalysis> {
friend AnalysisInfoMixin<NoOpModuleAnalysis>;
static char PassID;
static AnalysisKey Key;

public:
struct Result {};
Expand All @@ -172,7 +172,7 @@ struct NoOpCGSCCPass {
/// \brief No-op CGSCC analysis.
class NoOpCGSCCAnalysis : public AnalysisInfoMixin<NoOpCGSCCAnalysis> {
friend AnalysisInfoMixin<NoOpCGSCCAnalysis>;
static char PassID;
static AnalysisKey Key;

public:
struct Result {};
Expand All @@ -193,7 +193,7 @@ struct NoOpFunctionPass {
/// \brief No-op function analysis.
class NoOpFunctionAnalysis : public AnalysisInfoMixin<NoOpFunctionAnalysis> {
friend AnalysisInfoMixin<NoOpFunctionAnalysis>;
static char PassID;
static AnalysisKey Key;

public:
struct Result {};
Expand All @@ -212,18 +212,18 @@ struct NoOpLoopPass {
/// \brief No-op loop analysis.
class NoOpLoopAnalysis : public AnalysisInfoMixin<NoOpLoopAnalysis> {
friend AnalysisInfoMixin<NoOpLoopAnalysis>;
static char PassID;
static AnalysisKey Key;

public:
struct Result {};
Result run(Loop &, LoopAnalysisManager &) { return Result(); }
static StringRef name() { return "NoOpLoopAnalysis"; }
};

char NoOpModuleAnalysis::PassID;
char NoOpCGSCCAnalysis::PassID;
char NoOpFunctionAnalysis::PassID;
char NoOpLoopAnalysis::PassID;
AnalysisKey NoOpModuleAnalysis::Key;
AnalysisKey NoOpCGSCCAnalysis::Key;
AnalysisKey NoOpFunctionAnalysis::Key;
AnalysisKey NoOpLoopAnalysis::Key;

} // End anonymous namespace.

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/Utils/MemorySSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2067,7 +2067,7 @@ bool MemorySSAPrinterLegacyPass::runOnFunction(Function &F) {
return false;
}

char MemorySSAAnalysis::PassID;
AnalysisKey MemorySSAAnalysis::Key;

MemorySSAAnalysis::Result MemorySSAAnalysis::run(Function &F,
FunctionAnalysisManager &AM) {
Expand Down
41 changes: 17 additions & 24 deletions llvm/unittests/Analysis/CGSCCPassManagerTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,13 @@ using namespace llvm;

namespace {

class TestModuleAnalysis {
class TestModuleAnalysis : public AnalysisInfoMixin<TestModuleAnalysis> {
public:
struct Result {
Result(int Count) : FunctionCount(Count) {}
int FunctionCount;
};

static void *ID() { return (void *)&PassID; }
static StringRef name() { return "TestModuleAnalysis"; }

TestModuleAnalysis(int &Runs) : Runs(Runs) {}

Result run(Module &M, ModuleAnalysisManager &AM) {
Expand All @@ -40,23 +37,21 @@ class TestModuleAnalysis {
}

private:
static char PassID;
friend AnalysisInfoMixin<TestModuleAnalysis>;
static AnalysisKey Key;

int &Runs;
};

char TestModuleAnalysis::PassID;
AnalysisKey TestModuleAnalysis::Key;

class TestSCCAnalysis {
class TestSCCAnalysis : public AnalysisInfoMixin<TestSCCAnalysis> {
public:
struct Result {
Result(int Count) : FunctionCount(Count) {}
int FunctionCount;
};

static void *ID() { return (void *)&PassID; }
static StringRef name() { return "TestSCCAnalysis"; }

TestSCCAnalysis(int &Runs) : Runs(Runs) {}

Result run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, LazyCallGraph &) {
Expand All @@ -65,23 +60,21 @@ class TestSCCAnalysis {
}

private:
static char PassID;
friend AnalysisInfoMixin<TestSCCAnalysis>;
static AnalysisKey Key;

int &Runs;
};

char TestSCCAnalysis::PassID;
AnalysisKey TestSCCAnalysis::Key;

class TestFunctionAnalysis {
class TestFunctionAnalysis : public AnalysisInfoMixin<TestFunctionAnalysis> {
public:
struct Result {
Result(int Count) : InstructionCount(Count) {}
int InstructionCount;
};

static void *ID() { return (void *)&PassID; }
static StringRef name() { return "TestFunctionAnalysis"; }

TestFunctionAnalysis(int &Runs) : Runs(Runs) {}

Result run(Function &F, FunctionAnalysisManager &AM) {
Expand All @@ -95,22 +88,21 @@ class TestFunctionAnalysis {
}

private:
static char PassID;
friend AnalysisInfoMixin<TestFunctionAnalysis>;
static AnalysisKey Key;

int &Runs;
};

char TestFunctionAnalysis::PassID;
AnalysisKey TestFunctionAnalysis::Key;

class TestImmutableFunctionAnalysis {
class TestImmutableFunctionAnalysis
: public AnalysisInfoMixin<TestImmutableFunctionAnalysis> {
public:
struct Result {
bool invalidate(Function &, const PreservedAnalyses &) { return false; }
};

static void *ID() { return (void *)&PassID; }
static StringRef name() { return "TestImmutableFunctionAnalysis"; }

TestImmutableFunctionAnalysis(int &Runs) : Runs(Runs) {}

Result run(Function &F, FunctionAnalysisManager &AM) {
Expand All @@ -119,12 +111,13 @@ class TestImmutableFunctionAnalysis {
}

private:
static char PassID;
friend AnalysisInfoMixin<TestImmutableFunctionAnalysis>;
static AnalysisKey Key;

int &Runs;
};

char TestImmutableFunctionAnalysis::PassID;
AnalysisKey TestImmutableFunctionAnalysis::Key;

struct LambdaSCCPass : public PassInfoMixin<LambdaSCCPass> {
template <typename T> LambdaSCCPass(T &&Arg) : Func(std::forward<T>(Arg)) {}
Expand Down
14 changes: 4 additions & 10 deletions llvm/unittests/Analysis/LoopPassManagerTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ using namespace llvm;

namespace {

class TestLoopAnalysis {
/// \brief Private static data to provide unique ID.
static char PassID;
class TestLoopAnalysis : public AnalysisInfoMixin<TestLoopAnalysis> {
friend AnalysisInfoMixin<TestLoopAnalysis>;
static AnalysisKey Key;

int &Runs;

Expand All @@ -33,12 +33,6 @@ class TestLoopAnalysis {
int BlockCount;
};

/// \brief Returns an opaque, unique ID for this pass type.
static void *ID() { return (void *)&PassID; }

/// \brief Returns the name of the analysis.
static StringRef name() { return "TestLoopAnalysis"; }

TestLoopAnalysis(int &Runs) : Runs(Runs) {}

/// \brief Run the analysis pass over the loop and return a result.
Expand All @@ -52,7 +46,7 @@ class TestLoopAnalysis {
}
};

char TestLoopAnalysis::PassID;
AnalysisKey TestLoopAnalysis::Key;

class TestLoopPass {
std::vector<StringRef> &VisitedLoops;
Expand Down
12 changes: 6 additions & 6 deletions llvm/unittests/IR/PassManagerTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ class TestFunctionAnalysis : public AnalysisInfoMixin<TestFunctionAnalysis> {

private:
friend AnalysisInfoMixin<TestFunctionAnalysis>;
static char PassID;
static AnalysisKey Key;

int &Runs;
};

char TestFunctionAnalysis::PassID;
AnalysisKey TestFunctionAnalysis::Key;

class TestModuleAnalysis : public AnalysisInfoMixin<TestModuleAnalysis> {
public:
Expand All @@ -67,12 +67,12 @@ class TestModuleAnalysis : public AnalysisInfoMixin<TestModuleAnalysis> {

private:
friend AnalysisInfoMixin<TestModuleAnalysis>;
static char PassID;
static AnalysisKey Key;

int &Runs;
};

char TestModuleAnalysis::PassID;
AnalysisKey TestModuleAnalysis::Key;

struct TestModulePass : PassInfoMixin<TestModulePass> {
TestModulePass(int &RunCount) : RunCount(RunCount) {}
Expand Down Expand Up @@ -351,10 +351,10 @@ class CustomizedAnalysis : public AnalysisInfoMixin<CustomizedAnalysis> {

private:
friend AnalysisInfoMixin<CustomizedAnalysis>;
static char PassID;
static AnalysisKey Key;
};

char CustomizedAnalysis::PassID;
AnalysisKey CustomizedAnalysis::Key;

struct CustomizedPass : PassInfoMixin<CustomizedPass> {
std::function<void(CustomizedAnalysis::Result &, int &)> Callback;
Expand Down