[llvm] r263216 - [PM] Implement the final conclusion as to how the analysis IDs should

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 29 00:37:47 PDT 2016


Realized I had never responded to this, I think we just chatted in person...

On Fri, Mar 11, 2016 at 11:28 AM David Blaikie via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> On Fri, Mar 11, 2016 at 2:22 AM, Chandler Carruth via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: chandlerc
>> Date: Fri Mar 11 04:22:49 2016
>> New Revision: 263216
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=263216&view=rev
>> Log:
>> [PM] Implement the final conclusion as to how the analysis IDs should
>> work in the face of the limitations of DLLs and templated static
>> variables.
>>
>> This requires passes that use the AnalysisBase mixin provide a static
>> variable themselves. So as to keep their APIs clean, I've made these
>> private and befriended the CRTP base class (which is the common
>> practice).
>>
>
> Reckon it's worth the two lines rather than one where it's public? It'd be
> a little bit of a wart in autogenerated public-only docs, I'll admit, but
> doesn't seem likely anyone would actually get in the way or anything?
>

Meh, I'd rather a consistent pattern that gives us clean docs I think. I'm
actually a tiny bit worried about accidental usage of the variable rather
than the nice method. I'd like to keep all the users of the method in case
we can eventually pull the variable back out of all the derived classes.


