From 33d568124ebac39d60ca249249fe8a880f59bee9 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Wed, 23 Nov 2016 17:53:26 +0000 Subject: [PATCH] [PM] Change the static object whose address is used to uniquely identify analyses to have a common type which is enforced rather than using a char object and a `void *` type when used as an identifier. This has a number of advantages. First, it at least helps some of the confusion raised in Justin Lebar's code review of why `void *` was being used everywhere by having a stronger type that connects to documentation about this. However, perhaps more importantly, it addresses a serious issue where the alignment of these pointer-like identifiers was unknown. This made it hard to use them in pointer-like data structures. We were already dodging this in dangerous ways to create the "all analyses" entry. In a subsequent patch I attempted to use these with TinyPtrVector and things fell apart in a very bad way. And it isn't just a compile time or type system issue. Worse than that, the actual alignment of these pointer-like opaque identifiers wasn't guaranteed to be a useful alignment as they were just characters. This change introduces a type to use as the "key" object whose address forms the opaque identifier. This both forces the objects to have proper alignment, and provides type checking that we get it right everywhere. It also makes the types somewhat less mysterious than `void *`. We could go one step further and introduce a truly opaque pointer-like type to return from the `ID()` static function rather than returning `AnalysisKey *`, but that didn't seem to be a clear win so this is just the initial change to get to a reliably typed and aligned object serving is a key for all the analyses. Thanks to Richard Smith and Justin Lebar for helping pick plausible names and avoid making this refactoring many times. =] And thanks to Sean for the super fast review! While here, I've tried to move away from the "PassID" nomenclature entirely as it wasn't really helping and is overloaded with old pass manager constructs. Now we have IDs for analyses, and key objects whose address can be used as IDs. Where possible and clear I've shortened this to just "ID". In a few places I kept "AnalysisID" to make it clear what was being identified. Differential Revision: https://reviews.llvm.org/D27031 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287783 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/AliasAnalysis.h | 2 +- include/llvm/Analysis/AssumptionCache.h | 2 +- include/llvm/Analysis/BasicAliasAnalysis.h | 2 +- include/llvm/Analysis/BlockFrequencyInfo.h | 2 +- include/llvm/Analysis/BranchProbabilityInfo.h | 2 +- .../llvm/Analysis/CFLAndersAliasAnalysis.h | 2 +- .../llvm/Analysis/CFLSteensAliasAnalysis.h | 2 +- include/llvm/Analysis/CallGraph.h | 2 +- include/llvm/Analysis/DemandedBits.h | 2 +- include/llvm/Analysis/DependenceAnalysis.h | 2 +- include/llvm/Analysis/DominanceFrontier.h | 2 +- include/llvm/Analysis/GlobalsModRef.h | 2 +- include/llvm/Analysis/IVUsers.h | 2 +- include/llvm/Analysis/LazyCallGraph.h | 2 +- include/llvm/Analysis/LazyValueInfo.h | 2 +- include/llvm/Analysis/LoopAccessAnalysis.h | 2 +- include/llvm/Analysis/LoopInfo.h | 2 +- .../llvm/Analysis/MemoryDependenceAnalysis.h | 2 +- include/llvm/Analysis/ModuleSummaryAnalysis.h | 2 +- include/llvm/Analysis/ObjCARCAliasAnalysis.h | 2 +- .../Analysis/OptimizationDiagnosticInfo.h | 2 +- include/llvm/Analysis/PostDominators.h | 2 +- include/llvm/Analysis/ProfileSummaryInfo.h | 2 +- include/llvm/Analysis/RegionInfo.h | 2 +- include/llvm/Analysis/ScalarEvolution.h | 2 +- .../Analysis/ScalarEvolutionAliasAnalysis.h | 2 +- include/llvm/Analysis/ScopedNoAliasAA.h | 2 +- include/llvm/Analysis/TargetLibraryInfo.h | 2 +- include/llvm/Analysis/TargetTransformInfo.h | 2 +- .../llvm/Analysis/TypeBasedAliasAnalysis.h | 2 +- include/llvm/IR/Dominators.h | 2 +- include/llvm/IR/PassManager.h | 140 ++++++++++-------- include/llvm/IR/Verifier.h | 3 +- include/llvm/Transforms/Utils/MemorySSA.h | 2 +- lib/Analysis/AliasAnalysis.cpp | 2 +- lib/Analysis/AssumptionCache.cpp | 2 +- lib/Analysis/BasicAliasAnalysis.cpp | 2 +- lib/Analysis/BlockFrequencyInfo.cpp | 2 +- lib/Analysis/BranchProbabilityInfo.cpp | 2 +- lib/Analysis/CFLAndersAliasAnalysis.cpp | 2 +- lib/Analysis/CFLSteensAliasAnalysis.cpp | 2 +- lib/Analysis/CallGraph.cpp | 2 +- lib/Analysis/DemandedBits.cpp | 2 +- lib/Analysis/DependenceAnalysis.cpp | 2 +- lib/Analysis/DominanceFrontier.cpp | 2 +- lib/Analysis/GlobalsModRef.cpp | 2 +- lib/Analysis/IVUsers.cpp | 2 +- lib/Analysis/LazyCallGraph.cpp | 2 +- lib/Analysis/LazyValueInfo.cpp | 2 +- lib/Analysis/LoopAccessAnalysis.cpp | 2 +- lib/Analysis/LoopInfo.cpp | 2 +- lib/Analysis/MemoryDependenceAnalysis.cpp | 2 +- lib/Analysis/ModuleSummaryAnalysis.cpp | 2 +- lib/Analysis/OptimizationDiagnosticInfo.cpp | 2 +- lib/Analysis/PostDominators.cpp | 2 +- lib/Analysis/ProfileSummaryInfo.cpp | 2 +- lib/Analysis/RegionInfo.cpp | 2 +- lib/Analysis/ScalarEvolution.cpp | 2 +- lib/Analysis/ScalarEvolutionAliasAnalysis.cpp | 2 +- lib/Analysis/ScopedNoAliasAA.cpp | 2 +- lib/Analysis/TargetLibraryInfo.cpp | 2 +- lib/Analysis/TargetTransformInfo.cpp | 2 +- lib/Analysis/TypeBasedAliasAnalysis.cpp | 2 +- lib/IR/Dominators.cpp | 2 +- lib/IR/PassManager.cpp | 2 + lib/IR/Verifier.cpp | 2 +- lib/Passes/PassBuilder.cpp | 16 +- lib/Transforms/Utils/MemorySSA.cpp | 2 +- unittests/Analysis/CGSCCPassManagerTest.cpp | 41 +++-- unittests/Analysis/LoopPassManagerTest.cpp | 14 +- unittests/IR/PassManagerTest.cpp | 12 +- 71 files changed, 177 insertions(+), 179 deletions(-) diff --git a/include/llvm/Analysis/AliasAnalysis.h b/include/llvm/Analysis/AliasAnalysis.h index d031665eee5..ff483f911ba 100644 --- a/include/llvm/Analysis/AliasAnalysis.h +++ b/include/llvm/Analysis/AliasAnalysis.h @@ -911,7 +911,7 @@ public: private: friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; SmallVector { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef AssumptionCache Result; diff --git a/include/llvm/Analysis/BasicAliasAnalysis.h b/include/llvm/Analysis/BasicAliasAnalysis.h index 00bee445888..f32f5660ea2 100644 --- a/include/llvm/Analysis/BasicAliasAnalysis.h +++ b/include/llvm/Analysis/BasicAliasAnalysis.h @@ -196,7 +196,7 @@ private: /// Analysis pass providing a never-invalidated alias analysis result. class BasicAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef BasicAAResult Result; diff --git a/include/llvm/Analysis/BlockFrequencyInfo.h b/include/llvm/Analysis/BlockFrequencyInfo.h index 5a06a797f52..562041d11fa 100644 --- a/include/llvm/Analysis/BlockFrequencyInfo.h +++ b/include/llvm/Analysis/BlockFrequencyInfo.h @@ -90,7 +90,7 @@ public: class BlockFrequencyAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief Provide the result typedef for this analysis pass. diff --git a/include/llvm/Analysis/BranchProbabilityInfo.h b/include/llvm/Analysis/BranchProbabilityInfo.h index 49a04700beb..14b7a7f529f 100644 --- a/include/llvm/Analysis/BranchProbabilityInfo.h +++ b/include/llvm/Analysis/BranchProbabilityInfo.h @@ -178,7 +178,7 @@ private: class BranchProbabilityAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief Provide the result typedef for this analysis pass. diff --git a/include/llvm/Analysis/CFLAndersAliasAnalysis.h b/include/llvm/Analysis/CFLAndersAliasAnalysis.h index adebfe9549f..df22e150c39 100644 --- a/include/llvm/Analysis/CFLAndersAliasAnalysis.h +++ b/include/llvm/Analysis/CFLAndersAliasAnalysis.h @@ -103,7 +103,7 @@ private: /// in particular to leverage invalidation to trigger re-computation. class CFLAndersAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef CFLAndersAAResult Result; diff --git a/include/llvm/Analysis/CFLSteensAliasAnalysis.h b/include/llvm/Analysis/CFLSteensAliasAnalysis.h index 4d697254eb3..e7ed94c9a66 100644 --- a/include/llvm/Analysis/CFLSteensAliasAnalysis.h +++ b/include/llvm/Analysis/CFLSteensAliasAnalysis.h @@ -122,7 +122,7 @@ private: /// in particular to leverage invalidation to trigger re-computation of sets. class CFLSteensAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef CFLSteensAAResult Result; diff --git a/include/llvm/Analysis/CallGraph.h b/include/llvm/Analysis/CallGraph.h index da2b889f3d1..4ecbaa75ac7 100644 --- a/include/llvm/Analysis/CallGraph.h +++ b/include/llvm/Analysis/CallGraph.h @@ -297,7 +297,7 @@ private: /// resulting data. class CallGraphAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief A formulaic typedef to inform clients of the result type. diff --git a/include/llvm/Analysis/DemandedBits.h b/include/llvm/Analysis/DemandedBits.h index 354a5b33895..c603274a716 100644 --- a/include/llvm/Analysis/DemandedBits.h +++ b/include/llvm/Analysis/DemandedBits.h @@ -89,7 +89,7 @@ public: /// An analysis that produces \c DemandedBits for a function. class DemandedBitsAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief Provide the result typedef for this analysis pass. diff --git a/include/llvm/Analysis/DependenceAnalysis.h b/include/llvm/Analysis/DependenceAnalysis.h index e8662173a5e..90f33b8c42e 100644 --- a/include/llvm/Analysis/DependenceAnalysis.h +++ b/include/llvm/Analysis/DependenceAnalysis.h @@ -921,7 +921,7 @@ template class ArrayRef; Result run(Function &F, FunctionAnalysisManager &FAM); private: - static char PassID; + static AnalysisKey Key; friend struct AnalysisInfoMixin; }; // class DependenceAnalysis diff --git a/include/llvm/Analysis/DominanceFrontier.h b/include/llvm/Analysis/DominanceFrontier.h index 5a535a37883..b9667f801ed 100644 --- a/include/llvm/Analysis/DominanceFrontier.h +++ b/include/llvm/Analysis/DominanceFrontier.h @@ -171,7 +171,7 @@ extern template class ForwardDominanceFrontierBase; class DominanceFrontierAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief Provide the result typedef for this analysis pass. diff --git a/include/llvm/Analysis/GlobalsModRef.h b/include/llvm/Analysis/GlobalsModRef.h index eff85f3da71..09cef68ce70 100644 --- a/include/llvm/Analysis/GlobalsModRef.h +++ b/include/llvm/Analysis/GlobalsModRef.h @@ -120,7 +120,7 @@ private: /// Analysis pass providing a never-invalidated alias analysis result. class GlobalsAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef GlobalsAAResult Result; diff --git a/include/llvm/Analysis/IVUsers.h b/include/llvm/Analysis/IVUsers.h index e8777e0b38a..e1a5467d8b6 100644 --- a/include/llvm/Analysis/IVUsers.h +++ b/include/llvm/Analysis/IVUsers.h @@ -188,7 +188,7 @@ public: /// Analysis pass that exposes the \c IVUsers for a loop. class IVUsersAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef IVUsers Result; diff --git a/include/llvm/Analysis/LazyCallGraph.h b/include/llvm/Analysis/LazyCallGraph.h index 27c6c04664f..d1864aef963 100644 --- a/include/llvm/Analysis/LazyCallGraph.h +++ b/include/llvm/Analysis/LazyCallGraph.h @@ -1145,7 +1145,7 @@ template <> struct GraphTraits { /// An analysis pass which computes the call graph for a module. class LazyCallGraphAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// Inform generic clients of the result type. diff --git a/include/llvm/Analysis/LazyValueInfo.h b/include/llvm/Analysis/LazyValueInfo.h index c85cf2c5da5..610791023a7 100644 --- a/include/llvm/Analysis/LazyValueInfo.h +++ b/include/llvm/Analysis/LazyValueInfo.h @@ -109,7 +109,7 @@ public: Result run(Function &F, FunctionAnalysisManager &FAM); private: - static char PassID; + static AnalysisKey Key; friend struct AnalysisInfoMixin; }; diff --git a/include/llvm/Analysis/LoopAccessAnalysis.h b/include/llvm/Analysis/LoopAccessAnalysis.h index 7fc88e4359b..76066f6003e 100644 --- a/include/llvm/Analysis/LoopAccessAnalysis.h +++ b/include/llvm/Analysis/LoopAccessAnalysis.h @@ -749,7 +749,7 @@ private: class LoopAccessAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef LoopAccessInfo Result; diff --git a/include/llvm/Analysis/LoopInfo.h b/include/llvm/Analysis/LoopInfo.h index 55b5d1ac177..0c99c6297c1 100644 --- a/include/llvm/Analysis/LoopInfo.h +++ b/include/llvm/Analysis/LoopInfo.h @@ -805,7 +805,7 @@ template <> struct GraphTraits { /// \brief Analysis pass that exposes the \c LoopInfo for a function. class LoopAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef LoopInfo Result; diff --git a/include/llvm/Analysis/MemoryDependenceAnalysis.h b/include/llvm/Analysis/MemoryDependenceAnalysis.h index 8b866bc1727..deb5b89c61b 100644 --- a/include/llvm/Analysis/MemoryDependenceAnalysis.h +++ b/include/llvm/Analysis/MemoryDependenceAnalysis.h @@ -485,7 +485,7 @@ private: class MemoryDependenceAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef MemoryDependenceResults Result; diff --git a/include/llvm/Analysis/ModuleSummaryAnalysis.h b/include/llvm/Analysis/ModuleSummaryAnalysis.h index 617c3d8f17a..4f77170d9f6 100644 --- a/include/llvm/Analysis/ModuleSummaryAnalysis.h +++ b/include/llvm/Analysis/ModuleSummaryAnalysis.h @@ -38,7 +38,7 @@ ModuleSummaryIndex buildModuleSummaryIndex( class ModuleSummaryIndexAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef ModuleSummaryIndex Result; diff --git a/include/llvm/Analysis/ObjCARCAliasAnalysis.h b/include/llvm/Analysis/ObjCARCAliasAnalysis.h index 8f4ed6c4bc2..78382659de6 100644 --- a/include/llvm/Analysis/ObjCARCAliasAnalysis.h +++ b/include/llvm/Analysis/ObjCARCAliasAnalysis.h @@ -63,7 +63,7 @@ public: /// Analysis pass providing a never-invalidated alias analysis result. class ObjCARCAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef ObjCARCAAResult Result; diff --git a/include/llvm/Analysis/OptimizationDiagnosticInfo.h b/include/llvm/Analysis/OptimizationDiagnosticInfo.h index 9a88fea48b5..b0653367c0c 100644 --- a/include/llvm/Analysis/OptimizationDiagnosticInfo.h +++ b/include/llvm/Analysis/OptimizationDiagnosticInfo.h @@ -251,7 +251,7 @@ public: class OptimizationRemarkEmitterAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief Provide the result typedef for this analysis pass. diff --git a/include/llvm/Analysis/PostDominators.h b/include/llvm/Analysis/PostDominators.h index 59064d0d80e..34361dac8c1 100644 --- a/include/llvm/Analysis/PostDominators.h +++ b/include/llvm/Analysis/PostDominators.h @@ -32,7 +32,7 @@ struct PostDominatorTree : public DominatorTreeBase { class PostDominatorTreeAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief Provide the result typedef for this analysis pass. diff --git a/include/llvm/Analysis/ProfileSummaryInfo.h b/include/llvm/Analysis/ProfileSummaryInfo.h index 60e52357a84..d7fe76e278e 100644 --- a/include/llvm/Analysis/ProfileSummaryInfo.h +++ b/include/llvm/Analysis/ProfileSummaryInfo.h @@ -94,7 +94,7 @@ public: private: friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; }; /// \brief Printer pass that uses \c ProfileSummaryAnalysis. diff --git a/include/llvm/Analysis/RegionInfo.h b/include/llvm/Analysis/RegionInfo.h index 87f43f365e1..f2f27a137a8 100644 --- a/include/llvm/Analysis/RegionInfo.h +++ b/include/llvm/Analysis/RegionInfo.h @@ -933,7 +933,7 @@ public: /// \brief Analysis pass that exposes the \c RegionInfo for a function. class RegionInfoAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef RegionInfo Result; diff --git a/include/llvm/Analysis/ScalarEvolution.h b/include/llvm/Analysis/ScalarEvolution.h index e0934daf38b..9dcffe1ac5f 100644 --- a/include/llvm/Analysis/ScalarEvolution.h +++ b/include/llvm/Analysis/ScalarEvolution.h @@ -1626,7 +1626,7 @@ private: class ScalarEvolutionAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef ScalarEvolution Result; diff --git a/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h b/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h index 023754eb2a1..329be51e5ea 100644 --- a/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h +++ b/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h @@ -40,7 +40,7 @@ private: /// Analysis pass providing a never-invalidated alias analysis result. class SCEVAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef SCEVAAResult Result; diff --git a/include/llvm/Analysis/ScopedNoAliasAA.h b/include/llvm/Analysis/ScopedNoAliasAA.h index b435398be6a..840fdcd9d79 100644 --- a/include/llvm/Analysis/ScopedNoAliasAA.h +++ b/include/llvm/Analysis/ScopedNoAliasAA.h @@ -43,7 +43,7 @@ private: /// Analysis pass providing a never-invalidated alias analysis result. class ScopedNoAliasAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef ScopedNoAliasAAResult Result; diff --git a/include/llvm/Analysis/TargetLibraryInfo.h b/include/llvm/Analysis/TargetLibraryInfo.h index d9709befa09..9342d021a70 100644 --- a/include/llvm/Analysis/TargetLibraryInfo.h +++ b/include/llvm/Analysis/TargetLibraryInfo.h @@ -343,7 +343,7 @@ public: private: friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; Optional PresetInfoImpl; diff --git a/include/llvm/Analysis/TargetTransformInfo.h b/include/llvm/Analysis/TargetTransformInfo.h index 7c2a1512fd0..191f14c50a1 100644 --- a/include/llvm/Analysis/TargetTransformInfo.h +++ b/include/llvm/Analysis/TargetTransformInfo.h @@ -1128,7 +1128,7 @@ public: private: friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; /// \brief The callback used to produce a result. /// diff --git a/include/llvm/Analysis/TypeBasedAliasAnalysis.h b/include/llvm/Analysis/TypeBasedAliasAnalysis.h index 87f5e30e508..76f3d8e6315 100644 --- a/include/llvm/Analysis/TypeBasedAliasAnalysis.h +++ b/include/llvm/Analysis/TypeBasedAliasAnalysis.h @@ -47,7 +47,7 @@ private: /// Analysis pass providing a never-invalidated alias analysis result. class TypeBasedAA : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: typedef TypeBasedAAResult Result; diff --git a/include/llvm/IR/Dominators.h b/include/llvm/IR/Dominators.h index fed708ac725..7c733bac8da 100644 --- a/include/llvm/IR/Dominators.h +++ b/include/llvm/IR/Dominators.h @@ -188,7 +188,7 @@ template <> struct GraphTraits /// \brief Analysis pass which computes a \c DominatorTree. class DominatorTreeAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: /// \brief Provide the result typedef for this analysis pass. diff --git a/include/llvm/IR/PassManager.h b/include/llvm/IR/PassManager.h index 57d0c93514e..74b34381507 100644 --- a/include/llvm/IR/PassManager.h +++ b/include/llvm/IR/PassManager.h @@ -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. /// @@ -71,17 +79,17 @@ public: /// \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 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. @@ -92,12 +100,12 @@ public: 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. @@ -108,12 +116,12 @@ public: 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. @@ -123,17 +131,17 @@ public: /// \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; } @@ -143,15 +151,14 @@ public: /// 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 PreservedPassIDs; + SmallPtrSet PreservedAnalysisIDs; }; // Forward declare the analysis manager template. @@ -179,10 +186,14 @@ template struct PassInfoMixin { /// specifically used for analyses. template struct AnalysisInfoMixin : PassInfoMixin { - /// 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 @@ -191,8 +202,8 @@ struct AnalysisInfoMixin : PassInfoMixin { /// 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. @@ -205,17 +216,17 @@ struct AnalysisInfoMixin : PassInfoMixin { /// /// 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 class AllAnalysesOn { public: - static void *ID() { return (void *)&SetID; } + static AnalysisKey *ID() { return &SetKey; } private: - static char SetID; + static AnalysisKey SetKey; }; -template char AllAnalysesOn::SetID; +template AnalysisKey AllAnalysesOn::SetKey; extern template class AllAnalysesOn; extern template class AllAnalysesOn; @@ -363,13 +374,13 @@ public: // Clear all the invalidated results associated specifically with this // function. - SmallVector InvalidatedPassIDs; + SmallVector 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); @@ -479,22 +490,22 @@ public: // Clear all the invalidated results associated specifically with this // function. - SmallVector InvalidatedPassIDs; + SmallVector 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; @@ -503,11 +514,10 @@ public: // 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); @@ -516,41 +526,41 @@ public: 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()); @@ -560,28 +570,28 @@ private: } /// \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> AnalysisPassMapT; + typedef DenseMap> AnalysisPassMapT; /// \brief Collection of module analysis passes, indexed by ID. AnalysisPassMapT AnalysisPasses; @@ -592,7 +602,7 @@ private: /// 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>>> + AnalysisKey *, std::unique_ptr>>> AnalysisResultListT; /// \brief Map type from function pointer to our custom list type. @@ -606,7 +616,7 @@ private: /// \brief Map type from a pair of analysis ID and function pointer to an /// iterator into a particular result list. - typedef DenseMap, + typedef DenseMap, typename AnalysisResultListT::iterator> AnalysisResultMapT; @@ -718,14 +728,14 @@ public: private: friend AnalysisInfoMixin< InnerAnalysisManagerProxy>; - static char PassID; + static AnalysisKey Key; AnalysisManagerT *AM; }; template -char - InnerAnalysisManagerProxy::PassID; +AnalysisKey + InnerAnalysisManagerProxy::Key; extern template class InnerAnalysisManagerProxy; @@ -777,14 +787,14 @@ public: private: friend AnalysisInfoMixin< OuterAnalysisManagerProxy>; - static char PassID; + static AnalysisKey Key; const AnalysisManagerT *AM; }; template -char - OuterAnalysisManagerProxy::PassID; +AnalysisKey + OuterAnalysisManagerProxy::Key; extern template class OuterAnalysisManagerProxy; diff --git a/include/llvm/IR/Verifier.h b/include/llvm/IR/Verifier.h index fdb6ce400a8..4f4f0d0174e 100644 --- a/include/llvm/IR/Verifier.h +++ b/include/llvm/IR/Verifier.h @@ -58,13 +58,12 @@ FunctionPass *createVerifierPass(bool FatalErrors = true); /// and debug info errors. class VerifierAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - 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 &); }; diff --git a/include/llvm/Transforms/Utils/MemorySSA.h b/include/llvm/Transforms/Utils/MemorySSA.h index f3777919f66..fc392441494 100644 --- a/include/llvm/Transforms/Utils/MemorySSA.h +++ b/include/llvm/Transforms/Utils/MemorySSA.h @@ -672,7 +672,7 @@ public: /// class MemorySSAAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: // Wrap MemorySSA result to ensure address stability of internal MemorySSA diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index ae0180af5c0..b6a65e10a89 100644 --- a/lib/Analysis/AliasAnalysis.cpp +++ b/lib/Analysis/AliasAnalysis.cpp @@ -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 diff --git a/lib/Analysis/AssumptionCache.cpp b/lib/Analysis/AssumptionCache.cpp index 42a3d41cdd2..3c518034ba6 100644 --- a/lib/Analysis/AssumptionCache.cpp +++ b/lib/Analysis/AssumptionCache.cpp @@ -74,7 +74,7 @@ void AssumptionCache::registerAssumption(CallInst *CI) { #endif } -char AssumptionAnalysis::PassID; +AnalysisKey AssumptionAnalysis::Key; PreservedAnalyses AssumptionPrinterPass::run(Function &F, FunctionAnalysisManager &AM) { diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index ebcf9897143..942f03620b9 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -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(), diff --git a/lib/Analysis/BlockFrequencyInfo.cpp b/lib/Analysis/BlockFrequencyInfo.cpp index 85f437d61da..4cdbe4d0fcf 100644 --- a/lib/Analysis/BlockFrequencyInfo.cpp +++ b/lib/Analysis/BlockFrequencyInfo.cpp @@ -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; diff --git a/lib/Analysis/BranchProbabilityInfo.cpp b/lib/Analysis/BranchProbabilityInfo.cpp index 0228e895879..a91ac8d06fa 100644 --- a/lib/Analysis/BranchProbabilityInfo.cpp +++ b/lib/Analysis/BranchProbabilityInfo.cpp @@ -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; diff --git a/lib/Analysis/CFLAndersAliasAnalysis.cpp b/lib/Analysis/CFLAndersAliasAnalysis.cpp index b33938889de..e48ff230f43 100644 --- a/lib/Analysis/CFLAndersAliasAnalysis.cpp +++ b/lib/Analysis/CFLAndersAliasAnalysis.cpp @@ -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(F)); diff --git a/lib/Analysis/CFLSteensAliasAnalysis.cpp b/lib/Analysis/CFLSteensAliasAnalysis.cpp index e55d3e949a1..dde24ef5fdd 100644 --- a/lib/Analysis/CFLSteensAliasAnalysis.cpp +++ b/lib/Analysis/CFLSteensAliasAnalysis.cpp @@ -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(F)); diff --git a/lib/Analysis/CallGraph.cpp b/lib/Analysis/CallGraph.cpp index adf378b6454..458b7bfae95 100644 --- a/lib/Analysis/CallGraph.cpp +++ b/lib/Analysis/CallGraph.cpp @@ -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) { diff --git a/lib/Analysis/DemandedBits.cpp b/lib/Analysis/DemandedBits.cpp index 106ccbecf8a..688c1db534c 100644 --- a/lib/Analysis/DemandedBits.cpp +++ b/lib/Analysis/DemandedBits.cpp @@ -386,7 +386,7 @@ FunctionPass *llvm::createDemandedBitsWrapperPass() { return new DemandedBitsWrapperPass(); } -char DemandedBitsAnalysis::PassID; +AnalysisKey DemandedBitsAnalysis::Key; DemandedBits DemandedBitsAnalysis::run(Function &F, FunctionAnalysisManager &AM) { diff --git a/lib/Analysis/DependenceAnalysis.cpp b/lib/Analysis/DependenceAnalysis.cpp index eb4d925fea7..a332a07ce86 100644 --- a/lib/Analysis/DependenceAnalysis.cpp +++ b/lib/Analysis/DependenceAnalysis.cpp @@ -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) diff --git a/lib/Analysis/DominanceFrontier.cpp b/lib/Analysis/DominanceFrontier.cpp index 4554374252a..15856c3f8b7 100644 --- a/lib/Analysis/DominanceFrontier.cpp +++ b/lib/Analysis/DominanceFrontier.cpp @@ -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) { diff --git a/lib/Analysis/GlobalsModRef.cpp b/lib/Analysis/GlobalsModRef.cpp index c955d9dff3a..33f00cb19b2 100644 --- a/lib/Analysis/GlobalsModRef.cpp +++ b/lib/Analysis/GlobalsModRef.cpp @@ -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, diff --git a/lib/Analysis/IVUsers.cpp b/lib/Analysis/IVUsers.cpp index 11056fbd64f..76e2561b9da 100644 --- a/lib/Analysis/IVUsers.cpp +++ b/lib/Analysis/IVUsers.cpp @@ -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 = diff --git a/lib/Analysis/LazyCallGraph.cpp b/lib/Analysis/LazyCallGraph.cpp index 6111bba9d24..fe635c4e366 100644 --- a/lib/Analysis/LazyCallGraph.cpp +++ b/lib/Analysis/LazyCallGraph.cpp @@ -1833,7 +1833,7 @@ bool LazyCallGraph::buildNextRefSCCInPostOrder() { } } -char LazyCallGraphAnalysis::PassID; +AnalysisKey LazyCallGraphAnalysis::Key; LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {} diff --git a/lib/Analysis/LazyValueInfo.cpp b/lib/Analysis/LazyValueInfo.cpp index c3329d19115..508c9f839d3 100644 --- a/lib/Analysis/LazyValueInfo.cpp +++ b/lib/Analysis/LazyValueInfo.cpp @@ -51,7 +51,7 @@ namespace llvm { FunctionPass *createLazyValueInfoPass() { return new LazyValueInfoWrapperPass(); } } -char LazyValueAnalysis::PassID; +AnalysisKey LazyValueAnalysis::Key; //===----------------------------------------------------------------------===// // LVILatticeVal diff --git a/lib/Analysis/LoopAccessAnalysis.cpp b/lib/Analysis/LoopAccessAnalysis.cpp index 428d63960f0..a775f15ced9 100644 --- a/lib/Analysis/LoopAccessAnalysis.cpp +++ b/lib/Analysis/LoopAccessAnalysis.cpp @@ -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 = diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp index d8b8c89cb8d..19c0171740c 100644 --- a/lib/Analysis/LoopInfo.cpp +++ b/lib/Analysis/LoopInfo.cpp @@ -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. diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp index 742a4825551..82a15a654f4 100644 --- a/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -1643,7 +1643,7 @@ void MemoryDependenceResults::verifyRemoved(Instruction *D) const { #endif } -char MemoryDependenceAnalysis::PassID; +AnalysisKey MemoryDependenceAnalysis::Key; MemoryDependenceResults MemoryDependenceAnalysis::run(Function &F, FunctionAnalysisManager &AM) { diff --git a/lib/Analysis/ModuleSummaryAnalysis.cpp b/lib/Analysis/ModuleSummaryAnalysis.cpp index 133bb3f9c9d..a867213bcde 100644 --- a/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -305,7 +305,7 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex( return Index; } -char ModuleSummaryIndexAnalysis::PassID; +AnalysisKey ModuleSummaryIndexAnalysis::Key; ModuleSummaryIndex ModuleSummaryIndexAnalysis::run(Module &M, ModuleAnalysisManager &AM) { diff --git a/lib/Analysis/OptimizationDiagnosticInfo.cpp b/lib/Analysis/OptimizationDiagnosticInfo.cpp index da1173b283f..fa8b07d61b0 100644 --- a/lib/Analysis/OptimizationDiagnosticInfo.cpp +++ b/lib/Analysis/OptimizationDiagnosticInfo.cpp @@ -237,7 +237,7 @@ void OptimizationRemarkEmitterWrapperPass::getAnalysisUsage( AU.setPreservesAll(); } -char OptimizationRemarkEmitterAnalysis::PassID; +AnalysisKey OptimizationRemarkEmitterAnalysis::Key; OptimizationRemarkEmitter OptimizationRemarkEmitterAnalysis::run(Function &F, diff --git a/lib/Analysis/PostDominators.cpp b/lib/Analysis/PostDominators.cpp index 73550805d5b..cb9438a2f92 100644 --- a/lib/Analysis/PostDominators.cpp +++ b/lib/Analysis/PostDominators.cpp @@ -44,7 +44,7 @@ FunctionPass* llvm::createPostDomTree() { return new PostDominatorTreeWrapperPass(); } -char PostDominatorTreeAnalysis::PassID; +AnalysisKey PostDominatorTreeAnalysis::Key; PostDominatorTree PostDominatorTreeAnalysis::run(Function &F, FunctionAnalysisManager &) { diff --git a/lib/Analysis/ProfileSummaryInfo.cpp b/lib/Analysis/ProfileSummaryInfo.cpp index c414b8314a7..16d3614c14c 100644 --- a/lib/Analysis/ProfileSummaryInfo.cpp +++ b/lib/Analysis/ProfileSummaryInfo.cpp @@ -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); diff --git a/lib/Analysis/RegionInfo.cpp b/lib/Analysis/RegionInfo.cpp index 33c62ceaa6b..8c084ddd226 100644 --- a/lib/Analysis/RegionInfo.cpp +++ b/lib/Analysis/RegionInfo.cpp @@ -181,7 +181,7 @@ namespace llvm { // RegionInfoAnalysis implementation // -char RegionInfoAnalysis::PassID; +AnalysisKey RegionInfoAnalysis::Key; RegionInfo RegionInfoAnalysis::run(Function &F, FunctionAnalysisManager &AM) { RegionInfo RI; diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index e12ef56bb75..041d4d4a47e 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -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) { diff --git a/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp b/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp index f15b1787f00..7bea994121c 100644 --- a/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp +++ b/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp @@ -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(F)); diff --git a/lib/Analysis/ScopedNoAliasAA.cpp b/lib/Analysis/ScopedNoAliasAA.cpp index 3a72fd8645e..833c6e09f6f 100644 --- a/lib/Analysis/ScopedNoAliasAA.cpp +++ b/lib/Analysis/ScopedNoAliasAA.cpp @@ -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) { diff --git a/lib/Analysis/TargetLibraryInfo.cpp b/lib/Analysis/TargetLibraryInfo.cpp index 89470b87259..db0e86ae5be 100644 --- a/lib/Analysis/TargetLibraryInfo.cpp +++ b/lib/Analysis/TargetLibraryInfo.cpp @@ -1265,7 +1265,7 @@ TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass( initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry()); } -char TargetLibraryAnalysis::PassID; +AnalysisKey TargetLibraryAnalysis::Key; // Register the basic pass. INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo", diff --git a/lib/Analysis/TargetTransformInfo.cpp b/lib/Analysis/TargetTransformInfo.cpp index fb0db03eb3f..2a15b9b264e 100644 --- a/lib/Analysis/TargetTransformInfo.cpp +++ b/lib/Analysis/TargetTransformInfo.cpp @@ -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()); diff --git a/lib/Analysis/TypeBasedAliasAnalysis.cpp b/lib/Analysis/TypeBasedAliasAnalysis.cpp index e5ef734aab5..5c92adbd2a2 100644 --- a/lib/Analysis/TypeBasedAliasAnalysis.cpp +++ b/lib/Analysis/TypeBasedAliasAnalysis.cpp @@ -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(); diff --git a/lib/IR/Dominators.cpp b/lib/IR/Dominators.cpp index c70c589e799..1880807da7e 100644 --- a/lib/IR/Dominators.cpp +++ b/lib/IR/Dominators.cpp @@ -311,7 +311,7 @@ DominatorTree DominatorTreeAnalysis::run(Function &F, return DT; } -char DominatorTreeAnalysis::PassID; +AnalysisKey DominatorTreeAnalysis::Key; DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {} diff --git a/lib/IR/PassManager.cpp b/lib/IR/PassManager.cpp index 8fafea4c957..171805f7d24 100644 --- a/lib/IR/PassManager.cpp +++ b/lib/IR/PassManager.cpp @@ -24,3 +24,5 @@ template class AnalysisManager; template class InnerAnalysisManagerProxy; template class OuterAnalysisManagerProxy; } + +AnalysisKey PreservedAnalyses::AllAnalysesKey; diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index d56ff653949..2f819f78c21 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -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; diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index 71a78cb672c..98694fd9788 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -152,7 +152,7 @@ struct NoOpModulePass { /// \brief No-op module analysis. class NoOpModuleAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: struct Result {}; @@ -172,7 +172,7 @@ struct NoOpCGSCCPass { /// \brief No-op CGSCC analysis. class NoOpCGSCCAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: struct Result {}; @@ -193,7 +193,7 @@ struct NoOpFunctionPass { /// \brief No-op function analysis. class NoOpFunctionAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: struct Result {}; @@ -212,7 +212,7 @@ struct NoOpLoopPass { /// \brief No-op loop analysis. class NoOpLoopAnalysis : public AnalysisInfoMixin { friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; public: struct Result {}; @@ -220,10 +220,10 @@ public: 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. diff --git a/lib/Transforms/Utils/MemorySSA.cpp b/lib/Transforms/Utils/MemorySSA.cpp index 1cf5ef08a07..c887f86ca17 100644 --- a/lib/Transforms/Utils/MemorySSA.cpp +++ b/lib/Transforms/Utils/MemorySSA.cpp @@ -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) { diff --git a/unittests/Analysis/CGSCCPassManagerTest.cpp b/unittests/Analysis/CGSCCPassManagerTest.cpp index fb48f83180e..9e18bb1ecec 100644 --- a/unittests/Analysis/CGSCCPassManagerTest.cpp +++ b/unittests/Analysis/CGSCCPassManagerTest.cpp @@ -22,16 +22,13 @@ using namespace llvm; namespace { -class TestModuleAnalysis { +class TestModuleAnalysis : public AnalysisInfoMixin { 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) { @@ -40,23 +37,21 @@ public: } private: - static char PassID; + friend AnalysisInfoMixin; + static AnalysisKey Key; int &Runs; }; -char TestModuleAnalysis::PassID; +AnalysisKey TestModuleAnalysis::Key; -class TestSCCAnalysis { +class TestSCCAnalysis : public AnalysisInfoMixin { 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 &) { @@ -65,23 +60,21 @@ public: } private: - static char PassID; + friend AnalysisInfoMixin; + static AnalysisKey Key; int &Runs; }; -char TestSCCAnalysis::PassID; +AnalysisKey TestSCCAnalysis::Key; -class TestFunctionAnalysis { +class TestFunctionAnalysis : public AnalysisInfoMixin { 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) { @@ -95,22 +88,21 @@ public: } private: - static char PassID; + friend AnalysisInfoMixin; + static AnalysisKey Key; int &Runs; }; -char TestFunctionAnalysis::PassID; +AnalysisKey TestFunctionAnalysis::Key; -class TestImmutableFunctionAnalysis { +class TestImmutableFunctionAnalysis + : public AnalysisInfoMixin { 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) { @@ -119,12 +111,13 @@ public: } private: - static char PassID; + friend AnalysisInfoMixin; + static AnalysisKey Key; int &Runs; }; -char TestImmutableFunctionAnalysis::PassID; +AnalysisKey TestImmutableFunctionAnalysis::Key; struct LambdaSCCPass : public PassInfoMixin { template LambdaSCCPass(T &&Arg) : Func(std::forward(Arg)) {} diff --git a/unittests/Analysis/LoopPassManagerTest.cpp b/unittests/Analysis/LoopPassManagerTest.cpp index b55ca7b6140..4f12def8f0d 100644 --- a/unittests/Analysis/LoopPassManagerTest.cpp +++ b/unittests/Analysis/LoopPassManagerTest.cpp @@ -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 { + friend AnalysisInfoMixin; + static AnalysisKey Key; int &Runs; @@ -33,12 +33,6 @@ public: 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. @@ -52,7 +46,7 @@ public: } }; -char TestLoopAnalysis::PassID; +AnalysisKey TestLoopAnalysis::Key; class TestLoopPass { std::vector &VisitedLoops; diff --git a/unittests/IR/PassManagerTest.cpp b/unittests/IR/PassManagerTest.cpp index 47fb8b70f1b..66888145ab2 100644 --- a/unittests/IR/PassManagerTest.cpp +++ b/unittests/IR/PassManagerTest.cpp @@ -41,12 +41,12 @@ public: private: friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; int &Runs; }; -char TestFunctionAnalysis::PassID; +AnalysisKey TestFunctionAnalysis::Key; class TestModuleAnalysis : public AnalysisInfoMixin { public: @@ -67,12 +67,12 @@ public: private: friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; int &Runs; }; -char TestModuleAnalysis::PassID; +AnalysisKey TestModuleAnalysis::Key; struct TestModulePass : PassInfoMixin { TestModulePass(int &RunCount) : RunCount(RunCount) {} @@ -351,10 +351,10 @@ public: private: friend AnalysisInfoMixin; - static char PassID; + static AnalysisKey Key; }; -char CustomizedAnalysis::PassID; +AnalysisKey CustomizedAnalysis::Key; struct CustomizedPass : PassInfoMixin { std::function Callback; -- 2.50.1