[llvm] r262004 - [PM] Introduce CRTP mixin base classes to help define passes and

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 26 20:28:47 PST 2016


On Fri, Feb 26, 2016 at 7:09 PM, Chandler Carruth <chandlerc at gmail.com>
wrote:

> On Fri, Feb 26, 2016 at 8:10 AM David Blaikie <dblaikie at gmail.com> wrote:
>
>> Awesome! - though I'm curious why you chose to place this detail in the
>> pass implementations, rather than hardcoding it into the pass manager
>> itself? (it's a win, no doubt - trading some boilerplate for less
>> boilerplate, but it seems like it could remove the boilerplate entirely if
>> the pass manager did this work itself instead)
>>
>
> Because it lets passes customize the behavior if desired. For example, the
> NoOp passes and analyses avoid the ugly anonymous namespace prefix by
> supplying their own name. It seemed like a nice tradeoff in that sense.
>

Eh, fair enough.

Would a template (that users could specialize) work too (removing the
boilerplate, but making it opt-in)? (or something like std::swap -
overloaded & with ADL)

No big deal, just tossing around some ideas.


>
>
>>
>> On Fri, Feb 26, 2016 at 3:44 AM, Chandler Carruth via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: chandlerc
>>> Date: Fri Feb 26 05:44:45 2016
>>> New Revision: 262004
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=262004&view=rev
>>> Log:
>>> [PM] Introduce CRTP mixin base classes to help define passes and
>>> analyses in the new pass manager.
>>>
>>> These just handle really basic stuff: turning a type name into a string
>>> statically that is nice to print in logs, and getting a static unique ID
>>> for each analysis.
>>>
>>> Sadly, the format of passes in anonymous namespaces makes using their
>>> names in tests really annoying so I've customized the names of the no-op
>>> passes to keep tests sane to read.
>>>
>>> This is the first of a few simplifying refactorings for the new pass
>>> manager that should reduce boilerplate and confusion.
>>>
>>> Modified:
>>>     llvm/trunk/include/llvm/Analysis/AliasAnalysis.h
>>>     llvm/trunk/include/llvm/Analysis/AliasAnalysisEvaluator.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/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/include/llvm/IR/Verifier.h
>>>     llvm/trunk/include/llvm/Transforms/IPO/ForceFunctionAttrs.h
>>>     llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h
>>>     llvm/trunk/include/llvm/Transforms/IPO/InferFunctionAttrs.h
>>>     llvm/trunk/include/llvm/Transforms/IPO/StripDeadPrototypes.h
>>>     llvm/trunk/include/llvm/Transforms/InstCombine/InstCombine.h
>>>     llvm/trunk/include/llvm/Transforms/Scalar/ADCE.h
>>>     llvm/trunk/include/llvm/Transforms/Scalar/EarlyCSE.h
>>>     llvm/trunk/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h
>>>     llvm/trunk/include/llvm/Transforms/Scalar/SROA.h
>>>     llvm/trunk/include/llvm/Transforms/Scalar/SimplifyCFG.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/ObjCARCAliasAnalysis.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/test/Other/new-pass-manager.ll
>>>     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=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Fri Feb 26 05:44:45
>>> 2016
>>> @@ -979,16 +979,10 @@ bool isIdentifiedFunctionLocal(const Val
>>>  /// This manager effectively wraps the AnalysisManager for registering
>>> alias
>>>  /// analyses. When you register your alias analysis with this manager,
>>> it will
>>>  /// ensure the analysis itself is registered with its AnalysisManager.
>>> -class AAManager {
>>> +class AAManager : public AnalysisBase<AAManager> {
>>>  public:
>>>    typedef AAResults Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  /// \brief Provide access to a name for this pass.
>>> -  static StringRef name() { return "AAManager"; }
>>> -
>>>    // This type hase value semantics. We have to spell these out because
>>> MSVC
>>>    // won't synthesize them.
>>>    AAManager() {}
>>> @@ -1018,8 +1012,6 @@ public:
>>>    }
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    SmallVector<void (*)(Function &F, AnalysisManager<Function> &AM,
>>>                         AAResults &AAResults),
>>>                4> FunctionResultGetters;
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysisEvaluator.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysisEvaluator.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/AliasAnalysisEvaluator.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/AliasAnalysisEvaluator.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -26,7 +26,7 @@
>>>  namespace llvm {
>>>  class AAResults;
>>>
>>> -class AAEvaluator {
>>> +class AAEvaluator : public PassBase<AAEvaluator> {
>>>    int64_t FunctionCount;
>>>    int64_t NoAliasCount, MayAliasCount, PartialAliasCount,
>>> MustAliasCount;
>>>    int64_t NoModRefCount, ModCount, RefCount, ModRefCount;
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/AssumptionCache.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AssumptionCache.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/AssumptionCache.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/AssumptionCache.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -93,18 +93,9 @@ public:
>>>  ///
>>>  /// This analysis is intended for use with the new pass manager and
>>> will vend
>>>  /// assumption caches for a given function.
>>> -class AssumptionAnalysis {
>>> -  static char PassID;
>>> -
>>> -public:
>>> +struct AssumptionAnalysis : AnalysisBase<AssumptionAnalysis> {
>>>    typedef AssumptionCache Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  /// \brief Provide a name for the analysis for debugging and logging.
>>> -  static StringRef name() { return "AssumptionAnalysis"; }
>>> -
>>>    AssumptionAnalysis() {}
>>>    AssumptionAnalysis(const AssumptionAnalysis &Arg) {}
>>>    AssumptionAnalysis(AssumptionAnalysis &&Arg) {}
>>> @@ -115,7 +106,7 @@ public:
>>>  };
>>>
>>>  /// \brief Printer pass for the \c AssumptionAnalysis results.
>>> -class AssumptionPrinterPass {
>>> +class AssumptionPrinterPass : public PassBase<AssumptionPrinterPass> {
>>>    raw_ostream &OS;
>>>
>>>  public:
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/BasicAliasAnalysis.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -178,20 +178,10 @@ private:
>>>  };
>>>
>>>  /// Analysis pass providing a never-invalidated alias analysis result.
>>> -class BasicAA {
>>> -public:
>>> +struct BasicAA : AnalysisBase<BasicAA> {
>>>    typedef BasicAAResult Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "BasicAA"; }
>>> -
>>>    BasicAAResult run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// Legacy wrapper pass to provide the BasicAAResult object.
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/CFLAliasAnalysis.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -109,20 +109,10 @@ 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.
>>> -class CFLAA {
>>> -public:
>>> +struct CFLAA : AnalysisBase<CFLAA> {
>>>    typedef CFLAAResult Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    CFLAAResult run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "CFLAA"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// Legacy wrapper pass to provide the CFLAAResult object.
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/CGSCCPassManager.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -52,7 +52,8 @@ typedef AnalysisManager<LazyCallGraph::S
>>>  ///
>>>  /// Note that the proxy's result is a move-only object and represents
>>> ownership
>>>  /// of the validity of the analyses in the \c CGSCCAnalysisManager it
>>> provides.
>>> -class CGSCCAnalysisManagerModuleProxy {
>>> +class CGSCCAnalysisManagerModuleProxy
>>> +    : public AnalysisBase<CGSCCAnalysisManagerModuleProxy> {
>>>  public:
>>>    class Result {
>>>    public:
>>> @@ -92,10 +93,6 @@ public:
>>>      CGSCCAnalysisManager *CGAM;
>>>    };
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return "CGSCCAnalysisManagerModuleProxy"; }
>>> -
>>>    explicit CGSCCAnalysisManagerModuleProxy(CGSCCAnalysisManager &CGAM)
>>>        : CGAM(&CGAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -122,8 +119,6 @@ public:
>>>    Result run(Module &M);
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    CGSCCAnalysisManager *CGAM;
>>>  };
>>>
>>> @@ -139,7 +134,8 @@ private:
>>>  /// This proxy *doesn't* manage the invalidation in any way. That is
>>> handled by
>>>  /// the recursive return path of each layer of the pass manager and the
>>>  /// returned PreservedAnalysis set.
>>> -class ModuleAnalysisManagerCGSCCProxy {
>>> +class ModuleAnalysisManagerCGSCCProxy
>>> +    : public AnalysisBase<ModuleAnalysisManagerCGSCCProxy> {
>>>  public:
>>>    /// \brief Result proxy object for \c ModuleAnalysisManagerCGSCCProxy.
>>>    class Result {
>>> @@ -163,10 +159,6 @@ public:
>>>      const ModuleAnalysisManager *MAM;
>>>    };
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return "ModuleAnalysisManagerCGSCCProxy"; }
>>> -
>>>    ModuleAnalysisManagerCGSCCProxy(const ModuleAnalysisManager &MAM)
>>>        : MAM(&MAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -187,8 +179,6 @@ public:
>>>    Result run(LazyCallGraph::SCC &) { return Result(*MAM); }
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    const ModuleAnalysisManager *MAM;
>>>  };
>>>
>>> @@ -201,7 +191,9 @@ private:
>>>  /// \c CGSCCAnalysisManagerModuleProxy analysis prior to running the
>>> CGSCC
>>>  /// pass over the module to enable a \c FunctionAnalysisManager to be
>>> used
>>>  /// within this run safely.
>>> -template <typename CGSCCPassT> class ModuleToPostOrderCGSCCPassAdaptor {
>>> +template <typename CGSCCPassT>
>>> +class ModuleToPostOrderCGSCCPassAdaptor
>>> +    : public PassBase<ModuleToPostOrderCGSCCPassAdaptor<CGSCCPassT>> {
>>>  public:
>>>    explicit ModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass)
>>>        : Pass(std::move(Pass)) {}
>>> @@ -262,8 +254,6 @@ public:
>>>      return PA;
>>>    }
>>>
>>> -  static StringRef name() { return "ModuleToPostOrderCGSCCPassAdaptor";
>>> }
>>> -
>>>  private:
>>>    CGSCCPassT Pass;
>>>  };
>>> @@ -288,7 +278,8 @@ createModuleToPostOrderCGSCCPassAdaptor(
>>>  /// Note that the proxy's result is a move-only object and represents
>>> ownership
>>>  /// of the validity of the analyses in the \c FunctionAnalysisManager it
>>>  /// provides.
>>> -class FunctionAnalysisManagerCGSCCProxy {
>>> +class FunctionAnalysisManagerCGSCCProxy
>>> +    : public AnalysisBase<FunctionAnalysisManagerCGSCCProxy> {
>>>  public:
>>>    class Result {
>>>    public:
>>> @@ -328,10 +319,6 @@ public:
>>>      FunctionAnalysisManager *FAM;
>>>    };
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return "FunctionAnalysisManagerCGSCCProxy";
>>> }
>>> -
>>>    explicit FunctionAnalysisManagerCGSCCProxy(FunctionAnalysisManager
>>> &FAM)
>>>        : FAM(&FAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -359,8 +346,6 @@ public:
>>>    Result run(LazyCallGraph::SCC &C);
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    FunctionAnalysisManager *FAM;
>>>  };
>>>
>>> @@ -376,7 +361,8 @@ private:
>>>  /// This proxy *doesn't* manage the invalidation in any way. That is
>>> handled by
>>>  /// the recursive return path of each layer of the pass manager and the
>>>  /// returned PreservedAnalysis set.
>>> -class CGSCCAnalysisManagerFunctionProxy {
>>> +class CGSCCAnalysisManagerFunctionProxy
>>> +    : public AnalysisBase<CGSCCAnalysisManagerFunctionProxy> {
>>>  public:
>>>    /// \brief Result proxy object for \c
>>> CGSCCAnalysisManagerFunctionProxy.
>>>    class Result {
>>> @@ -400,10 +386,6 @@ public:
>>>      const CGSCCAnalysisManager *CGAM;
>>>    };
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return "CGSCCAnalysisManagerFunctionProxy";
>>> }
>>> -
>>>    CGSCCAnalysisManagerFunctionProxy(const CGSCCAnalysisManager &CGAM)
>>>        : CGAM(&CGAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -425,8 +407,6 @@ public:
>>>    Result run(Function &) { return Result(*CGAM); }
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    const CGSCCAnalysisManager *CGAM;
>>>  };
>>>
>>> @@ -438,7 +418,9 @@ private:
>>>  /// \c FunctionAnalysisManagerCGSCCProxy analysis prior to running the
>>> function
>>>  /// pass over the SCC to enable a \c FunctionAnalysisManager to be used
>>>  /// within this run safely.
>>> -template <typename FunctionPassT> class CGSCCToFunctionPassAdaptor {
>>> +template <typename FunctionPassT>
>>> +class CGSCCToFunctionPassAdaptor
>>> +    : public PassBase<CGSCCToFunctionPassAdaptor<FunctionPassT>> {
>>>  public:
>>>    explicit CGSCCToFunctionPassAdaptor(FunctionPassT Pass)
>>>        : Pass(std::move(Pass)) {}
>>> @@ -492,8 +474,6 @@ public:
>>>      return PA;
>>>    }
>>>
>>> -  static StringRef name() { return "CGSCCToFunctionPassAdaptor"; }
>>> -
>>>  private:
>>>    FunctionPassT Pass;
>>>  };
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/CallGraph.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CallGraph.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/CallGraph.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/CallGraph.h Fri Feb 26 05:44:45 2016
>>> @@ -57,6 +57,7 @@
>>>  #include "llvm/IR/CallSite.h"
>>>  #include "llvm/IR/Function.h"
>>>  #include "llvm/IR/Intrinsics.h"
>>> +#include "llvm/IR/PassManager.h"
>>>  #include "llvm/IR/ValueHandle.h"
>>>  #include "llvm/Pass.h"
>>>  #include <map>
>>> @@ -294,20 +295,15 @@ 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.
>>> -class CallGraphAnalysis {
>>> +struct CallGraphAnalysis : AnalysisBase<CallGraphAnalysis> {
>>>  public:
>>>    /// \brief A formulaic typedef to inform clients of the result type.
>>>    typedef CallGraph Result;
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    /// \brief Compute the \c CallGraph for the module \c M.
>>>    ///
>>>    /// The real work here is done in the \c CallGraph constructor.
>>>    CallGraph run(Module *M) { return CallGraph(*M); }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// \brief The \c ModulePass which wraps up a \c CallGraph and the
>>> logic to
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/DominanceFrontier.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DominanceFrontier.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/DominanceFrontier.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/DominanceFrontier.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -168,33 +168,22 @@ extern template class DominanceFrontierB
>>>  extern template class ForwardDominanceFrontierBase<BasicBlock>;
>>>
>>>  /// \brief Analysis pass which computes a \c DominanceFrontier.
>>> -class DominanceFrontierAnalysis {
>>> -public:
>>> +struct DominanceFrontierAnalysis :
>>> AnalysisBase<DominanceFrontierAnalysis> {
>>>    /// \brief Provide the result typedef for this analysis pass.
>>>    typedef DominanceFrontier Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    /// \brief Run the analysis pass over a function and produce a
>>> dominator tree.
>>>    DominanceFrontier run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "DominanceFrontierAnalysis"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// \brief Printer pass for the \c DominanceFrontier.
>>> -class DominanceFrontierPrinterPass {
>>> +class DominanceFrontierPrinterPass
>>> +    : public PassBase<DominanceFrontierPrinterPass> {
>>>    raw_ostream &OS;
>>>
>>>  public:
>>>    explicit DominanceFrontierPrinterPass(raw_ostream &OS);
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  static StringRef name() { return "DominanceFrontierAnalysis"; }
>>>  };
>>>
>>>  } // End llvm namespace
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/GlobalsModRef.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/GlobalsModRef.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/GlobalsModRef.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/GlobalsModRef.h Fri Feb 26 05:44:45
>>> 2016
>>> @@ -116,20 +116,10 @@ private:
>>>  };
>>>
>>>  /// Analysis pass providing a never-invalidated alias analysis result.
>>> -class GlobalsAA {
>>> -public:
>>> +struct GlobalsAA : AnalysisBase<GlobalsAA> {
>>>    typedef GlobalsAAResult Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    GlobalsAAResult run(Module &M, AnalysisManager<Module> *AM);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "GlobalsAA"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// Legacy wrapper pass to provide the GlobalsAAResult object.
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/LazyCallGraph.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LazyCallGraph.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/LazyCallGraph.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/LazyCallGraph.h Fri Feb 26 05:44:45
>>> 2016
>>> @@ -895,37 +895,27 @@ template <> struct GraphTraits<LazyCallG
>>>  };
>>>
>>>  /// An analysis pass which computes the call graph for a module.
>>> -class LazyCallGraphAnalysis {
>>> -public:
>>> +struct LazyCallGraphAnalysis : AnalysisBase<LazyCallGraphAnalysis> {
>>>    /// Inform generic clients of the result type.
>>>    typedef LazyCallGraph Result;
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return "Lazy CallGraph Analysis"; }
>>> -
>>>    /// Compute the \c LazyCallGraph for the module \c M.
>>>    ///
>>>    /// This just builds the set of entry points to the call graph. The
>>> rest is
>>>    /// built lazily as it is walked.
>>>    LazyCallGraph run(Module &M) { return LazyCallGraph(M); }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// A pass which prints the call graph to a \c raw_ostream.
>>>  ///
>>>  /// This is primarily useful for testing the analysis.
>>> -class LazyCallGraphPrinterPass {
>>> +class LazyCallGraphPrinterPass : public
>>> PassBase<LazyCallGraphPrinterPass> {
>>>    raw_ostream &OS;
>>>
>>>  public:
>>>    explicit LazyCallGraphPrinterPass(raw_ostream &OS);
>>>
>>>    PreservedAnalyses run(Module &M, ModuleAnalysisManager *AM);
>>> -
>>> -  static StringRef name() { return "LazyCallGraphPrinterPass"; }
>>>  };
>>>
>>>  }
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/LoopInfo.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/LoopInfo.h Fri Feb 26 05:44:45 2016
>>> @@ -787,30 +787,19 @@ template <> struct GraphTraits<Loop*> {
>>>  };
>>>
>>>  /// \brief Analysis pass that exposes the \c LoopInfo for a function.
>>> -class LoopAnalysis {
>>> -  static char PassID;
>>> -
>>> -public:
>>> +struct LoopAnalysis : AnalysisBase<LoopAnalysis> {
>>>    typedef LoopInfo Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  /// \brief Provide a name for the analysis for debugging and logging.
>>> -  static StringRef name() { return "LoopAnalysis"; }
>>> -
>>>    LoopInfo run(Function &F, AnalysisManager<Function> *AM);
>>>  };
>>>
>>>  /// \brief Printer pass for the \c LoopAnalysis results.
>>> -class LoopPrinterPass {
>>> +class LoopPrinterPass : public PassBase<LoopPrinterPass> {
>>>    raw_ostream &OS;
>>>
>>>  public:
>>>    explicit LoopPrinterPass(raw_ostream &OS) : OS(OS) {}
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  static StringRef name() { return "LoopPrinterPass"; }
>>>  };
>>>
>>>  /// \brief The legacy pass manager's analysis pass to compute loop
>>> information.
>>> @@ -840,7 +829,7 @@ public:
>>>  };
>>>
>>>  /// \brief Pass for printing a loop's contents as LLVM's text IR
>>> assembly.
>>> -class PrintLoopPass {
>>> +class PrintLoopPass : public PassBase<PrintLoopPass> {
>>>    raw_ostream &OS;
>>>    std::string Banner;
>>>
>>> @@ -849,7 +838,6 @@ public:
>>>    PrintLoopPass(raw_ostream &OS, const std::string &Banner = "");
>>>
>>>    PreservedAnalyses run(Loop &L);
>>> -  static StringRef name() { return "PrintLoopPass"; }
>>>  };
>>>
>>>  } // End llvm namespace
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/LoopPassManager.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopPassManager.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/LoopPassManager.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/LoopPassManager.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -44,7 +44,8 @@ typedef AnalysisManager<Loop> LoopAnalys
>>>  /// never use a loop analysis manager from within (transitively) a
>>> function
>>>  /// pass manager unless your parent function pass has received a proxy
>>> result
>>>  /// object for it.
>>> -class LoopAnalysisManagerFunctionProxy {
>>> +class LoopAnalysisManagerFunctionProxy
>>> +    : public AnalysisBase<LoopAnalysisManagerFunctionProxy> {
>>>  public:
>>>    class Result {
>>>    public:
>>> @@ -77,10 +78,6 @@ public:
>>>      LoopAnalysisManager *LAM;
>>>    };
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return "LoopAnalysisManagerFunctionProxy"; }
>>> -
>>>    explicit LoopAnalysisManagerFunctionProxy(LoopAnalysisManager &LAM)
>>>        : LAM(&LAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -107,8 +104,6 @@ public:
>>>    Result run(Function &F);
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    LoopAnalysisManager *LAM;
>>>  };
>>>
>>> @@ -124,7 +119,8 @@ private:
>>>  /// This proxy *doesn't* manage the invalidation in any way. That is
>>> handled by
>>>  /// the recursive return path of each layer of the pass manager and the
>>>  /// returned PreservedAnalysis set.
>>> -class FunctionAnalysisManagerLoopProxy {
>>> +class FunctionAnalysisManagerLoopProxy
>>> +    : public AnalysisBase<FunctionAnalysisManagerLoopProxy> {
>>>  public:
>>>    /// \brief Result proxy object for \c
>>> FunctionAnalysisManagerLoopProxy.
>>>    class Result {
>>> @@ -148,10 +144,6 @@ public:
>>>      const FunctionAnalysisManager *FAM;
>>>    };
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return "FunctionAnalysisManagerLoopProxy"; }
>>> -
>>>    FunctionAnalysisManagerLoopProxy(const FunctionAnalysisManager &FAM)
>>>        : FAM(&FAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -172,8 +164,6 @@ public:
>>>    Result run(Loop &) { return Result(*FAM); }
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    const FunctionAnalysisManager *FAM;
>>>  };
>>>
>>> @@ -184,7 +174,9 @@ private:
>>>  /// FunctionAnalysisManager it will run the \c
>>> LoopAnalysisManagerFunctionProxy
>>>  /// analysis prior to running the loop passes over the function to
>>> enable a \c
>>>  /// LoopAnalysisManager to be used within this run safely.
>>> -template <typename LoopPassT> class FunctionToLoopPassAdaptor {
>>> +template <typename LoopPassT>
>>> +class FunctionToLoopPassAdaptor
>>> +    : public PassBase<FunctionToLoopPassAdaptor<LoopPassT>> {
>>>  public:
>>>    explicit FunctionToLoopPassAdaptor(LoopPassT Pass)
>>>        : Pass(std::move(Pass)) {}
>>> @@ -250,8 +242,6 @@ public:
>>>      return PA;
>>>    }
>>>
>>> -  static StringRef name() { return "FunctionToLoopPassAdaptor"; }
>>> -
>>>  private:
>>>    LoopPassT Pass;
>>>  };
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/ObjCARCAliasAnalysis.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -63,20 +63,10 @@ public:
>>>  };
>>>
>>>  /// Analysis pass providing a never-invalidated alias analysis result.
>>> -class ObjCARCAA {
>>> -public:
>>> +struct ObjCARCAA : AnalysisBase<ObjCARCAA> {
>>>    typedef ObjCARCAAResult Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    ObjCARCAAResult run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "ObjCARCAA"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// Legacy wrapper pass to provide the ObjCARCAAResult object.
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/PostDominators.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PostDominators.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/PostDominators.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/PostDominators.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -37,34 +37,23 @@ struct PostDominatorTree : public Domina
>>>  };
>>>
>>>  /// \brief Analysis pass which computes a \c PostDominatorTree.
>>> -class PostDominatorTreeAnalysis {
>>> -public:
>>> +struct PostDominatorTreeAnalysis :
>>> AnalysisBase<PostDominatorTreeAnalysis> {
>>>    /// \brief Provide the result typedef for this analysis pass.
>>>    typedef PostDominatorTree Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    /// \brief Run the analysis pass over a function and produce a post
>>> dominator
>>>    ///        tree.
>>>    PostDominatorTree run(Function &F);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "PostDominatorTreeAnalysis"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// \brief Printer pass for the \c PostDominatorTree.
>>> -class PostDominatorTreePrinterPass {
>>> +class PostDominatorTreePrinterPass
>>> +    : public PassBase<PostDominatorTreePrinterPass> {
>>>    raw_ostream &OS;
>>>
>>>  public:
>>>    explicit PostDominatorTreePrinterPass(raw_ostream &OS);
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  static StringRef name() { return "PostDominatorTreePrinterPass"; }
>>>  };
>>>
>>>  struct PostDominatorTreeWrapperPass : public FunctionPass {
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/RegionInfo.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/RegionInfo.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/RegionInfo.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/RegionInfo.h Fri Feb 26 05:44:45
>>> 2016
>>> @@ -923,37 +923,24 @@ public:
>>>  };
>>>
>>>  /// \brief Analysis pass that exposes the \c RegionInfo for a function.
>>> -class RegionInfoAnalysis {
>>> -  static char PassID;
>>> -
>>> -public:
>>> +struct RegionInfoAnalysis : AnalysisBase<RegionInfoAnalysis> {
>>>    typedef RegionInfo Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  /// \brief Provide a name for the analysis for debugging and logging.
>>> -  static StringRef name() { return "RegionInfoAnalysis"; }
>>> -
>>>    RegionInfo run(Function &F, AnalysisManager<Function> *AM);
>>>  };
>>>
>>>  /// \brief Printer pass for the \c RegionInfo.
>>> -class RegionInfoPrinterPass {
>>> +class RegionInfoPrinterPass : public PassBase<RegionInfoPrinterPass> {
>>>    raw_ostream &OS;
>>>
>>>  public:
>>>    explicit RegionInfoPrinterPass(raw_ostream &OS);
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  static StringRef name() { return "RegionInfoPrinterPass"; }
>>>  };
>>>
>>>  /// \brief Verifier pass for the \c RegionInfo.
>>> -struct RegionInfoVerifierPass {
>>> +struct RegionInfoVerifierPass : PassBase<RegionInfoVerifierPass> {
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  static StringRef name() { return "RegionInfoVerifierPass"; }
>>>  };
>>>
>>>  template <>
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -1415,30 +1415,20 @@ namespace llvm {
>>>    };
>>>
>>>    /// \brief Analysis pass that exposes the \c ScalarEvolution for a
>>> function.
>>> -  class ScalarEvolutionAnalysis {
>>> -    static char PassID;
>>> -
>>> -  public:
>>> +  struct ScalarEvolutionAnalysis :
>>> AnalysisBase<ScalarEvolutionAnalysis> {
>>>      typedef ScalarEvolution Result;
>>>
>>> -    /// \brief Opaque, unique identifier for this analysis pass.
>>> -    static void *ID() { return (void *)&PassID; }
>>> -
>>> -    /// \brief Provide a name for the analysis for debugging and
>>> logging.
>>> -    static StringRef name() { return "ScalarEvolutionAnalysis"; }
>>> -
>>>      ScalarEvolution run(Function &F, AnalysisManager<Function> *AM);
>>>    };
>>>
>>>    /// \brief Printer pass for the \c ScalarEvolutionAnalysis results.
>>> -  class ScalarEvolutionPrinterPass {
>>> +  class ScalarEvolutionPrinterPass
>>> +      : public PassBase<ScalarEvolutionPrinterPass> {
>>>      raw_ostream &OS;
>>>
>>>    public:
>>>      explicit ScalarEvolutionPrinterPass(raw_ostream &OS) : OS(OS) {}
>>>      PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -    static StringRef name() { return "ScalarEvolutionPrinterPass"; }
>>>    };
>>>
>>>    class ScalarEvolutionWrapperPass : public FunctionPass {
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h
>>> (original)
>>> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolutionAliasAnalysis.h Fri
>>> Feb 26 05:44:45 2016
>>> @@ -39,20 +39,10 @@ private:
>>>  };
>>>
>>>  /// Analysis pass providing a never-invalidated alias analysis result.
>>> -class SCEVAA {
>>> -public:
>>> +struct SCEVAA : AnalysisBase<SCEVAA> {
>>>    typedef SCEVAAResult Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    SCEVAAResult run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "SCEVAA"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// Legacy wrapper pass to provide the SCEVAAResult object.
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/ScopedNoAliasAA.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -48,20 +48,10 @@ private:
>>>  };
>>>
>>>  /// Analysis pass providing a never-invalidated alias analysis result.
>>> -class ScopedNoAliasAA {
>>> -public:
>>> +struct ScopedNoAliasAA : AnalysisBase<ScopedNoAliasAA> {
>>>    typedef ScopedNoAliasAAResult Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    ScopedNoAliasAAResult run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "ScopedNoAliasAA"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// Legacy wrapper pass to provide the ScopedNoAliasAAResult object.
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/TargetLibraryInfo.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -16,6 +16,7 @@
>>>  #include "llvm/ADT/Triple.h"
>>>  #include "llvm/IR/Function.h"
>>>  #include "llvm/IR/Module.h"
>>> +#include "llvm/IR/PassManager.h"
>>>  #include "llvm/Pass.h"
>>>
>>>  namespace llvm {
>>> @@ -27,7 +28,6 @@ struct VecDesc {
>>>    const char *VectorFnName;
>>>    unsigned VectorizationFactor;
>>>  };
>>> -class PreservedAnalyses;
>>>
>>>    namespace LibFunc {
>>>      enum Func {
>>> @@ -262,13 +262,10 @@ public:
>>>  ///
>>>  /// Note that this pass's result cannot be invalidated, it is immutable
>>> for the
>>>  /// life of the module.
>>> -class TargetLibraryAnalysis {
>>> +class TargetLibraryAnalysis : public
>>> AnalysisBase<TargetLibraryAnalysis> {
>>>  public:
>>>    typedef TargetLibraryInfo Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    /// \brief Default construct the library analysis.
>>>    ///
>>>    /// This will use the module's triple to construct the library info
>>> for that
>>> @@ -294,12 +291,7 @@ public:
>>>    TargetLibraryInfo run(Module &M);
>>>    TargetLibraryInfo run(Function &F);
>>>
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "TargetLibraryAnalysis"; }
>>> -
>>>  private:
>>> -  static char PassID;
>>> -
>>>    Optional<TargetLibraryInfoImpl> PresetInfoImpl;
>>>
>>>    StringMap<std::unique_ptr<TargetLibraryInfoImpl>> Impls;
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -25,6 +25,7 @@
>>>  #include "llvm/ADT/Optional.h"
>>>  #include "llvm/IR/IntrinsicInst.h"
>>>  #include "llvm/IR/Intrinsics.h"
>>> +#include "llvm/IR/PassManager.h"
>>>  #include "llvm/Pass.h"
>>>  #include "llvm/Support/DataTypes.h"
>>>  #include <functional>
>>> @@ -34,7 +35,6 @@ namespace llvm {
>>>  class Function;
>>>  class GlobalValue;
>>>  class Loop;
>>> -class PreservedAnalyses;
>>>  class Type;
>>>  class User;
>>>  class Value;
>>> @@ -889,16 +889,10 @@ TargetTransformInfo::TargetTransformInfo
>>>  /// is done in a subtarget specific way and LLVM supports compiling
>>> different
>>>  /// functions targeting different subtargets in order to support runtime
>>>  /// dispatch according to the observed subtarget.
>>> -class TargetIRAnalysis {
>>> +class TargetIRAnalysis : public AnalysisBase<TargetIRAnalysis> {
>>>  public:
>>>    typedef TargetTransformInfo Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "TargetIRAnalysis"; }
>>> -
>>>    /// \brief Default construct a target IR analysis.
>>>    ///
>>>    /// This will use the module's datalayout to construct a baseline
>>> @@ -928,8 +922,6 @@ public:
>>>    Result run(const Function &F);
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    /// \brief The callback used to produce a result.
>>>    ///
>>>    /// We use a completely opaque callback so that targets can provide
>>> whatever
>>>
>>> Modified: llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h (original)
>>> +++ llvm/trunk/include/llvm/Analysis/TypeBasedAliasAnalysis.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -49,20 +49,10 @@ private:
>>>  };
>>>
>>>  /// Analysis pass providing a never-invalidated alias analysis result.
>>> -class TypeBasedAA {
>>> -public:
>>> +struct TypeBasedAA : AnalysisBase<TypeBasedAA> {
>>>    typedef TypeBasedAAResult Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    TypeBasedAAResult run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "TypeBasedAA"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// Legacy wrapper pass to provide the TypeBasedAAResult object.
>>>
>>> Modified: llvm/trunk/include/llvm/IR/Dominators.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Dominators.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/IR/Dominators.h (original)
>>> +++ llvm/trunk/include/llvm/IR/Dominators.h Fri Feb 26 05:44:45 2016
>>> @@ -182,40 +182,26 @@ template <> struct GraphTraits<Dominator
>>>  };
>>>
>>>  /// \brief Analysis pass which computes a \c DominatorTree.
>>> -class DominatorTreeAnalysis {
>>> -public:
>>> +struct DominatorTreeAnalysis : AnalysisBase<DominatorTreeAnalysis> {
>>>    /// \brief Provide the result typedef for this analysis pass.
>>>    typedef DominatorTree Result;
>>>
>>> -  /// \brief Opaque, unique identifier for this analysis pass.
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>>    /// \brief Run the analysis pass over a function and produce a
>>> dominator tree.
>>>    DominatorTree run(Function &F);
>>> -
>>> -  /// \brief Provide access to a name for this pass for debugging
>>> purposes.
>>> -  static StringRef name() { return "DominatorTreeAnalysis"; }
>>> -
>>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>>  /// \brief Printer pass for the \c DominatorTree.
>>> -class DominatorTreePrinterPass {
>>> +class DominatorTreePrinterPass : public
>>> PassBase<DominatorTreePrinterPass> {
>>>    raw_ostream &OS;
>>>
>>>  public:
>>>    explicit DominatorTreePrinterPass(raw_ostream &OS);
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  static StringRef name() { return "DominatorTreePrinterPass"; }
>>>  };
>>>
>>>  /// \brief Verifier pass for the \c DominatorTree.
>>> -struct DominatorTreeVerifierPass {
>>> +struct DominatorTreeVerifierPass : PassBase<DominatorTreeVerifierPass> {
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>> -
>>> -  static StringRef name() { return "DominatorTreeVerifierPass"; }
>>>  };
>>>
>>>  /// \brief Legacy analysis pass which computes a \c DominatorTree.
>>>
>>> Modified: llvm/trunk/include/llvm/IR/PassManager.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/IR/PassManager.h (original)
>>> +++ llvm/trunk/include/llvm/IR/PassManager.h Fri Feb 26 05:44:45 2016
>>> @@ -167,6 +167,33 @@ private:
>>>  // Forward declare the analysis manager template.
>>>  template <typename IRUnitT> class AnalysisManager;
>>>
>>> +/// A CRTP mix-in base class to help define types that are valid passes.
>>> +///
>>> +/// This provides some boiler plate for types that are passes.
>>> +template <typename DerivedT> struct PassBase {
>>> +  /// Returns the name of the derived pass type.
>>> +  static StringRef name() {
>>> +    StringRef Name = getTypeName<DerivedT>();
>>> +    if (Name.startswith("llvm::"))
>>> +      Name = Name.drop_front(strlen("llvm::"));
>>> +    return Name;
>>> +  }
>>> +};
>>> +
>>> +/// 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:
>>> +  /// Returns an opaque, unique ID for this pass type.
>>> +  static void *ID() { return (void *)&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
>>> @@ -178,7 +205,8 @@ template <typename IRUnitT> class Analys
>>>  /// that analysis manager to each pass it runs, as well as calling the
>>> analysis
>>>  /// manager's invalidation routine with the PreservedAnalyses of each
>>> pass it
>>>  /// runs.
>>> -template <typename IRUnitT> class PassManager {
>>> +template <typename IRUnitT>
>>> +class PassManager : public PassBase<PassManager<IRUnitT>> {
>>>  public:
>>>    /// \brief Construct a pass manager.
>>>    ///
>>> @@ -623,14 +651,11 @@ typedef AnalysisManager<Function> Functi
>>>  /// Note that the proxy's result is a move-only object and represents
>>> ownership
>>>  /// of the validity of the analyses in the \c FunctionAnalysisManager it
>>>  /// provides.
>>> -class FunctionAnalysisManagerModuleProxy {
>>> +class FunctionAnalysisManagerModuleProxy
>>> +    : public AnalysisBase<FunctionAnalysisManagerModuleProxy> {
>>>  public:
>>>    class Result;
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return
>>> "FunctionAnalysisManagerModuleProxy"; }
>>> -
>>>    explicit FunctionAnalysisManagerModuleProxy(FunctionAnalysisManager
>>> &FAM)
>>>        : FAM(&FAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -658,8 +683,6 @@ public:
>>>    Result run(Module &M);
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    FunctionAnalysisManager *FAM;
>>>  };
>>>
>>> @@ -717,7 +740,8 @@ private:
>>>  /// This proxy *doesn't* manage the invalidation in any way. That is
>>> handled by
>>>  /// the recursive return path of each layer of the pass manager and the
>>>  /// returned PreservedAnalysis set.
>>> -class ModuleAnalysisManagerFunctionProxy {
>>> +class ModuleAnalysisManagerFunctionProxy
>>> +    : public AnalysisBase<ModuleAnalysisManagerFunctionProxy> {
>>>  public:
>>>    /// \brief Result proxy object for \c
>>> ModuleAnalysisManagerFunctionProxy.
>>>    class Result {
>>> @@ -741,10 +765,6 @@ public:
>>>      const ModuleAnalysisManager *MAM;
>>>    };
>>>
>>> -  static void *ID() { return (void *)&PassID; }
>>> -
>>> -  static StringRef name() { return
>>> "ModuleAnalysisManagerFunctionProxy"; }
>>> -
>>>    ModuleAnalysisManagerFunctionProxy(const ModuleAnalysisManager &MAM)
>>>        : MAM(&MAM) {}
>>>    // We have to explicitly define all the special member functions
>>> because MSVC
>>> @@ -766,8 +786,6 @@ public:
>>>    Result run(Function &) { return Result(*MAM); }
>>>
>>>  private:
>>> -  static char PassID;
>>> -
>>>    const ModuleAnalysisManager *MAM;
>>>  };
>>>
>>> @@ -793,7 +811,9 @@ private:
>>>  /// module.
>>>  /// FIXME: Make the above true for all of LLVM's actual passes, some
>>> still
>>>  /// violate this principle.
>>> -template <typename FunctionPassT> class ModuleToFunctionPassAdaptor {
>>> +template <typename FunctionPassT>
>>> +class ModuleToFunctionPassAdaptor
>>> +    : public PassBase<ModuleToFunctionPassAdaptor<FunctionPassT>> {
>>>  public:
>>>    explicit ModuleToFunctionPassAdaptor(FunctionPassT Pass)
>>>        : Pass(std::move(Pass)) {}
>>> @@ -848,8 +868,6 @@ public:
>>>      return PA;
>>>    }
>>>
>>> -  static StringRef name() { return "ModuleToFunctionPassAdaptor"; }
>>> -
>>>  private:
>>>    FunctionPassT Pass;
>>>  };
>>> @@ -866,7 +884,8 @@ createModuleToFunctionPassAdaptor(Functi
>>>  ///
>>>  /// This is a no-op pass which simply forces a specific analysis pass's
>>> result
>>>  /// to be available when it is run.
>>> -template <typename AnalysisT> struct RequireAnalysisPass {
>>> +template <typename AnalysisT>
>>> +struct RequireAnalysisPass : PassBase<RequireAnalysisPass<AnalysisT>> {
>>>    /// \brief Run this pass over some unit of IR.
>>>    ///
>>>    /// This pass can be run over any unit of IR and use any analysis
>>> manager
>>> @@ -880,8 +899,6 @@ template <typename AnalysisT> struct Req
>>>
>>>      return PreservedAnalyses::all();
>>>    }
>>> -
>>> -  static StringRef name() { return "RequireAnalysisPass"; }
>>>  };
>>>
>>>  /// \brief A template utility pass to force an analysis result to be
>>> @@ -889,7 +906,8 @@ template <typename AnalysisT> struct Req
>>>  ///
>>>  /// This is a no-op pass which simply forces a specific analysis result
>>> to be
>>>  /// invalidated when it is run.
>>> -template <typename AnalysisT> struct InvalidateAnalysisPass {
>>> +template <typename AnalysisT>
>>> +struct InvalidateAnalysisPass :
>>> PassBase<InvalidateAnalysisPass<AnalysisT>> {
>>>    /// \brief Run this pass over some unit of IR.
>>>    ///
>>>    /// This pass can be run over any unit of IR and use any analysis
>>> manager
>>> @@ -905,21 +923,17 @@ template <typename AnalysisT> struct Inv
>>>
>>>      return PreservedAnalyses::all();
>>>    }
>>> -
>>> -  static StringRef name() { return "InvalidateAnalysisPass"; }
>>>  };
>>>
>>>  /// \brief A utility pass that does nothing but preserves no analyses.
>>>  ///
>>>  /// As a consequence fo not preserving any analyses, this pass will
>>> force all
>>>  /// analysis passes to be re-run to produce fresh results if any are
>>> needed.
>>> -struct InvalidateAllAnalysesPass {
>>> +struct InvalidateAllAnalysesPass : PassBase<InvalidateAllAnalysesPass> {
>>>    /// \brief Run this pass over some unit of IR.
>>>    template <typename IRUnitT> PreservedAnalyses run(IRUnitT &Arg) {
>>>      return PreservedAnalyses::none();
>>>    }
>>> -
>>> -  static StringRef name() { return "InvalidateAllAnalysesPass"; }
>>>  };
>>>
>>>  }
>>>
>>> Modified: llvm/trunk/include/llvm/IR/Verifier.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Verifier.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/IR/Verifier.h (original)
>>> +++ llvm/trunk/include/llvm/IR/Verifier.h Fri Feb 26 05:44:45 2016
>>> @@ -22,6 +22,7 @@
>>>  #define LLVM_IR_VERIFIER_H
>>>
>>>  #include "llvm/ADT/StringRef.h"
>>> +#include "llvm/IR/PassManager.h"
>>>  #include <string>
>>>
>>>  namespace llvm {
>>> @@ -30,7 +31,6 @@ class Function;
>>>  class FunctionPass;
>>>  class ModulePass;
>>>  class Module;
>>> -class PreservedAnalyses;
>>>  class raw_ostream;
>>>
>>>  /// \brief Check a function for errors, useful for use when debugging a
>>> @@ -60,7 +60,7 @@ bool verifyModule(const Module &M, raw_o
>>>  /// nothing to do with \c VerifierPass.
>>>  FunctionPass *createVerifierPass(bool FatalErrors = true);
>>>
>>> -class VerifierPass {
>>> +class VerifierPass : public PassBase<VerifierPass> {
>>>    bool FatalErrors;
>>>
>>>  public:
>>> @@ -68,8 +68,6 @@ public:
>>>
>>>    PreservedAnalyses run(Module &M);
>>>    PreservedAnalyses run(Function &F);
>>> -
>>> -  static StringRef name() { return "VerifierPass"; }
>>>  };
>>>
>>>  } // End llvm namespace
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/IPO/ForceFunctionAttrs.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/ForceFunctionAttrs.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/IPO/ForceFunctionAttrs.h
>>> (original)
>>> +++ llvm/trunk/include/llvm/Transforms/IPO/ForceFunctionAttrs.h Fri Feb
>>> 26 05:44:45 2016
>>> @@ -21,9 +21,7 @@ namespace llvm {
>>>
>>>  /// Pass which forces specific function attributes into the IR,
>>> primarily as
>>>  /// a debugging tool.
>>> -class ForceFunctionAttrsPass {
>>> -public:
>>> -  static StringRef name() { return "ForceFunctionAttrsPass"; }
>>> +struct ForceFunctionAttrsPass : PassBase<ForceFunctionAttrsPass> {
>>>    PreservedAnalyses run(Module &M);
>>>  };
>>>
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h (original)
>>> +++ llvm/trunk/include/llvm/Transforms/IPO/FunctionAttrs.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -29,10 +29,7 @@ namespace llvm {
>>>  /// access memory, or only read memory, and give them the
>>> readnone/readonly
>>>  /// attribute. It also discovers function arguments that are not
>>> captured by
>>>  /// the function and marks them with the nocapture attribute.
>>> -class PostOrderFunctionAttrsPass {
>>> -public:
>>> -  static StringRef name() { return "PostOrderFunctionAttrsPass"; }
>>> -
>>> +struct PostOrderFunctionAttrsPass :
>>> PassBase<PostOrderFunctionAttrsPass> {
>>>    PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager
>>> *AM);
>>>  };
>>>
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/IPO/InferFunctionAttrs.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/InferFunctionAttrs.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/IPO/InferFunctionAttrs.h
>>> (original)
>>> +++ llvm/trunk/include/llvm/Transforms/IPO/InferFunctionAttrs.h Fri Feb
>>> 26 05:44:45 2016
>>> @@ -23,9 +23,7 @@ namespace llvm {
>>>
>>>  /// A pass which infers function attributes from the names and
>>> signatures of
>>>  /// function declarations in a module.
>>> -class InferFunctionAttrsPass {
>>> -public:
>>> -  static StringRef name() { return "InferFunctionAttrsPass"; }
>>> +struct InferFunctionAttrsPass : PassBase<InferFunctionAttrsPass> {
>>>    PreservedAnalyses run(Module &M, AnalysisManager<Module> *AM);
>>>  };
>>>
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/IPO/StripDeadPrototypes.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/StripDeadPrototypes.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/IPO/StripDeadPrototypes.h
>>> (original)
>>> +++ llvm/trunk/include/llvm/Transforms/IPO/StripDeadPrototypes.h Fri Feb
>>> 26 05:44:45 2016
>>> @@ -23,9 +23,7 @@
>>>  namespace llvm {
>>>
>>>  /// Pass to remove unused function declarations.
>>> -class StripDeadPrototypesPass {
>>> -public:
>>> -  static StringRef name() { return "StripDeadPrototypesPass"; }
>>> +struct StripDeadPrototypesPass : PassBase<StripDeadPrototypesPass> {
>>>    PreservedAnalyses run(Module &M);
>>>  };
>>>
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/InstCombine/InstCombine.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/InstCombine/InstCombine.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/InstCombine/InstCombine.h
>>> (original)
>>> +++ llvm/trunk/include/llvm/Transforms/InstCombine/InstCombine.h Fri Feb
>>> 26 05:44:45 2016
>>> @@ -24,7 +24,7 @@
>>>
>>>  namespace llvm {
>>>
>>> -class InstCombinePass {
>>> +class InstCombinePass : public PassBase<InstCombinePass> {
>>>    InstCombineWorklist Worklist;
>>>
>>>  public:
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/Scalar/ADCE.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/ADCE.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/Scalar/ADCE.h (original)
>>> +++ llvm/trunk/include/llvm/Transforms/Scalar/ADCE.h Fri Feb 26 05:44:45
>>> 2016
>>> @@ -28,9 +28,7 @@ namespace llvm {
>>>  /// instructions are dead until proven otherwise. This allows it to
>>> eliminate
>>>  /// dead computations that other DCE passes do not catch, particularly
>>> involving
>>>  /// loop computations.
>>> -class ADCEPass {
>>> -public:
>>> -  static StringRef name() { return "ADCEPass"; }
>>> +struct ADCEPass : PassBase<ADCEPass> {
>>>    PreservedAnalyses run(Function &F);
>>>  };
>>>  }
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/Scalar/EarlyCSE.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/EarlyCSE.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/Scalar/EarlyCSE.h (original)
>>> +++ llvm/trunk/include/llvm/Transforms/Scalar/EarlyCSE.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -26,10 +26,7 @@ namespace llvm {
>>>  /// canonicalize things as it goes. It is intended to be fast and catch
>>> obvious
>>>  /// cases so that instcombine and other passes are more effective. It is
>>>  /// expected that a later pass of GVN will catch the interesting/hard
>>> cases.
>>> -class EarlyCSEPass {
>>> -public:
>>> -  static StringRef name() { return "EarlyCSEPass"; }
>>> -
>>> +struct EarlyCSEPass : PassBase<EarlyCSEPass> {
>>>    /// \brief Run the pass over the function.
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>>  };
>>>
>>> Modified:
>>> llvm/trunk/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h
>>> (original)
>>> +++ llvm/trunk/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h Fri
>>> Feb 26 05:44:45 2016
>>> @@ -21,10 +21,7 @@
>>>
>>>  namespace llvm {
>>>
>>> -class LowerExpectIntrinsicPass {
>>> -public:
>>> -  static StringRef name() { return "LowerExpectIntrinsicPass"; }
>>> -
>>> +struct LowerExpectIntrinsicPass : PassBase<LowerExpectIntrinsicPass> {
>>>    /// \brief Run the pass over the function.
>>>    ///
>>>    /// This will lower all of th expect intrinsic calls in this function
>>> into
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/Scalar/SROA.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/SROA.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/Scalar/SROA.h (original)
>>> +++ llvm/trunk/include/llvm/Transforms/Scalar/SROA.h Fri Feb 26 05:44:45
>>> 2016
>>> @@ -51,7 +51,7 @@ class SROALegacyPass;
>>>  ///    onto insert and extract operations on a vector value, and
>>> convert them to
>>>  ///    this form. By doing so, it will enable promotion of vector
>>> aggregates to
>>>  ///    SSA vector values.
>>> -class SROA {
>>> +class SROA : public PassBase<SROA> {
>>>    LLVMContext *C;
>>>    DominatorTree *DT;
>>>    AssumptionCache *AC;
>>> @@ -101,8 +101,6 @@ class SROA {
>>>  public:
>>>    SROA() : C(nullptr), DT(nullptr), AC(nullptr) {}
>>>
>>> -  static StringRef name() { return "SROA"; }
>>> -
>>>    /// \brief Run the pass over the function.
>>>    PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);
>>>
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/Scalar/SimplifyCFG.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/SimplifyCFG.h?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/Scalar/SimplifyCFG.h (original)
>>> +++ llvm/trunk/include/llvm/Transforms/Scalar/SimplifyCFG.h Fri Feb 26
>>> 05:44:45 2016
>>> @@ -25,12 +25,10 @@ namespace llvm {
>>>  /// This pass iteratively simplifies the entire CFG of a function,
>>> removing
>>>  /// unnecessary control flows and bringing it into the canonical form
>>> expected
>>>  /// by the rest of the mid-level optimizer.
>>> -class SimplifyCFGPass {
>>> +class SimplifyCFGPass : public PassBase<SimplifyCFGPass> {
>>>    int BonusInstThreshold;
>>>
>>>  public:
>>> -  static StringRef name() { return "SimplifyCFGPass"; }
>>> -
>>>    /// \brief Construct a pass with the default thresholds.
>>>    SimplifyCFGPass();
>>>
>>>
>>> Modified: llvm/trunk/lib/Analysis/AliasAnalysis.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/AliasAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/AliasAnalysis.cpp Fri Feb 26 05:44:45 2016
>>> @@ -390,9 +390,6 @@ bool AAResults::canInstructionRangeModRe
>>>  // Provide a definition for the root virtual destructor.
>>>  AAResults::Concept::~Concept() {}
>>>
>>> -// Provide a definition for the static object used to identify passes.
>>> -char AAManager::PassID;
>>> -
>>>  namespace {
>>>  /// A wrapper pass for external alias analyses. This just squirrels
>>> away the
>>>  /// callback used to run any analyses and register their results.
>>>
>>> Modified: llvm/trunk/lib/Analysis/AssumptionCache.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AssumptionCache.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/AssumptionCache.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/AssumptionCache.cpp Fri Feb 26 05:44:45 2016
>>> @@ -74,8 +74,6 @@ void AssumptionCache::registerAssumption
>>>  #endif
>>>  }
>>>
>>> -char AssumptionAnalysis::PassID;
>>> -
>>>  PreservedAnalyses AssumptionPrinterPass::run(Function &F,
>>>                                               AnalysisManager<Function>
>>> *AM) {
>>>    AssumptionCache &AC = AM->getResult<AssumptionAnalysis>(F);
>>>
>>> Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Fri Feb 26 05:44:45
>>> 2016
>>> @@ -1586,8 +1586,6 @@ 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=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/CFLAliasAnalysis.cpp Fri Feb 26 05:44:45 2016
>>> @@ -1093,8 +1093,6 @@ CFLAAResult CFLAA::run(Function &F, Anal
>>>    return CFLAAResult(AM->getResult<TargetLibraryAnalysis>(F));
>>>  }
>>>
>>> -char CFLAA::PassID;
>>> -
>>>  char CFLAAWrapperPass::ID = 0;
>>>  INITIALIZE_PASS_BEGIN(CFLAAWrapperPass, "cfl-aa", "CFL-Based Alias
>>> Analysis",
>>>                        false, true)
>>>
>>> Modified: llvm/trunk/lib/Analysis/CGSCCPassManager.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CGSCCPassManager.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/CGSCCPassManager.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/CGSCCPassManager.cpp Fri Feb 26 05:44:45 2016
>>> @@ -13,8 +13,6 @@
>>>
>>>  using namespace llvm;
>>>
>>> -char CGSCCAnalysisManagerModuleProxy::PassID;
>>> -
>>>  CGSCCAnalysisManagerModuleProxy::Result
>>>  CGSCCAnalysisManagerModuleProxy::run(Module &M) {
>>>    assert(CGAM->empty() && "CGSCC analyses ran prior to the module
>>> proxy!");
>>> @@ -44,10 +42,6 @@ bool CGSCCAnalysisManagerModuleProxy::Re
>>>    return false;
>>>  }
>>>
>>> -char ModuleAnalysisManagerCGSCCProxy::PassID;
>>> -
>>> -char FunctionAnalysisManagerCGSCCProxy::PassID;
>>> -
>>>  FunctionAnalysisManagerCGSCCProxy::Result
>>>  FunctionAnalysisManagerCGSCCProxy::run(LazyCallGraph::SCC &C) {
>>>    return Result(*FAM);
>>> @@ -75,5 +69,3 @@ bool FunctionAnalysisManagerCGSCCProxy::
>>>    // Return false to indicate that this result is still a valid proxy.
>>>    return false;
>>>  }
>>> -
>>> -char CGSCCAnalysisManagerFunctionProxy::PassID;
>>>
>>> Modified: llvm/trunk/lib/Analysis/CallGraph.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CallGraph.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/CallGraph.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/CallGraph.cpp Fri Feb 26 05:44:45 2016
>>> @@ -263,8 +263,6 @@ void CallGraphNode::replaceCallEdge(Call
>>>  // Out-of-line definitions of CallGraphAnalysis class members.
>>>  //
>>>
>>> -char CallGraphAnalysis::PassID;
>>> -
>>>
>>>  //===----------------------------------------------------------------------===//
>>>  // Implementations of the CallGraphWrapperPass class methods.
>>>  //
>>>
>>> Modified: llvm/trunk/lib/Analysis/DominanceFrontier.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DominanceFrontier.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/DominanceFrontier.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/DominanceFrontier.cpp Fri Feb 26 05:44:45
>>> 2016
>>> @@ -56,8 +56,6 @@ LLVM_DUMP_METHOD void DominanceFrontierW
>>>  }
>>>  #endif
>>>
>>> -char DominanceFrontierAnalysis::PassID;
>>> -
>>>  DominanceFrontier DominanceFrontierAnalysis::run(Function &F,
>>>
>>> FunctionAnalysisManager *AM) {
>>>    DominanceFrontier DF;
>>>
>>> Modified: llvm/trunk/lib/Analysis/GlobalsModRef.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/GlobalsModRef.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/GlobalsModRef.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/GlobalsModRef.cpp Fri Feb 26 05:44:45 2016
>>> @@ -940,8 +940,6 @@ GlobalsAAResult GlobalsAA::run(Module &M
>>>
>>>  AM->getResult<CallGraphAnalysis>(M));
>>>  }
>>>
>>> -char GlobalsAA::PassID;
>>> -
>>>  char GlobalsAAWrapperPass::ID = 0;
>>>  INITIALIZE_PASS_BEGIN(GlobalsAAWrapperPass, "globals-aa",
>>>                        "Globals Alias Analysis", false, true)
>>>
>>> Modified: llvm/trunk/lib/Analysis/LazyCallGraph.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/LazyCallGraph.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/LazyCallGraph.cpp Fri Feb 26 05:44:45 2016
>>> @@ -1499,8 +1499,6 @@ LazyCallGraph::RefSCC *LazyCallGraph::ge
>>>    }
>>>  }
>>>
>>> -char LazyCallGraphAnalysis::PassID;
>>> -
>>>  LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) :
>>> OS(OS) {}
>>>
>>>  static void printNode(raw_ostream &OS, LazyCallGraph::Node &N) {
>>>
>>> Modified: llvm/trunk/lib/Analysis/LoopInfo.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/LoopInfo.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/LoopInfo.cpp Fri Feb 26 05:44:45 2016
>>> @@ -641,8 +641,6 @@ void LoopInfo::markAsRemoved(Loop *Unloo
>>>    }
>>>  }
>>>
>>> -char LoopAnalysis::PassID;
>>> -
>>>  LoopInfo LoopAnalysis::run(Function &F, AnalysisManager<Function> *AM) {
>>>    // FIXME: Currently we create a LoopInfo from scratch for every
>>> function.
>>>    // This may prove to be too wasteful due to deallocating and
>>> re-allocating
>>>
>>> Modified: llvm/trunk/lib/Analysis/LoopPassManager.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPassManager.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/LoopPassManager.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/LoopPassManager.cpp Fri Feb 26 05:44:45 2016
>>> @@ -11,8 +11,6 @@
>>>
>>>  using namespace llvm;
>>>
>>> -char LoopAnalysisManagerFunctionProxy::PassID;
>>> -
>>>  LoopAnalysisManagerFunctionProxy::Result
>>>  LoopAnalysisManagerFunctionProxy::run(Function &F) {
>>>    // TODO: In FunctionAnalysisManagerModuleProxy we assert that the
>>> @@ -41,5 +39,3 @@ bool LoopAnalysisManagerFunctionProxy::R
>>>    // Return false to indicate that this result is still a valid proxy.
>>>    return false;
>>>  }
>>> -
>>> -char FunctionAnalysisManagerLoopProxy::PassID;
>>>
>>> Modified: llvm/trunk/lib/Analysis/ObjCARCAliasAnalysis.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ObjCARCAliasAnalysis.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/ObjCARCAliasAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/ObjCARCAliasAnalysis.cpp Fri Feb 26 05:44:45
>>> 2016
>>> @@ -136,8 +136,6 @@ ObjCARCAAResult ObjCARCAA::run(Function
>>>                           AM->getResult<TargetLibraryAnalysis>(F));
>>>  }
>>>
>>> -char ObjCARCAA::PassID;
>>> -
>>>  char ObjCARCAAWrapperPass::ID = 0;
>>>  INITIALIZE_PASS_BEGIN(ObjCARCAAWrapperPass, "objc-arc-aa",
>>>                        "ObjC-ARC-Based Alias Analysis", false, true)
>>>
>>> Modified: llvm/trunk/lib/Analysis/PostDominators.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PostDominators.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/PostDominators.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/PostDominators.cpp Fri Feb 26 05:44:45 2016
>>> @@ -44,8 +44,6 @@ FunctionPass* llvm::createPostDomTree()
>>>    return new PostDominatorTreeWrapperPass();
>>>  }
>>>
>>> -char PostDominatorTreeAnalysis::PassID;
>>> -
>>>  PostDominatorTree PostDominatorTreeAnalysis::run(Function &F) {
>>>    PostDominatorTree PDT;
>>>    PDT.recalculate(F);
>>>
>>> Modified: llvm/trunk/lib/Analysis/RegionInfo.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/RegionInfo.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/RegionInfo.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/RegionInfo.cpp Fri Feb 26 05:44:45 2016
>>> @@ -185,8 +185,6 @@ namespace llvm {
>>>  // RegionInfoAnalysis implementation
>>>  //
>>>
>>> -char RegionInfoAnalysis::PassID;
>>> -
>>>  RegionInfo RegionInfoAnalysis::run(Function &F,
>>> AnalysisManager<Function> *AM) {
>>>    RegionInfo RI;
>>>    auto *DT = &AM->getResult<DominatorTreeAnalysis>(F);
>>>
>>> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Feb 26 05:44:45 2016
>>> @@ -9554,8 +9554,6 @@ void ScalarEvolution::verify() const {
>>>    // TODO: Verify more things.
>>>  }
>>>
>>> -char ScalarEvolutionAnalysis::PassID;
>>> -
>>>  ScalarEvolution ScalarEvolutionAnalysis::run(Function &F,
>>>                                               AnalysisManager<Function>
>>> *AM) {
>>>    return ScalarEvolution(F, AM->getResult<TargetLibraryAnalysis>(F),
>>>
>>> Modified: llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/ScalarEvolutionAliasAnalysis.cpp Fri Feb 26
>>> 05:44:45 2016
>>> @@ -116,8 +116,6 @@ SCEVAAResult SCEVAA::run(Function &F, An
>>>                        AM->getResult<ScalarEvolutionAnalysis>(F));
>>>  }
>>>
>>> -char SCEVAA::PassID;
>>> -
>>>  char SCEVAAWrapperPass::ID = 0;
>>>  INITIALIZE_PASS_BEGIN(SCEVAAWrapperPass, "scev-aa",
>>>                        "ScalarEvolution-based Alias Analysis", false,
>>> true)
>>>
>>> Modified: llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/ScopedNoAliasAA.cpp Fri Feb 26 05:44:45 2016
>>> @@ -178,8 +178,6 @@ ScopedNoAliasAAResult ScopedNoAliasAA::r
>>>    return ScopedNoAliasAAResult(AM->getResult<TargetLibraryAnalysis>(F));
>>>  }
>>>
>>> -char ScopedNoAliasAA::PassID;
>>> -
>>>  char ScopedNoAliasAAWrapperPass::ID = 0;
>>>  INITIALIZE_PASS_BEGIN(ScopedNoAliasAAWrapperPass, "scoped-noalias",
>>>                        "Scoped NoAlias Alias Analysis", false, true)
>>>
>>> Modified: llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp Fri Feb 26 05:44:45
>>> 2016
>>> @@ -636,8 +636,6 @@ TargetLibraryInfoWrapperPass::TargetLibr
>>>
>>>  initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry());
>>>  }
>>>
>>> -char TargetLibraryAnalysis::PassID;
>>> -
>>>  // Register the basic pass.
>>>  INITIALIZE_PASS(TargetLibraryInfoWrapperPass, "targetlibinfo",
>>>                  "Target Library Information", false, true)
>>>
>>> Modified: llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetTransformInfo.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/TargetTransformInfo.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/TargetTransformInfo.cpp Fri Feb 26 05:44:45
>>> 2016
>>> @@ -377,8 +377,6 @@ TargetIRAnalysis::Result TargetIRAnalysi
>>>    return TTICallback(F);
>>>  }
>>>
>>> -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=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp Fri Feb 26
>>> 05:44:45 2016
>>> @@ -588,8 +588,6 @@ TypeBasedAAResult TypeBasedAA::run(Funct
>>>    return TypeBasedAAResult(AM->getResult<TargetLibraryAnalysis>(F));
>>>  }
>>>
>>> -char TypeBasedAA::PassID;
>>> -
>>>  char TypeBasedAAWrapperPass::ID = 0;
>>>  INITIALIZE_PASS_BEGIN(TypeBasedAAWrapperPass, "tbaa",
>>>                        "Type-Based Alias Analysis", false, true)
>>>
>>> Modified: llvm/trunk/lib/IR/Dominators.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Dominators.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/Dominators.cpp (original)
>>> +++ llvm/trunk/lib/IR/Dominators.cpp Fri Feb 26 05:44:45 2016
>>> @@ -308,8 +308,6 @@ DominatorTree DominatorTreeAnalysis::run
>>>    return DT;
>>>  }
>>>
>>> -char DominatorTreeAnalysis::PassID;
>>> -
>>>  DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) :
>>> OS(OS) {}
>>>
>>>  PreservedAnalyses DominatorTreePrinterPass::run(Function &F,
>>>
>>> Modified: llvm/trunk/lib/IR/PassManager.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/PassManager.cpp (original)
>>> +++ llvm/trunk/lib/IR/PassManager.cpp Fri Feb 26 05:44:45 2016
>>
>>
>>> @@ -13,8 +13,6 @@
>>>
>>>  using namespace llvm;
>>>
>>> -char FunctionAnalysisManagerModuleProxy::PassID;
>>> -
>>>  FunctionAnalysisManagerModuleProxy::Result
>>>  FunctionAnalysisManagerModuleProxy::run(Module &M) {
>>>    assert(FAM->empty() && "Function analyses ran prior to the module
>>> proxy!");
>>> @@ -43,5 +41,3 @@ bool FunctionAnalysisManagerModuleProxy:
>>
>>
>>>    // Return false to indicate that this result is still a valid proxy.
>>>    return false;
>>>  }
>>> -
>>>
>> -char ModuleAnalysisManagerFunctionProxy::PassID;
>>>
>>> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
>>> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Fri Feb 26 05:44:45 2016
>>> @@ -61,17 +61,12 @@ struct NoOpModulePass {
>>>  };
>>>
>>>  /// \brief No-op module analysis.
>>> -struct NoOpModuleAnalysis {
>>> +struct NoOpModuleAnalysis : AnalysisBase<NoOpModuleAnalysis> {
>>>    struct Result {};
>>>    Result run(Module &) { return Result(); }
>>>    static StringRef name() { return "NoOpModuleAnalysis"; }
>>
>>
>>> -  static void *ID() { return (void *)&PassID; }
>>>
>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>> -char NoOpModuleAnalysis::PassID;
>>> -
>>>  /// \brief No-op CGSCC pass which does nothing.
>>>  struct NoOpCGSCCPass {
>>>    PreservedAnalyses run(LazyCallGraph::SCC &C) {
>>> @@ -81,17 +76,12 @@ struct NoOpCGSCCPass {
>>>  };
>>>
>>>  /// \brief No-op CGSCC analysis.
>>> -struct NoOpCGSCCAnalysis {
>>> +struct NoOpCGSCCAnalysis : AnalysisBase<NoOpCGSCCAnalysis> {
>>>    struct Result {};
>>>    Result run(LazyCallGraph::SCC &) { return Result(); }
>>>    static StringRef name() { return "NoOpCGSCCAnalysis"; }
>>
>>
>>> -  static void *ID() { return (void *)&PassID; }
>>>
>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>> -char NoOpCGSCCAnalysis::PassID;
>>> -
>>>  /// \brief No-op function pass which does nothing.
>>>  struct NoOpFunctionPass {
>>>    PreservedAnalyses run(Function &F) { return PreservedAnalyses::all();
>>> }
>>> @@ -99,17 +89,12 @@ struct NoOpFunctionPass {
>>>  };
>>>
>>>  /// \brief No-op function analysis.
>>> -struct NoOpFunctionAnalysis {
>>> +struct NoOpFunctionAnalysis : AnalysisBase<NoOpFunctionAnalysis> {
>>>    struct Result {};
>>>    Result run(Function &) { return Result(); }
>>>    static StringRef name() { return "NoOpFunctionAnalysis"; }
>>
>>
>>> -  static void *ID() { return (void *)&PassID; }
>>>
>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>> -char NoOpFunctionAnalysis::PassID;
>>> -
>>>  /// \brief No-op loop pass which does nothing.
>>>  struct NoOpLoopPass {
>>>    PreservedAnalyses run(Loop &L) { return PreservedAnalyses::all(); }
>>> @@ -117,17 +102,12 @@ struct NoOpLoopPass {
>>>  };
>>>
>>>  /// \brief No-op loop analysis.
>>> -struct NoOpLoopAnalysis {
>>> +struct NoOpLoopAnalysis : AnalysisBase<NoOpLoopAnalysis> {
>>>    struct Result {};
>>>    Result run(Loop &) { return Result(); }
>>>    static StringRef name() { return "NoOpLoopAnalysis"; }
>>
>>
>>> -  static void *ID() { return (void *)&PassID; }
>>>
>> -private:
>>> -  static char PassID;
>>>  };
>>>
>>> -char NoOpLoopAnalysis::PassID;
>>> -
>>>  } // End anonymous namespace.
>>>
>>>  void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {
>>>
>>> Modified: llvm/trunk/test/Other/new-pass-manager.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pass-manager.ll?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Other/new-pass-manager.ll (original)
>>> +++ llvm/trunk/test/Other/new-pass-manager.ll Fri Feb 26 05:44:45 2016
>>> @@ -21,7 +21,7 @@
>>>  ; CHECK-CGSCC-PASS: Starting llvm::Module pass manager run
>>>  ; CHECK-CGSCC-PASS-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor
>>>  ; CHECK-CGSCC-PASS-NEXT: Running analysis:
>>> CGSCCAnalysisManagerModuleProxy
>>> -; CHECK-CGSCC-PASS-NEXT: Running analysis: Lazy CallGraph Analysis
>>> +; CHECK-CGSCC-PASS-NEXT: Running analysis: LazyCallGraphAnalysis
>>>  ; CHECK-CGSCC-PASS-NEXT: Starting llvm::LazyCallGraph::SCC pass manager
>>> run
>>>  ; CHECK-CGSCC-PASS-NEXT: Running pass: NoOpCGSCCPass
>>>  ; CHECK-CGSCC-PASS-NEXT: Finished llvm::LazyCallGraph::SCC pass manager
>>> run
>>>
>>> Modified: llvm/trunk/unittests/IR/PassManagerTest.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PassManagerTest.cpp?rev=262004&r1=262003&r2=262004&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/unittests/IR/PassManagerTest.cpp (original)
>>> +++ llvm/trunk/unittests/IR/PassManagerTest.cpp Fri Feb 26 05:44:45 2016
>>> @@ -19,19 +19,13 @@ using namespace llvm;
>>>
>>>  namespace {
>>>
>>> -class TestFunctionAnalysis {
>>> +class TestFunctionAnalysis : public AnalysisBase<TestFunctionAnalysis> {
>>>  public:
>>>    struct Result {
>>>      Result(int Count) : InstructionCount(Count) {}
>>>      int InstructionCount;
>>>    };
>>>
>>> -  /// \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 "TestFunctionAnalysis"; }
>>> -
>>>    TestFunctionAnalysis(int &Runs) : Runs(Runs) {}
>>>
>>>    /// \brief Run the analysis pass over the function and return a
>>> result.
>>> @@ -46,25 +40,16 @@ public:
>>>    }
>>>
>>>  private:
>>> -  /// \brief Private static data to provide unique ID.
>>
>>
>>> -  static char PassID;
>>> -
>>>
>>    int &Runs;
>>>  };
>>>
>>> -char TestFunctionAnalysis::PassID;
>>> -
>>> -class TestModuleAnalysis {
>>> +class TestModuleAnalysis : public AnalysisBase<TestModuleAnalysis> {
>>>  public:
>>>    struct Result {
>>>      Result(int Count) : FunctionCount(Count) {}
>>>      int FunctionCount;
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160226/0c64e621/attachment-0001.html>


More information about the llvm-commits mailing list