>
>
>> I've added documentation to AnalysisBase for why this is necessary and
>> at what point we can go back to the much simpler system.
>>
>> This is clearly a better pattern than the extern template as it caught
>> *numerous* places where the template magic hadn't been applied and
>> things were "just working" but would eventually have broken
>> mysteriously.
>>
>> Modified:
>>     llvm/trunk/include/llvm/Analysis/AliasAnalysis.h
>>     llvm/trunk/include/llvm/Analysis/AssumptionCache.h
>>     llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h
>>     llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h
>>     llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h
>>     llvm/trunk/include/llvm/Analysis/CallGraph.h
>>     llvm/trunk/include/llvm/Analysis/DominanceFrontier.h
>>     llvm/trunk/include/llvm/Analysis/GlobalsModRef.h
>>     llvm/trunk/include/llvm/Analysis/LazyCallGraph.h
>>     llvm/trunk/include/llvm/Analysis/LoopInfo.h
>>     llvm/trunk/include/llvm/Analysis/LoopPassManager.h
>>     llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h
>>     llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h
>>     llvm/trunk/include/llvm/Analysis/PostDominators.h
>>     llvm/trunk/include/llvm/Analysis/RegionInfo.h
>>     llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
>>     llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h
>>     llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h
>>     llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h
>>     llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
>>     llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h
>>     llvm/trunk/include/llvm/IR/Dominators.h
>>     llvm/trunk/include/llvm/IR/PassManager.h
>>     llvm/trunk/lib/Analysis/AliasAnalysis.cpp
>>     llvm/trunk/lib/Analysis/AssumptionCache.cpp
>>     llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>>     llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp
>>     llvm/trunk/lib/Analysis/CGSCCPassManager.cpp
>>     llvm/trunk/lib/Analysis/CallGraph.cpp
>>     llvm/trunk/lib/Analysis/DominanceFrontier.cpp
>>     llvm/trunk/lib/Analysis/GlobalsModRef.cpp
>>     llvm/trunk/lib/Analysis/LazyCallGraph.cpp
>>     llvm/trunk/lib/Analysis/LoopInfo.cpp
>>     llvm/trunk/lib/Analysis/LoopPassManager.cpp
>>     llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
>>     llvm/trunk/lib/Analysis/PostDominators.cpp
>>     llvm/trunk/lib/Analysis/RegionInfo.cpp
>>     llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>>     llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp
>>     llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp
>>     llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
>>     llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
>>     llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
>>     llvm/trunk/lib/IR/Dominators.cpp
>>     llvm/trunk/lib/IR/PassManager.cpp
>>     llvm/trunk/lib/Passes/PassBuilder.cpp
>>     llvm/trunk/unittests/IR/PassManagerTest.cpp
>>
>> Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Fri Mar 11 04:22:49
>> 2016
>> @@ -874,6 +874,9 @@ public:
>>    }
>>
>>  private:
>> +  friend AnalysisBase<AAManager>;
>> +  static char PassID;
>> +
>>    SmallVector<void (*)(Function &F, AnalysisManager<Function> &AM,
>>                         AAResults &AAResults),
>>                4> ResultGetters;
>> @@ -895,8 +898,6 @@ private:
>>    }
>>  };
>>
>> -extern template class AnalysisBase<AAManager>;
>> -
>>  /// A wrapper pass to provide the legacy pass manager access to a
>> suitably
>>  /// prepared AAResults object.
>>  class AAResultsWrapperPass : public FunctionPass {
>>
>> Modified: llvm/trunk/include/llvm/Analysis/AssumptionCache.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AssumptionCache.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/AssumptionCache.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/AssumptionCache.h Fri Mar 11
>> 04:22:49 2016
>> @@ -93,7 +93,11 @@ public:
>>  ///
>>  /// This analysis is intended for use with the new pass manager and will
>> vend
>>  /// assumption caches for a given function.
>> -struct AssumptionAnalysis : AnalysisBase<AssumptionAnalysis> {
>> +class AssumptionAnalysis : public AnalysisBase<AssumptionAnalysis> {
>> +  friend AnalysisBase<AssumptionAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef AssumptionCache Result;
>>
>>    AssumptionAnalysis() {}
>> @@ -105,8 +109,6 @@ struct AssumptionAnalysis : AnalysisBase
>>    AssumptionCache run(Function &F) { return AssumptionCache(F); }
>>  };
>>
>> -extern template class AnalysisBase<AssumptionAnalysis>;
>> -
>>  /// \brief Printer pass for the \c AssumptionAnalysis results.
>>  class AssumptionPrinterPass : public PassBase<AssumptionPrinterPass> {
>>    raw_ostream &OS;
>>
>> Modified: llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h Fri Mar 11
>> 04:22:49 2016
>> @@ -180,7 +180,11 @@ private:
>>  };
>>
>>  /// Analysis pass providing a never-invalidated alias analysis result.
>> -struct BasicAA : AnalysisBase<BasicAA> {
>> +class BasicAA : public AnalysisBase<BasicAA> {
>> +  friend AnalysisBase<BasicAA>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef BasicAAResult Result;
>>
>>    BasicAAResult run(Function &F, AnalysisManager<Function> *AM);
>>
>> Modified: llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h Fri Mar 11
>> 04:22:49 2016
>> @@ -109,7 +109,11 @@ private:
>>  ///
>>  /// FIXME: We really should refactor CFL to use the analysis more
>> heavily, and
>>  /// in particular to leverage invalidation to trigger re-computation of
>> sets.
>> -struct CFLAA : AnalysisBase<CFLAA> {
>> +class CFLAA : public AnalysisBase<CFLAA> {
>> +  friend AnalysisBase<CFLAA>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef CFLAAResult Result;
>>
>>    CFLAAResult run(Function &F, AnalysisManager<Function> *AM);
>>
>> Modified: llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h Fri Mar 11
>> 04:22:49 2016
>> @@ -48,16 +48,12 @@ extern template class InnerAnalysisManag
>>  typedef InnerAnalysisManagerProxy<CGSCCAnalysisManager, Module>
>>      CGSCCAnalysisManagerModuleProxy;
>>
>> -extern template class AnalysisBase<CGSCCAnalysisManagerModuleProxy>;
>> -
>>  extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
>>                                                  LazyCallGraph::SCC>;
>>  /// A proxy from a \c ModuleAnalysisManager to an \c SCC.
>>  typedef OuterAnalysisManagerProxy<ModuleAnalysisManager,
>> LazyCallGraph::SCC>
>>      ModuleAnalysisManagerCGSCCProxy;
>>
>> -extern template class AnalysisBase<ModuleAnalysisManagerCGSCCProxy>;
>> -
>>  /// \brief The core module pass which does a post-order walk of the SCCs
>> and
>>  /// runs a CGSCC pass over each one.
>>  ///
>> @@ -148,8 +144,6 @@ extern template class InnerAnalysisManag
>>  typedef InnerAnalysisManagerProxy<FunctionAnalysisManager,
>> LazyCallGraph::SCC>
>>      FunctionAnalysisManagerCGSCCProxy;
>>
>> -extern template class AnalysisBase<FunctionAnalysisManagerCGSCCProxy>;
>> -
>>  extern template class OuterAnalysisManagerProxy<CGSCCAnalysisManager,
>> Function>;
>>  /// A proxy from a \c CGSCCAnalysisManager to a \c Function.
>>  typedef OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function>
>>
>> Modified: llvm/trunk/include/llvm/Analysis/CallGraph.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CallGraph.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/CallGraph.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/CallGraph.h Fri Mar 11 04:22:49 2016
>> @@ -295,7 +295,10 @@ private:
>>  /// This class implements the concept of an analysis pass used by the \c
>>  /// ModuleAnalysisManager to run an analysis over a module and cache the
>>  /// resulting data.
>> -struct CallGraphAnalysis : AnalysisBase<CallGraphAnalysis> {
>> +class CallGraphAnalysis : public AnalysisBase<CallGraphAnalysis> {
>> +  friend AnalysisBase<CallGraphAnalysis>;
>> +  static char PassID;
>> +
>>  public:
>>    /// \brief A formulaic typedef to inform clients of the result type.
>>    typedef CallGraph Result;
>> @@ -306,9 +309,6 @@ public:
>>    CallGraph run(Module &M) { return CallGraph(M); }
>>  };
>>
>> -/// Instantiated in CallGraph.cpp
>> -extern template class llvm::AnalysisBase<CallGraphAnalysis>;
>> -
>>  /// \brief Printer pass for the \c CallGraphAnalysis results.
>>  class CallGraphPrinterPass : public PassBase<CallGraphPrinterPass> {
>>    raw_ostream &OS;
>>
>> Modified: llvm/trunk/include/llvm/Analysis/DominanceFrontier.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DominanceFrontier.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/DominanceFrontier.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/DominanceFrontier.h Fri Mar 11
>> 04:22:49 2016
>> @@ -168,7 +168,12 @@ extern template class DominanceFrontierB
>>  extern template class ForwardDominanceFrontierBase<BasicBlock>;
>>
>>  /// \brief Analysis pass which computes a \c DominanceFrontier.
>> -struct DominanceFrontierAnalysis :
>> AnalysisBase<DominanceFrontierAnalysis> {
>> +class DominanceFrontierAnalysis
>> +    : public AnalysisBase<DominanceFrontierAnalysis> {
>> +  friend AnalysisBase<DominanceFrontierAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    /// \brief Provide the result typedef for this analysis pass.
>>    typedef DominanceFrontier Result;
>>
>> @@ -176,8 +181,6 @@ struct DominanceFrontierAnalysis : Analy
>>    DominanceFrontier run(Function &F, AnalysisManager<Function> *AM);
>>  };
>>
>> -extern template class AnalysisBase<DominanceFrontierAnalysis>;
>> -
>>  /// \brief Printer pass for the \c DominanceFrontier.
>>  class DominanceFrontierPrinterPass
>>      : public PassBase<DominanceFrontierPrinterPass> {
>>
>> Modified: llvm/trunk/include/llvm/Analysis/GlobalsModRef.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/GlobalsModRef.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/GlobalsModRef.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/GlobalsModRef.h Fri Mar 11 04:22:49
>> 2016
>> @@ -118,7 +118,11 @@ private:
>>  };
>>
>>  /// Analysis pass providing a never-invalidated alias analysis result.
>> -struct GlobalsAA : AnalysisBase<GlobalsAA> {
>> +class GlobalsAA : public AnalysisBase<GlobalsAA> {
>> +  friend AnalysisBase<GlobalsAA>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef GlobalsAAResult Result;
>>
>>    GlobalsAAResult run(Module &M, AnalysisManager<Module> *AM);
>>
>> Modified: llvm/trunk/include/llvm/Analysis/LazyCallGraph.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/LazyCallGraph.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/LazyCallGraph.h Fri Mar 11 04:22:49
>> 2016
>> @@ -895,7 +895,11 @@ template <> struct GraphTraits<LazyCallG
>>  };
>>
>>  /// An analysis pass which computes the call graph for a module.
>> -struct LazyCallGraphAnalysis : AnalysisBase<LazyCallGraphAnalysis> {
>> +class LazyCallGraphAnalysis : public AnalysisBase<LazyCallGraphAnalysis>
>> {
>> +  friend AnalysisBase<LazyCallGraphAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    /// Inform generic clients of the result type.
>>    typedef LazyCallGraph Result;
>>
>> @@ -906,8 +910,6 @@ struct LazyCallGraphAnalysis : AnalysisB
>>    LazyCallGraph run(Module &M) { return LazyCallGraph(M); }
>>  };
>>
>> -extern template class AnalysisBase<LazyCallGraphAnalysis>;
>> -
>>  /// A pass which prints the call graph to a \c raw_ostream.
>>  ///
>>  /// This is primarily useful for testing the analysis.
>>
>> Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/LoopInfo.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/LoopInfo.h Fri Mar 11 04:22:49 2016
>> @@ -787,14 +787,16 @@ template <> struct GraphTraits<Loop*> {
>>  };
>>
>>  /// \brief Analysis pass that exposes the \c LoopInfo for a function.
>> -struct LoopAnalysis : AnalysisBase<LoopAnalysis> {
>> +class LoopAnalysis : public AnalysisBase<LoopAnalysis> {
>> +  friend AnalysisBase<LoopAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef LoopInfo Result;
>>
>>    LoopInfo run(Function &F, AnalysisManager<Function> *AM);
>>  };
>>
>> -extern template class AnalysisBase<LoopAnalysis>;
>> -
>>  /// \brief Printer pass for the \c LoopAnalysis results.
>>  class LoopPrinterPass : public PassBase<LoopPrinterPass> {
>>    raw_ostream &OS;
>>
>> Modified: llvm/trunk/include/llvm/Analysis/LoopPassManager.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopPassManager.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/LoopPassManager.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/LoopPassManager.h Fri Mar 11
>> 04:22:49 2016
>> @@ -43,8 +43,6 @@ extern template class InnerAnalysisManag
>>  typedef InnerAnalysisManagerProxy<LoopAnalysisManager, Function>
>>      LoopAnalysisManagerFunctionProxy;
>>
>> -extern template class AnalysisBase<LoopAnalysisManagerFunctionProxy>;
>> -
>>  extern template class OuterAnalysisManagerProxy<FunctionAnalysisManager,
>> Loop>;
>>  /// A proxy from a \c FunctionAnalysisManager to a \c Loop.
>>  typedef OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop>
>>
>> Modified: llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h Fri Mar
>> 11 04:22:49 2016
>> @@ -471,7 +471,11 @@ private:
>>  ///
>>  /// This is essentially a no-op because the results are computed entirely
>>  /// lazily.
>> -struct MemoryDependenceAnalysis : AnalysisBase<MemoryDependenceAnalysis>
>> {
>> +class MemoryDependenceAnalysis : public
>> AnalysisBase<MemoryDependenceAnalysis> {
>> +  friend AnalysisBase<MemoryDependenceAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef MemoryDependenceResults Result;
>>
>>    MemoryDependenceResults run(Function &F, AnalysisManager<Function>
>> *AM);
>>
>> Modified: llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h Fri Mar 11
>> 04:22:49 2016
>> @@ -61,7 +61,11 @@ public:
>>  };
>>
>>  /// Analysis pass providing a never-invalidated alias analysis result.
>> -struct ObjCARCAA : AnalysisBase<ObjCARCAA> {
>> +class ObjCARCAA : public AnalysisBase<ObjCARCAA> {
>> +  friend AnalysisBase<ObjCARCAA>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef ObjCARCAAResult Result;
>>
>>    ObjCARCAAResult run(Function &F, AnalysisManager<Function> *AM);
>>
>> Modified: llvm/trunk/include/llvm/Analysis/PostDominators.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PostDominators.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/PostDominators.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/PostDominators.h Fri Mar 11 04:22:49
>> 2016
>> @@ -37,7 +37,12 @@ struct PostDominatorTree : public Domina
>>  };
>>
>>  /// \brief Analysis pass which computes a \c PostDominatorTree.
>> -struct PostDominatorTreeAnalysis :
>> AnalysisBase<PostDominatorTreeAnalysis> {
>> +class PostDominatorTreeAnalysis
>> +    : public AnalysisBase<PostDominatorTreeAnalysis> {
>> +  friend AnalysisBase<PostDominatorTreeAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    /// \brief Provide the result typedef for this analysis pass.
>>    typedef PostDominatorTree Result;
>>
>> @@ -46,8 +51,6 @@ struct PostDominatorTreeAnalysis : Analy
>>    PostDominatorTree run(Function &F);
>>  };
>>
>> -extern template class AnalysisBase<PostDominatorTreeAnalysis>;
>> -
>>  /// \brief Printer pass for the \c PostDominatorTree.
>>  class PostDominatorTreePrinterPass
>>      : public PassBase<PostDominatorTreePrinterPass> {
>>
>> Modified: llvm/trunk/include/llvm/Analysis/RegionInfo.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/RegionInfo.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/RegionInfo.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/RegionInfo.h Fri Mar 11 04:22:49 2016
>> @@ -923,14 +923,16 @@ public:
>>  };
>>
>>  /// \brief Analysis pass that exposes the \c RegionInfo for a function.
>> -struct RegionInfoAnalysis : AnalysisBase<RegionInfoAnalysis> {
>> +class RegionInfoAnalysis : public AnalysisBase<RegionInfoAnalysis> {
>> +  friend AnalysisBase<RegionInfoAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef RegionInfo Result;
>>
>>    RegionInfo run(Function &F, AnalysisManager<Function> *AM);
>>  };
>>
>> -extern template class AnalysisBase<RegionInfoAnalysis>;
>> -
>>  /// \brief Printer pass for the \c RegionInfo.
>>  class RegionInfoPrinterPass : public PassBase<RegionInfoPrinterPass> {
>>    raw_ostream &OS;
>>
>> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Fri Mar 11
>> 04:22:49 2016
>> @@ -1430,14 +1430,16 @@ namespace llvm {
>>    };
>>
>>    /// \brief Analysis pass that exposes the \c ScalarEvolution for a
>> function.
>> -  struct ScalarEvolutionAnalysis : AnalysisBase<ScalarEvolutionAnalysis>
>> {
>> +  class ScalarEvolutionAnalysis : public
>> AnalysisBase<ScalarEvolutionAnalysis> {
>> +    friend AnalysisBase<ScalarEvolutionAnalysis>;
>> +    static char PassID;
>> +
>> +  public:
>>      typedef ScalarEvolution Result;
>>
>>      ScalarEvolution run(Function &F, AnalysisManager<Function> *AM);
>>    };
>>
>> -  extern template class AnalysisBase<ScalarEvolutionAnalysis>;
>> -
>>    /// \brief Printer pass for the \c ScalarEvolutionAnalysis results.
>>    class ScalarEvolutionPrinterPass
>>        : public PassBase<ScalarEvolutionPrinterPass> {
>>
>> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h
>> (original)
>> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h Fri
>> Mar 11 04:22:49 2016
>> @@ -38,7 +38,11 @@ private:
>>  };
>>
>>  /// Analysis pass providing a never-invalidated alias analysis result.
>> -struct SCEVAA : AnalysisBase<SCEVAA> {
>> +class SCEVAA : public AnalysisBase<SCEVAA> {
>> +  friend AnalysisBase<SCEVAA>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef SCEVAAResult Result;
>>
>>    SCEVAAResult run(Function &F, AnalysisManager<Function> *AM);
>>
>> Modified: llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h Fri Mar 11
>> 04:22:49 2016
>> @@ -47,7 +47,11 @@ private:
>>  };
>>
>>  /// Analysis pass providing a never-invalidated alias analysis result.
>> -struct ScopedNoAliasAA : AnalysisBase<ScopedNoAliasAA> {
>> +class ScopedNoAliasAA : public AnalysisBase<ScopedNoAliasAA> {
>> +  friend AnalysisBase<ScopedNoAliasAA>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef ScopedNoAliasAAResult Result;
>>
>>    ScopedNoAliasAAResult run(Function &F, AnalysisManager<Function> *AM);
>>
>> Modified: llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h Fri Mar 11
>> 04:22:49 2016
>> @@ -292,6 +292,9 @@ public:
>>    TargetLibraryInfo run(Function &F);
>>
>>  private:
>> +  friend AnalysisBase<TargetLibraryAnalysis>;
>> +  static char PassID;
>> +
>>    Optional<TargetLibraryInfoImpl> PresetInfoImpl;
>>
>>    StringMap<std::unique_ptr<TargetLibraryInfoImpl>> Impls;
>> @@ -299,8 +302,6 @@ private:
>>    TargetLibraryInfoImpl &lookupInfoImpl(Triple T);
>>  };
>>
>> -extern template class AnalysisBase<TargetLibraryAnalysis>;
>> -
>>  class TargetLibraryInfoWrapperPass : public ImmutablePass {
>>    TargetLibraryInfoImpl TLIImpl;
>>    TargetLibraryInfo TLI;
>>
>> Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h Fri Mar 11
>> 04:22:49 2016
>> @@ -922,6 +922,9 @@ public:
>>    Result run(const Function &F);
>>
>>  private:
>> +  friend AnalysisBase<TargetIRAnalysis>;
>> +  static char PassID;
>> +
>>    /// \brief The callback used to produce a result.
>>    ///
>>    /// We use a completely opaque callback so that targets can provide
>> whatever
>> @@ -938,8 +941,6 @@ private:
>>    static Result getDefaultTTI(const Function &F);
>>  };
>>
>> -extern template class AnalysisBase<TargetIRAnalysis>;
>> -
>>  /// \brief Wrapper pass for TargetTransformInfo.
>>  ///
>>  /// This pass can be constructed from a TTI object which it stores
>> internally
>>
>> Modified: llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h Fri Mar 11
>> 04:22:49 2016
>> @@ -48,7 +48,11 @@ private:
>>  };
>>
>>  /// Analysis pass providing a never-invalidated alias analysis result.
>> -struct TypeBasedAA : AnalysisBase<TypeBasedAA> {
>> +class TypeBasedAA : public AnalysisBase<TypeBasedAA> {
>> +  friend AnalysisBase<TypeBasedAA>;
>> +  static char PassID;
>> +
>> +public:
>>    typedef TypeBasedAAResult Result;
>>
>>    TypeBasedAAResult run(Function &F, AnalysisManager<Function> *AM);
>>
>> Modified: llvm/trunk/include/llvm/IR/Dominators.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Dominators.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/IR/Dominators.h (original)
>> +++ llvm/trunk/include/llvm/IR/Dominators.h Fri Mar 11 04:22:49 2016
>> @@ -182,7 +182,11 @@ template <> struct GraphTraits<Dominator
>>  };
>>
>>  /// \brief Analysis pass which computes a \c DominatorTree.
>> -struct DominatorTreeAnalysis : AnalysisBase<DominatorTreeAnalysis> {
>> +class DominatorTreeAnalysis : public AnalysisBase<DominatorTreeAnalysis>
>> {
>> +  friend AnalysisBase<DominatorTreeAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    /// \brief Provide the result typedef for this analysis pass.
>>    typedef DominatorTree Result;
>>
>> @@ -190,8 +194,6 @@ struct DominatorTreeAnalysis : AnalysisB
>>    DominatorTree run(Function &F);
>>  };
>>
>> -extern template class AnalysisBase<DominatorTreeAnalysis>;
>> -
>>  /// \brief Printer pass for the \c DominatorTree.
>>  class DominatorTreePrinterPass : public
>> PassBase<DominatorTreePrinterPass> {
>>    raw_ostream &OS;
>>
>> Modified: llvm/trunk/include/llvm/IR/PassManager.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/IR/PassManager.h (original)
>> +++ llvm/trunk/include/llvm/IR/PassManager.h Fri Mar 11 04:22:49 2016
>> @@ -183,17 +183,23 @@ template <typename DerivedT> struct Pass
>>  /// A CRTP mix-in base class to help define types that are valid
>> analyses.
>>  ///
>>  /// This provides some boiler plate for types that are analysis passes.
>> -template <typename DerivedT> class AnalysisBase : public
>> PassBase<DerivedT> {
>> -  static char PassID;
>> -
>> -public:
>> +template <typename DerivedT> struct AnalysisBase : PassBase<DerivedT> {
>>    /// Returns an opaque, unique ID for this pass type.
>> -  static void *ID() { return (void *)&PassID; }
>> +  ///
>> +  /// Note that this requires the derived type provide a static member
>> whose
>> +  /// address can be converted to a void pointer.
>> +  ///
>> +  /// FIXME: The only reason the derived type needs to provide this
>> rather than
>> +  /// this mixin providing it is due to broken implementations which
>> cannot
>> +  /// correctly unique a templated static so that they have the same
>> addresses
>> +  /// for each instantiation and are definitively emitted once for each
>> +  /// 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; }
>>  };
>>
>> -/// Private static data to provide unique ID.
>> -template <typename DerivedT> char AnalysisBase<DerivedT>::PassID;
>> -
>>  /// \brief Manages a sequence of passes over units of IR.
>>  ///
>>  /// A pass manager contains a sequence of passes to run over units of
>> IR. It is
>> @@ -740,17 +746,21 @@ public:
>>    Result run(IRUnitT &IR) { return Result(*AM); }
>>
>>  private:
>> +  friend AnalysisBase<InnerAnalysisManagerProxy<AnalysisManagerT,
>> IRUnitT>>;
>> +  static char PassID;
>> +
>>    AnalysisManagerT *AM;
>>  };
>>
>> +template <typename AnalysisManagerT, typename IRUnitT>
>> +char InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT>::PassID;
>> +
>>  extern template class InnerAnalysisManagerProxy<FunctionAnalysisManager,
>>                                                  Module>;
>>  /// Provide the \c FunctionAnalysisManager to \c Module proxy.
>>  typedef InnerAnalysisManagerProxy<FunctionAnalysisManager, Module>
>>      FunctionAnalysisManagerModuleProxy;
>>
>> -extern template class AnalysisBase<FunctionAnalysisManagerModuleProxy>;
>> -
>>  /// \brief A function analysis which acts as a proxy for a module
>> analysis
>>  /// manager.
>>  ///
>> @@ -808,9 +818,15 @@ public:
>>    Result run(IRUnitT &) { return Result(*AM); }
>>
>>  private:
>> +  friend AnalysisBase<OuterAnalysisManagerProxy<AnalysisManagerT,
>> IRUnitT>>;
>> +  static char PassID;
>> +
>>    const AnalysisManagerT *AM;
>>  };
>>
>> +template <typename AnalysisManagerT, typename IRUnitT>
>> +char OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT>::PassID;
>> +
>>  extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
>>                                                  Function>;
>>  /// Provide the \c ModuleAnalysisManager to \c Fucntion proxy.
>>
>> Modified: llvm/trunk/lib/Analysis/AliasAnalysis.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/AliasAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/AliasAnalysis.cpp Fri Mar 11 04:22:49 2016
>> @@ -504,7 +504,7 @@ bool AAResults::canInstructionRangeModRe
>>  AAResults::Concept::~Concept() {}
>>
>>  // Provide a definition for the static object used to identify passes.
>> -template class llvm::AnalysisBase<AAManager>;
>> +char AAManager::PassID;
>>
>>  namespace {
>>  /// A wrapper pass for external alias analyses. This just squirrels away
>> the
>>
>> Modified: llvm/trunk/lib/Analysis/AssumptionCache.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AssumptionCache.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/AssumptionCache.cpp (original)
>> +++ llvm/trunk/lib/Analysis/AssumptionCache.cpp Fri Mar 11 04:22:49 2016
>> @@ -74,7 +74,7 @@ void AssumptionCache::registerAssumption
>>  #endif
>>  }
>>
>> -template class llvm::AnalysisBase<AssumptionAnalysis>;
>> +char AssumptionAnalysis::PassID;
>>
>>  PreservedAnalyses AssumptionPrinterPass::run(Function &F,
>>                                               AnalysisManager<Function>
>> *AM) {
>>
>> Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Fri Mar 11 04:22:49
>> 2016
>> @@ -1606,6 +1606,8 @@ bool BasicAAResult::constantOffsetHeuris
>>  // BasicAliasAnalysis Pass
>>
>>  //===----------------------------------------------------------------------===//
>>
>> +char BasicAA::PassID;
>> +
>>  BasicAAResult BasicAA::run(Function &F, AnalysisManager<Function> *AM) {
>>    return BasicAAResult(F.getParent()->getDataLayout(),
>>                         AM->getResult<TargetLibraryAnalysis>(F),
>>
>> Modified: llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp Fri Mar 11 04:22:49 2016
>> @@ -1088,6 +1088,8 @@ AliasResult CFLAAResult::query(const Mem
>>    return NoAlias;
>>  }
>>
>> +char CFLAA::PassID;
>> +
>>  CFLAAResult CFLAA::run(Function &F, AnalysisManager<Function> *AM) {
>>    return CFLAAResult();
>>  }
>>
>> Modified: llvm/trunk/lib/Analysis/CGSCCPassManager.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CGSCCPassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/CGSCCPassManager.cpp (original)
>> +++ llvm/trunk/lib/Analysis/CGSCCPassManager.cpp Fri Mar 11 04:22:49 2016
>> @@ -18,12 +18,9 @@ namespace llvm {
>>  template class PassManager<LazyCallGraph::SCC>;
>>  template class AnalysisManager<LazyCallGraph::SCC>;
>>  template class InnerAnalysisManagerProxy<CGSCCAnalysisManager, Module>;
>> -template class AnalysisBase<CGSCCAnalysisManagerModuleProxy>;
>>  template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
>>                                           LazyCallGraph::SCC>;
>> -template class AnalysisBase<ModuleAnalysisManagerCGSCCProxy>;
>>  template class InnerAnalysisManagerProxy<FunctionAnalysisManager,
>>                                           LazyCallGraph::SCC>;
>> -template class AnalysisBase<FunctionAnalysisManagerCGSCCProxy>;
>>  template class OuterAnalysisManagerProxy<CGSCCAnalysisManager, Function>;
>>  }
>>
>> Modified: llvm/trunk/lib/Analysis/CallGraph.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CallGraph.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/CallGraph.cpp (original)
>> +++ llvm/trunk/lib/Analysis/CallGraph.cpp Fri Mar 11 04:22:49 2016
>> @@ -260,7 +260,7 @@ void CallGraphNode::replaceCallEdge(Call
>>  }
>>
>>  // Provide an explicit template instantiation for the static ID.
>> -template class llvm::AnalysisBase<CallGraphAnalysis>;
>> +char CallGraphAnalysis::PassID;
>>
>>  PreservedAnalyses CallGraphPrinterPass::run(Module &M,
>>                                              AnalysisManager<Module> *AM)
>> {
>>
>> Modified: llvm/trunk/lib/Analysis/DominanceFrontier.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DominanceFrontier.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/DominanceFrontier.cpp (original)
>> +++ llvm/trunk/lib/Analysis/DominanceFrontier.cpp Fri Mar 11 04:22:49 2016
>> @@ -56,7 +56,7 @@ LLVM_DUMP_METHOD void DominanceFrontierW
>>  }
>>  #endif
>>
>> -template class llvm::AnalysisBase<DominanceFrontierAnalysis>;
>> +char DominanceFrontierAnalysis::PassID;
>>
>>  DominanceFrontier DominanceFrontierAnalysis::run(Function &F,
>>                                                   FunctionAnalysisManager
>> *AM) {
>>
>> Modified: llvm/trunk/lib/Analysis/GlobalsModRef.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/GlobalsModRef.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/GlobalsModRef.cpp (original)
>> +++ llvm/trunk/lib/Analysis/GlobalsModRef.cpp Fri Mar 11 04:22:49 2016
>> @@ -936,6 +936,8 @@ GlobalsAAResult::analyzeModule(Module &M
>>    return Result;
>>  }
>>
>> +char GlobalsAA::PassID;
>> +
>>  GlobalsAAResult GlobalsAA::run(Module &M, AnalysisManager<Module> *AM) {
>>    return GlobalsAAResult::analyzeModule(M,
>>
>>  AM->getResult<TargetLibraryAnalysis>(M),
>>
>> Modified: llvm/trunk/lib/Analysis/LazyCallGraph.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/LazyCallGraph.cpp (original)
>> +++ llvm/trunk/lib/Analysis/LazyCallGraph.cpp Fri Mar 11 04:22:49 2016
>> @@ -1499,7 +1499,7 @@ LazyCallGraph::RefSCC *LazyCallGraph::ge
>>    }
>>  }
>>
>> -template class llvm::AnalysisBase<LazyCallGraphAnalysis>;
>> +char LazyCallGraphAnalysis::PassID;
>>
>>  LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) :
>> OS(OS) {}
>>
>>
>> Modified: llvm/trunk/lib/Analysis/LoopInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/LoopInfo.cpp (original)
>> +++ llvm/trunk/lib/Analysis/LoopInfo.cpp Fri Mar 11 04:22:49 2016
>> @@ -641,7 +641,7 @@ void LoopInfo::markAsRemoved(Loop *Unloo
>>    }
>>  }
>>
>> -template class llvm::AnalysisBase<LoopAnalysis>;
>> +char LoopAnalysis::PassID;
>>
>>  LoopInfo LoopAnalysis::run(Function &F, AnalysisManager<Function> *AM) {
>>    // FIXME: Currently we create a LoopInfo from scratch for every
>> function.
>>
>> Modified: llvm/trunk/lib/Analysis/LoopPassManager.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/LoopPassManager.cpp (original)
>> +++ llvm/trunk/lib/Analysis/LoopPassManager.cpp Fri Mar 11 04:22:49 2016
>> @@ -16,6 +16,5 @@ namespace llvm {
>>  template class PassManager<Loop>;
>>  template class AnalysisManager<Loop>;
>>  template class InnerAnalysisManagerProxy<LoopAnalysisManager, Function>;
>> -template class AnalysisBase<LoopAnalysisManagerFunctionProxy>;
>>  template class OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop>;
>>  }
>>
>> Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Fri Mar 11
>> 04:22:49 2016
>> @@ -1659,6 +1659,8 @@ void MemoryDependenceResults::verifyRemo
>>  #endif
>>  }
>>
>> +char MemoryDependenceAnalysis::PassID;
>> +
>>  MemoryDependenceResults
>>  MemoryDependenceAnalysis::run(Function &F, AnalysisManager<Function>
>> *AM) {
>>    auto &AA = AM->getResult<AAManager>(F);
>>
>> Modified: llvm/trunk/lib/Analysis/PostDominators.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PostDominators.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/PostDominators.cpp (original)
>> +++ llvm/trunk/lib/Analysis/PostDominators.cpp Fri Mar 11 04:22:49 2016
>> @@ -44,7 +44,7 @@ FunctionPass* llvm::createPostDomTree()
>>    return new PostDominatorTreeWrapperPass();
>>  }
>>
>> -template class llvm::AnalysisBase<PostDominatorTreeAnalysis>;
>> +char PostDominatorTreeAnalysis::PassID;
>>
>>  PostDominatorTree PostDominatorTreeAnalysis::run(Function &F) {
>>    PostDominatorTree PDT;
>>
>> Modified: llvm/trunk/lib/Analysis/RegionInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/RegionInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/RegionInfo.cpp (original)
>> +++ llvm/trunk/lib/Analysis/RegionInfo.cpp Fri Mar 11 04:22:49 2016
>> @@ -185,7 +185,7 @@ namespace llvm {
>>  // RegionInfoAnalysis implementation
>>  //
>>
>> -template class llvm::AnalysisBase<RegionInfoAnalysis>;
>> +char RegionInfoAnalysis::PassID;
>>
>>  RegionInfo RegionInfoAnalysis::run(Function &F,
>> AnalysisManager<Function> *AM) {
>>    RegionInfo RI;
>>
>> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Mar 11 04:22:49 2016
>> @@ -9730,7 +9730,7 @@ void ScalarEvolution::verify() const {
>>    // TODO: Verify more things.
>>  }
>>
>> -template class llvm::AnalysisBase<ScalarEvolutionAnalysis>;
>> +char ScalarEvolutionAnalysis::PassID;
>>
>>  ScalarEvolution ScalarEvolutionAnalysis::run(Function &F,
>>                                               AnalysisManager<Function>
>> *AM) {
>>
>> Modified: llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp Fri Mar 11
>> 04:22:49 2016
>> @@ -110,6 +110,8 @@ Value *SCEVAAResult::GetBaseValue(const
>>    return nullptr;
>>  }
>>
>> +char SCEVAA::PassID;
>> +
>>  SCEVAAResult SCEVAA::run(Function &F, AnalysisManager<Function> *AM) {
>>    return SCEVAAResult(AM->getResult<ScalarEvolutionAnalysis>(F));
>>  }
>>
>> Modified: llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp Fri Mar 11 04:22:49 2016
>> @@ -172,6 +172,8 @@ bool ScopedNoAliasAAResult::mayAliasInSc
>>    return true;
>>  }
>>
>> +char ScopedNoAliasAA::PassID;
>> +
>>  ScopedNoAliasAAResult ScopedNoAliasAA::run(Function &F,
>>                                             AnalysisManager<Function>
>> *AM) {
>>    return ScopedNoAliasAAResult();
>>
>> Modified: llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp (original)
>> +++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp Fri Mar 11 04:22:49 2016
>> @@ -636,7 +636,7 @@ TargetLibraryInfoWrapperPass::TargetLibr
>>
>>  initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
>>  }
>>
>> -template class llvm::AnalysisBase<TargetLibraryAnalysis>;
>> +char TargetLibraryAnalysis::PassID;
>>
>>  // Register the basic pass.
>>  INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
>>
>> Modified: llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetTransformInfo.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/TargetTransformInfo.cpp (original)
>> +++ llvm/trunk/lib/Analysis/TargetTransformInfo.cpp Fri Mar 11 04:22:49
>> 2016
>> @@ -377,7 +377,7 @@ TargetIRAnalysis::Result TargetIRAnalysi
>>    return TTICallback(F);
>>  }
>>
>> -template class llvm::AnalysisBase<TargetIRAnalysis>;
>> +char TargetIRAnalysis::PassID;
>>
>>  TargetIRAnalysis::Result TargetIRAnalysis::getDefaultTTI(const Function
>> &F) {
>>    return Result(F.getParent()->getDataLayout());
>>
>> Modified: llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp Fri Mar 11
>> 04:22:49 2016
>> @@ -583,6 +583,8 @@ bool TypeBasedAAResult::PathAliases(cons
>>    return false;
>>  }
>>
>> +char TypeBasedAA::PassID;
>> +
>>  TypeBasedAAResult TypeBasedAA::run(Function &F,
>> AnalysisManager<Function> *AM) {
>>    return TypeBasedAAResult();
>>  }
>>
>> Modified: llvm/trunk/lib/IR/Dominators.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Dominators.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/Dominators.cpp (original)
>> +++ llvm/trunk/lib/IR/Dominators.cpp Fri Mar 11 04:22:49 2016
>> @@ -308,7 +308,7 @@ DominatorTree DominatorTreeAnalysis::run
>>    return DT;
>>  }
>>
>> -template class llvm::AnalysisBase<DominatorTreeAnalysis>;
>> +char DominatorTreeAnalysis::PassID;
>>
>>  DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) :
>> OS(OS) {}
>>
>>
>> Modified: llvm/trunk/lib/IR/PassManager.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/PassManager.cpp (original)
>> +++ llvm/trunk/lib/IR/PassManager.cpp Fri Mar 11 04:22:49 2016
>> @@ -20,6 +20,5 @@ template class PassManager<Function>;
>>  template class AnalysisManager<Module>;
>>  template class AnalysisManager<Function>;
>>  template class InnerAnalysisManagerProxy<FunctionAnalysisManager,
>> Module>;
>> -template class AnalysisBase<FunctionAnalysisManagerModuleProxy>;
>>  template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
>> Function>;
>>  }
>>
>> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
>> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Fri Mar 11 04:22:49 2016
>> @@ -70,7 +70,11 @@ struct NoOpModulePass {
>>  };
>>
>>  /// \brief No-op module analysis.
>> -struct NoOpModuleAnalysis : AnalysisBase<NoOpModuleAnalysis> {
>> +class NoOpModuleAnalysis : public AnalysisBase<NoOpModuleAnalysis> {
>> +  friend AnalysisBase<NoOpModuleAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    struct Result {};
>>    Result run(Module &) { return Result(); }
>>    static StringRef name() { return "NoOpModuleAnalysis"; }
>> @@ -85,7 +89,11 @@ struct NoOpCGSCCPass {
>>  };
>>
>>  /// \brief No-op CGSCC analysis.
>> -struct NoOpCGSCCAnalysis : AnalysisBase<NoOpCGSCCAnalysis> {
>> +class NoOpCGSCCAnalysis : public AnalysisBase<NoOpCGSCCAnalysis> {
>> +  friend AnalysisBase<NoOpCGSCCAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    struct Result {};
>>    Result run(LazyCallGraph::SCC &) { return Result(); }
>>    static StringRef name() { return "NoOpCGSCCAnalysis"; }
>> @@ -98,7 +106,11 @@ struct NoOpFunctionPass {
>>  };
>>
>>  /// \brief No-op function analysis.
>> -struct NoOpFunctionAnalysis : AnalysisBase<NoOpFunctionAnalysis> {
>> +class NoOpFunctionAnalysis : public AnalysisBase<NoOpFunctionAnalysis> {
>> +  friend AnalysisBase<NoOpFunctionAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    struct Result {};
>>    Result run(Function &) { return Result(); }
>>    static StringRef name() { return "NoOpFunctionAnalysis"; }
>> @@ -111,12 +123,21 @@ struct NoOpLoopPass {
>>  };
>>
>>  /// \brief No-op loop analysis.
>> -struct NoOpLoopAnalysis : AnalysisBase<NoOpLoopAnalysis> {
>> +class NoOpLoopAnalysis : public AnalysisBase<NoOpLoopAnalysis> {
>> +  friend AnalysisBase<NoOpLoopAnalysis>;
>> +  static char PassID;
>> +
>> +public:
>>    struct Result {};
>>    Result run(Loop &) { return Result(); }
>>    static StringRef name() { return "NoOpLoopAnalysis"; }
>>  };
>>
>> +char NoOpModuleAnalysis::PassID;
>> +char NoOpCGSCCAnalysis::PassID;
>> +char NoOpFunctionAnalysis::PassID;
>> +char NoOpLoopAnalysis::PassID;
>> +
>>  } // End anonymous namespace.
>>
>>  void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {
>>
>> Modified: llvm/trunk/unittests/IR/PassManagerTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PassManagerTest.cpp?rev=263216&r1=263215&r2=263216&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/unittests/IR/PassManagerTest.cpp (original)
>> +++ llvm/trunk/unittests/IR/PassManagerTest.cpp Fri Mar 11 04:22:49 2016
>> @@ -40,9 +40,14 @@ public:
>>    }
>>
>>  private:
>> +  friend AnalysisBase<TestFunctionAnalysis>;
>> +  static char PassID;
>> +
>>    int &Runs;
>>  };
>>
>> +char TestFunctionAnalysis::PassID;
>> +
>>  class TestModuleAnalysis : public AnalysisBase<TestModuleAnalysis> {
>>  public:
>>    struct Result {
>> @@ -61,9 +66,14 @@ public:
>>    }
>>
>>  private:
>> +  friend AnalysisBase<TestModuleAnalysis>;
>> +  static char PassID;
>> +
>>    int &Runs;
>>  };
>>
>> +char TestModuleAnalysis::PassID;
>> +
>>  struct TestModulePass : PassBase<TestModulePass> {
>>    TestModulePass(int &RunCount) : RunCount(RunCount) {}
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160329/16c9147c/attachment.html>


More information about the llvm-commits mailing list