<div dir="ltr">Fixed in r203426 after Ahmed explained exactly what was going on... Sorry for the breakage, still dunno why 2012 tolerated this.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Mar 9, 2014 at 7:43 AM, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron@aaronballman.com" target="_blank">aaron@aaronballman.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This seems to have broken my MSVC 2013 build.<br>
<br>
185>  PassManagerTest.cpp<br>
185>D:\Program Files (x86)\Microsoft Visual Studio<br>
12.0\VC\include\xmemory0(593): error C2280:<br>
'std::unique_ptr<llvm::FunctionPassManager::FunctionPassConcept,std::default_delete<_Ty>>::unique_ptr(const<br>
std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to<br>
reference a deleted function<br>
185>          with<br>
185>          [<br>
185>              _Ty=llvm::FunctionPassManager::FunctionPassConcept<br>
185>          ] (E:\llvm\llvm\unittests\IR\PassManagerTest.cpp)<br>
185>          D:\Program Files (x86)\Microsoft Visual Studio<br>
12.0\VC\include\memory(1486) : see declaration of<br>
'std::unique_ptr<llvm::FunctionPassManager::FunctionPassConcept,std::default_delete<_Ty>>::unique_ptr'<br>
185>          with<br>
185>          [<br>
185>              _Ty=llvm::FunctionPassManager::FunctionPassConcept<br>
185>          ]<br>
185>          D:\Program Files (x86)\Microsoft Visual Studio<br>
12.0\VC\include\xmemory0(592) : while compiling class template member<br>
function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'<br>
185>          with<br>
185>          [<br>
185><br>
_Ty=std::unique_ptr<llvm::FunctionPassManager::FunctionPassConcept,std::default_delete<llvm::FunctionPassManager::FunctionPassConcept>><br>
185>          ]<br>
185>          D:\Program Files (x86)\Microsoft Visual Studio<br>
12.0\VC\include\xmemory0(723) : see reference to function template<br>
instantiation 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'<br>
being compiled<br>
185>          with<br>
185>          [<br>
185><br>
_Ty=std::unique_ptr<llvm::FunctionPassManager::FunctionPassConcept,std::default_delete<llvm::FunctionPassManager::FunctionPassConcept>><br>
185>          ]<br>
185>          D:\Program Files (x86)\Microsoft Visual Studio<br>
12.0\VC\include\type_traits(572) : see reference to class template<br>
instantiation 'std::allocator<_Ty>' being compiled<br>
185>          with<br>
185>          [<br>
185><br>
_Ty=std::unique_ptr<llvm::FunctionPassManager::FunctionPassConcept,std::default_delete<llvm::FunctionPassManager::FunctionPassConcept>><br>
185>          ]<br>
185>          D:\Program Files (x86)\Microsoft Visual Studio<br>
12.0\VC\include\vector(650) : see reference to class template<br>
instantiation 'std::is_empty<_Alloc>' being compiled<br>
185>          with<br>
185>          [<br>
185><br>
_Alloc=std::allocator<std::unique_ptr<llvm::FunctionPassManager::FunctionPassConcept,std::default_delete<llvm::FunctionPassManager::FunctionPassConcept>>><br>
185>          ]<br>
185>          E:\llvm\llvm\include\llvm/IR/PassManager.h(437) : see<br>
reference to class template instantiation<br>
'std::vector<std::unique_ptr<llvm::FunctionPassManager::FunctionPassConcept,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>'<br>
being compiled<br>
185>          with<br>
185>          [<br>
185>              _Ty=llvm::FunctionPassManager::FunctionPassConcept<br>
185>          ]<br>
<span class="HOEnZb"><font color="#888888"><br>
~Aaron<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Sun, Mar 9, 2014 at 7:49 AM, Chandler Carruth <<a href="mailto:chandlerc@gmail.com">chandlerc@gmail.com</a>> wrote:<br>
> Author: chandlerc<br>
> Date: Sun Mar  9 06:49:53 2014<br>
> New Revision: 203391<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=203391&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=203391&view=rev</a><br>
> Log:<br>
> [PM] Switch new pass manager from polymorphic_ptr to unique_ptr now that<br>
> it is available. Also make the move semantics sufficiently correct to<br>
> tolerate move-only passes, as the PassManagers *are* move-only passes.<br>
><br>
> Modified:<br>
>     llvm/trunk/include/llvm/IR/PassManager.h<br>
>     llvm/trunk/lib/IR/PassManager.cpp<br>
>     llvm/trunk/tools/opt/Passes.cpp<br>
>     llvm/trunk/unittests/IR/PassManagerTest.cpp<br>
><br>
> Modified: llvm/trunk/include/llvm/IR/PassManager.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=203391&r1=203390&r2=203391&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=203391&r1=203390&r2=203391&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/include/llvm/IR/PassManager.h (original)<br>
> +++ llvm/trunk/include/llvm/IR/PassManager.h Sun Mar  9 06:49:53 2014<br>
> @@ -39,12 +39,13 @@<br>
>  #define LLVM_IR_PASS_MANAGER_H<br>
><br>
>  #include "llvm/ADT/DenseMap.h"<br>
> +#include "llvm/ADT/STLExtras.h"<br>
>  #include "llvm/ADT/SmallPtrSet.h"<br>
> -#include "llvm/ADT/polymorphic_ptr.h"<br>
>  #include "llvm/IR/Function.h"<br>
>  #include "llvm/IR/Module.h"<br>
>  #include "llvm/Support/type_traits.h"<br>
>  #include <list><br>
> +#include <memory><br>
>  #include <vector><br>
><br>
>  namespace llvm {<br>
> @@ -158,7 +159,6 @@ namespace detail {<br>
>  template <typename IRUnitT, typename AnalysisManagerT> struct PassConcept {<br>
>    // Boiler plate necessary for the container of derived classes.<br>
>    virtual ~PassConcept() {}<br>
> -  virtual PassConcept *clone() = 0;<br>
><br>
>    /// \brief The polymorphic API which runs the pass over a given IR entity.<br>
>    ///<br>
> @@ -205,7 +205,6 @@ template <typename IRUnitT, typename Ana<br>
>  struct PassModel<IRUnitT, AnalysisManagerT, PassT,<br>
>                   true> : PassConcept<IRUnitT, AnalysisManagerT> {<br>
>    PassModel(PassT Pass) : Pass(std::move(Pass)) {}<br>
> -  PassModel *clone() override { return new PassModel(Pass); }<br>
>    PreservedAnalyses run(IRUnitT IR, AnalysisManagerT *AM) override {<br>
>      return Pass.run(IR, AM);<br>
>    }<br>
> @@ -219,7 +218,6 @@ template <typename IRUnitT, typename Ana<br>
>  struct PassModel<IRUnitT, AnalysisManagerT, PassT,<br>
>                   false> : PassConcept<IRUnitT, AnalysisManagerT> {<br>
>    PassModel(PassT Pass) : Pass(std::move(Pass)) {}<br>
> -  PassModel *clone() override { return new PassModel(Pass); }<br>
>    PreservedAnalyses run(IRUnitT IR, AnalysisManagerT *AM) override {<br>
>      return Pass.run(IR);<br>
>    }<br>
> @@ -233,7 +231,6 @@ struct PassModel<IRUnitT, AnalysisManage<br>
>  /// to.<br>
>  template <typename IRUnitT> struct AnalysisResultConcept {<br>
>    virtual ~AnalysisResultConcept() {}<br>
> -  virtual AnalysisResultConcept *clone() = 0;<br>
><br>
>    /// \brief Method to try and mark a result as invalid.<br>
>    ///<br>
> @@ -281,9 +278,6 @@ template <typename IRUnitT, typename Pas<br>
>  struct AnalysisResultModel<IRUnitT, PassT, ResultT,<br>
>                             false> : AnalysisResultConcept<IRUnitT> {<br>
>    AnalysisResultModel(ResultT Result) : Result(std::move(Result)) {}<br>
> -  AnalysisResultModel *clone() override {<br>
> -    return new AnalysisResultModel(Result);<br>
> -  }<br>
><br>
>    /// \brief The model bases invalidation solely on being in the preserved set.<br>
>    //<br>
> @@ -303,9 +297,6 @@ template <typename IRUnitT, typename Pas<br>
>  struct AnalysisResultModel<IRUnitT, PassT, ResultT,<br>
>                             true> : AnalysisResultConcept<IRUnitT> {<br>
>    AnalysisResultModel(ResultT Result) : Result(std::move(Result)) {}<br>
> -  AnalysisResultModel *clone() override {<br>
> -    return new AnalysisResultModel(Result);<br>
> -  }<br>
><br>
>    /// \brief The model delegates to the \c ResultT method.<br>
>    bool invalidate(IRUnitT IR, const PreservedAnalyses &PA) override {<br>
> @@ -322,13 +313,12 @@ struct AnalysisResultModel<IRUnitT, Pass<br>
>  template <typename IRUnitT, typename AnalysisManagerT><br>
>  struct AnalysisPassConcept {<br>
>    virtual ~AnalysisPassConcept() {}<br>
> -  virtual AnalysisPassConcept *clone() = 0;<br>
><br>
>    /// \brief Method to run this analysis over a unit of IR.<br>
> -  /// \returns The analysis result object to be queried by users, the caller<br>
> -  /// takes ownership.<br>
> -  virtual AnalysisResultConcept<IRUnitT> *run(IRUnitT IR,<br>
> -                                              AnalysisManagerT *AM) = 0;<br>
> +  /// \returns A unique_ptr to the analysis result object to be queried by<br>
> +  /// users.<br>
> +  virtual std::unique_ptr<AnalysisResultConcept<IRUnitT>><br>
> +      run(IRUnitT IR, AnalysisManagerT *AM) = 0;<br>
>  };<br>
><br>
>  /// \brief Wrapper to model the analysis pass concept.<br>
> @@ -348,7 +338,6 @@ struct AnalysisPassModel<IRUnitT, Analys<br>
>                           true> : AnalysisPassConcept<IRUnitT,<br>
>                                                       AnalysisManagerT> {<br>
>    AnalysisPassModel(PassT Pass) : Pass(std::move(Pass)) {}<br>
> -  virtual AnalysisPassModel *clone() { return new AnalysisPassModel(Pass); }<br>
><br>
>    // FIXME: Replace PassT::Result with type traits when we use C++11.<br>
>    typedef AnalysisResultModel<IRUnitT, PassT, typename PassT::Result><br>
> @@ -357,8 +346,9 @@ struct AnalysisPassModel<IRUnitT, Analys<br>
>    /// \brief The model delegates to the \c PassT::run method.<br>
>    ///<br>
>    /// The return is wrapped in an \c AnalysisResultModel.<br>
> -  virtual ResultModelT *run(IRUnitT IR, AnalysisManagerT *AM) {<br>
> -    return new ResultModelT(Pass.run(IR, AM));<br>
> +  std::unique_ptr<AnalysisResultConcept<IRUnitT>><br>
> +  run(IRUnitT IR, AnalysisManagerT *AM) override {<br>
> +    return make_unique<ResultModelT>(Pass.run(IR, AM));<br>
>    }<br>
><br>
>    PassT Pass;<br>
> @@ -371,7 +361,6 @@ struct AnalysisPassModel<IRUnitT, Analys<br>
>                           false> : AnalysisPassConcept<IRUnitT,<br>
>                                                       AnalysisManagerT> {<br>
>    AnalysisPassModel(PassT Pass) : Pass(std::move(Pass)) {}<br>
> -  AnalysisPassModel *clone() override { return new AnalysisPassModel(Pass); }<br>
><br>
>    // FIXME: Replace PassT::Result with type traits when we use C++11.<br>
>    typedef AnalysisResultModel<IRUnitT, PassT, typename PassT::Result><br>
> @@ -380,8 +369,9 @@ struct AnalysisPassModel<IRUnitT, Analys<br>
>    /// \brief The model delegates to the \c PassT::run method.<br>
>    ///<br>
>    /// The return is wrapped in an \c AnalysisResultModel.<br>
> -  ResultModelT *run(IRUnitT IR, AnalysisManagerT *) override {<br>
> -    return new ResultModelT(Pass.run(IR));<br>
> +  std::unique_ptr<AnalysisResultConcept<IRUnitT>><br>
> +  run(IRUnitT IR, AnalysisManagerT *) override {<br>
> +    return make_unique<ResultModelT>(Pass.run(IR));<br>
>    }<br>
><br>
>    PassT Pass;<br>
> @@ -393,8 +383,6 @@ class ModuleAnalysisManager;<br>
><br>
>  class ModulePassManager {<br>
>  public:<br>
> -  explicit ModulePassManager() {}<br>
> -<br>
>    /// \brief Run all of the module passes in this module pass manager over<br>
>    /// a module.<br>
>    ///<br>
> @@ -403,7 +391,7 @@ public:<br>
>    PreservedAnalyses run(Module *M, ModuleAnalysisManager *AM = 0);<br>
><br>
>    template <typename ModulePassT> void addPass(ModulePassT Pass) {<br>
> -    Passes.push_back(new ModulePassModel<ModulePassT>(std::move(Pass)));<br>
> +    Passes.emplace_back(new ModulePassModel<ModulePassT>(std::move(Pass)));<br>
>    }<br>
><br>
>    static StringRef name() { return "ModulePassManager"; }<br>
> @@ -415,20 +403,19 @@ private:<br>
>    struct ModulePassModel<br>
>        : detail::PassModel<Module *, ModuleAnalysisManager, PassT> {<br>
>      ModulePassModel(PassT Pass)<br>
> -        : detail::PassModel<Module *, ModuleAnalysisManager, PassT>(Pass) {}<br>
> +        : detail::PassModel<Module *, ModuleAnalysisManager, PassT>(<br>
> +              std::move(Pass)) {}<br>
>    };<br>
><br>
> -  std::vector<polymorphic_ptr<ModulePassConcept> > Passes;<br>
> +  std::vector<std::unique_ptr<ModulePassConcept>> Passes;<br>
>  };<br>
><br>
>  class FunctionAnalysisManager;<br>
><br>
>  class FunctionPassManager {<br>
>  public:<br>
> -  explicit FunctionPassManager() {}<br>
> -<br>
>    template <typename FunctionPassT> void addPass(FunctionPassT Pass) {<br>
> -    Passes.push_back(new FunctionPassModel<FunctionPassT>(std::move(Pass)));<br>
> +    Passes.emplace_back(new FunctionPassModel<FunctionPassT>(std::move(Pass)));<br>
>    }<br>
><br>
>    PreservedAnalyses run(Function *F, FunctionAnalysisManager *AM = 0);<br>
> @@ -443,10 +430,11 @@ private:<br>
>    struct FunctionPassModel<br>
>        : detail::PassModel<Function *, FunctionAnalysisManager, PassT> {<br>
>      FunctionPassModel(PassT Pass)<br>
> -        : detail::PassModel<Function *, FunctionAnalysisManager, PassT>(Pass) {}<br>
> +        : detail::PassModel<Function *, FunctionAnalysisManager, PassT>(<br>
> +              std::move(Pass)) {}<br>
>    };<br>
><br>
> -  std::vector<polymorphic_ptr<FunctionPassConcept> > Passes;<br>
> +  std::vector<std::unique_ptr<FunctionPassConcept>> Passes;<br>
>  };<br>
><br>
>  namespace detail {<br>
> @@ -519,7 +507,7 @@ public:<br>
>      assert(!AnalysisPasses.count(PassT::ID()) &&<br>
>             "Registered the same analysis pass twice!");<br>
>      typedef detail::AnalysisPassModel<IRUnitT, DerivedT, PassT> PassModelT;<br>
> -    AnalysisPasses[PassT::ID()] = new PassModelT(std::move(Pass));<br>
> +    AnalysisPasses[PassT::ID()].reset(new PassModelT(std::move(Pass)));<br>
>    }<br>
><br>
>    /// \brief Invalidate a specific analysis pass for an IR module.<br>
> @@ -558,7 +546,7 @@ protected:<br>
><br>
>  private:<br>
>    /// \brief Map type from module analysis pass ID to pass concept pointer.<br>
> -  typedef DenseMap<void *, polymorphic_ptr<PassConceptT> > AnalysisPassMapT;<br>
> +  typedef DenseMap<void *, std::unique_ptr<PassConceptT>> AnalysisPassMapT;<br>
><br>
>    /// \brief Collection of module analysis passes, indexed by ID.<br>
>    AnalysisPassMapT AnalysisPasses;<br>
> @@ -593,7 +581,7 @@ private:<br>
><br>
>    /// \brief Map type from module analysis pass ID to pass result concept pointer.<br>
>    typedef DenseMap<void *,<br>
> -                   polymorphic_ptr<detail::AnalysisResultConcept<Module *> > ><br>
> +                   std::unique_ptr<detail::AnalysisResultConcept<Module *>>><br>
>        ModuleAnalysisResultMapT;<br>
><br>
>    /// \brief Cache of computed module analysis results for this module.<br>
> @@ -642,8 +630,8 @@ private:<br>
>    /// erases. Provides both the pass ID and concept pointer such that it is<br>
>    /// half of a bijection and provides storage for the actual result concept.<br>
>    typedef std::list<std::pair<<br>
> -      void *, polymorphic_ptr<detail::AnalysisResultConcept<Function *> > > ><br>
> -      FunctionAnalysisResultListT;<br>
> +      void *, std::unique_ptr<detail::AnalysisResultConcept<Function *>>>><br>
> +  FunctionAnalysisResultListT;<br>
><br>
>    /// \brief Map type from function pointer to our custom list type.<br>
>    typedef DenseMap<Function *, FunctionAnalysisResultListT><br>
> @@ -826,7 +814,7 @@ private:<br>
>  template <typename FunctionPassT><br>
>  ModuleToFunctionPassAdaptor<FunctionPassT><br>
>  createModuleToFunctionPassAdaptor(FunctionPassT Pass) {<br>
> -  return ModuleToFunctionPassAdaptor<FunctionPassT>(std::move(Pass));<br>
> +  return std::move(ModuleToFunctionPassAdaptor<FunctionPassT>(std::move(Pass)));<br>
>  }<br>
><br>
>  }<br>
><br>
> Modified: llvm/trunk/lib/IR/PassManager.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=203391&r1=203390&r2=203391&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/PassManager.cpp?rev=203391&r1=203390&r2=203391&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/lib/IR/PassManager.cpp (original)<br>
> +++ llvm/trunk/lib/IR/PassManager.cpp Sun Mar  9 06:49:53 2014<br>
> @@ -45,12 +45,12 @@ ModuleAnalysisManager::getResultImpl(voi<br>
>    ModuleAnalysisResultMapT::iterator RI;<br>
>    bool Inserted;<br>
>    std::tie(RI, Inserted) = ModuleAnalysisResults.insert(std::make_pair(<br>
> -      PassID, polymorphic_ptr<detail::AnalysisResultConcept<Module *> >()));<br>
> +      PassID, std::unique_ptr<detail::AnalysisResultConcept<Module *>>()));<br>
><br>
>    // If we don't have a cached result for this module, look up the pass and run<br>
>    // it to produce a result, which we then add to the cache.<br>
>    if (Inserted)<br>
> -    RI->second = lookupPass(PassID).run(M, this);<br>
> +    RI->second = std::move(lookupPass(PassID).run(M, this));<br>
><br>
>    return *RI->second;<br>
>  }<br>
> @@ -122,7 +122,7 @@ FunctionAnalysisManager::getResultImpl(v<br>
>    // run it to produce a result, which we then add to the cache.<br>
>    if (Inserted) {<br>
>      FunctionAnalysisResultListT &ResultList = FunctionAnalysisResultLists[F];<br>
> -    ResultList.push_back(std::make_pair(PassID, lookupPass(PassID).run(F, this)));<br>
> +    ResultList.emplace_back(PassID, lookupPass(PassID).run(F, this));<br>
>      RI->second = std::prev(ResultList.end());<br>
>    }<br>
><br>
><br>
> Modified: llvm/trunk/tools/opt/Passes.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/Passes.cpp?rev=203391&r1=203390&r2=203391&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/Passes.cpp?rev=203391&r1=203390&r2=203391&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/tools/opt/Passes.cpp (original)<br>
> +++ llvm/trunk/tools/opt/Passes.cpp Sun Mar  9 06:49:53 2014<br>
> @@ -101,7 +101,7 @@ static bool parseFunctionPassPipeline(Fu<br>
>        PipelineText = PipelineText.substr(1);<br>
><br>
>        // Add the nested pass manager with the appropriate adaptor.<br>
> -      FPM.addPass(NestedFPM);<br>
> +      FPM.addPass(std::move(NestedFPM));<br>
>      } else {<br>
>        // Otherwise try to parse a pass name.<br>
>        size_t End = PipelineText.find_first_of(",)");<br>
> @@ -138,7 +138,7 @@ static bool parseModulePassPipeline(Modu<br>
>        PipelineText = PipelineText.substr(1);<br>
><br>
>        // Now add the nested manager as a module pass.<br>
> -      MPM.addPass(NestedMPM);<br>
> +      MPM.addPass(std::move(NestedMPM));<br>
>      } else if (PipelineText.startswith("function(")) {<br>
>        FunctionPassManager NestedFPM;<br>
><br>
> @@ -151,7 +151,7 @@ static bool parseModulePassPipeline(Modu<br>
>        PipelineText = PipelineText.substr(1);<br>
><br>
>        // Add the nested pass manager with the appropriate adaptor.<br>
> -      MPM.addPass(createModuleToFunctionPassAdaptor(NestedFPM));<br>
> +      MPM.addPass(createModuleToFunctionPassAdaptor(std::move(NestedFPM)));<br>
>      } else {<br>
>        // Otherwise try to parse a pass name.<br>
>        size_t End = PipelineText.find_first_of(",)");<br>
> @@ -185,7 +185,7 @@ bool llvm::parsePassPipeline(ModulePassM<br>
>      if (!parseFunctionPassPipeline(FPM, PipelineText, VerifyEachPass) ||<br>
>          !PipelineText.empty())<br>
>        return false;<br>
> -    MPM.addPass(createModuleToFunctionPassAdaptor(FPM));<br>
> +    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));<br>
>      return true;<br>
>    }<br>
><br>
> @@ -201,7 +201,7 @@ bool llvm::parsePassPipeline(ModulePassM<br>
>      if (!parseFunctionPassPipeline(FPM, PipelineText, VerifyEachPass) ||<br>
>          !PipelineText.empty())<br>
>        return false;<br>
> -    MPM.addPass(createModuleToFunctionPassAdaptor(FPM));<br>
> +    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));<br>
>      return true;<br>
>    }<br>
><br>
><br>
> Modified: llvm/trunk/unittests/IR/PassManagerTest.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PassManagerTest.cpp?rev=203391&r1=203390&r2=203391&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PassManagerTest.cpp?rev=203391&r1=203390&r2=203391&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/unittests/IR/PassManagerTest.cpp (original)<br>
> +++ llvm/trunk/unittests/IR/PassManagerTest.cpp Sun Mar  9 06:49:53 2014<br>
> @@ -207,59 +207,69 @@ TEST_F(PassManagerTest, Basic) {<br>
>    ModulePassManager MPM;<br>
><br>
>    // Count the runs over a Function.<br>
> -  FunctionPassManager FPM1;<br>
>    int FunctionPassRunCount1 = 0;<br>
>    int AnalyzedInstrCount1 = 0;<br>
>    int AnalyzedFunctionCount1 = 0;<br>
> -  FPM1.addPass(TestFunctionPass(FunctionPassRunCount1, AnalyzedInstrCount1,<br>
> -                                AnalyzedFunctionCount1));<br>
> -  MPM.addPass(createModuleToFunctionPassAdaptor(FPM1));<br>
> +  {<br>
> +    FunctionPassManager FPM;<br>
> +    FPM.addPass(TestFunctionPass(FunctionPassRunCount1, AnalyzedInstrCount1,<br>
> +                                 AnalyzedFunctionCount1));<br>
> +    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));<br>
> +  }<br>
><br>
>    // Count the runs over a module.<br>
>    int ModulePassRunCount = 0;<br>
>    MPM.addPass(TestModulePass(ModulePassRunCount));<br>
><br>
>    // Count the runs over a Function in a separate manager.<br>
> -  FunctionPassManager FPM2;<br>
>    int FunctionPassRunCount2 = 0;<br>
>    int AnalyzedInstrCount2 = 0;<br>
>    int AnalyzedFunctionCount2 = 0;<br>
> -  FPM2.addPass(TestFunctionPass(FunctionPassRunCount2, AnalyzedInstrCount2,<br>
> -                                AnalyzedFunctionCount2));<br>
> -  MPM.addPass(createModuleToFunctionPassAdaptor(FPM2));<br>
> +  {<br>
> +    FunctionPassManager FPM;<br>
> +    FPM.addPass(TestFunctionPass(FunctionPassRunCount2, AnalyzedInstrCount2,<br>
> +                                 AnalyzedFunctionCount2));<br>
> +    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));<br>
> +  }<br>
><br>
>    // A third function pass manager but with only preserving intervening passes<br>
>    // and with a function pass that invalidates exactly one analysis.<br>
>    MPM.addPass(TestPreservingModulePass());<br>
> -  FunctionPassManager FPM3;<br>
>    int FunctionPassRunCount3 = 0;<br>
>    int AnalyzedInstrCount3 = 0;<br>
>    int AnalyzedFunctionCount3 = 0;<br>
> -  FPM3.addPass(TestFunctionPass(FunctionPassRunCount3, AnalyzedInstrCount3,<br>
> -                                AnalyzedFunctionCount3));<br>
> -  FPM3.addPass(TestInvalidationFunctionPass("f"));<br>
> -  MPM.addPass(createModuleToFunctionPassAdaptor(FPM3));<br>
> +  {<br>
> +    FunctionPassManager FPM;<br>
> +    FPM.addPass(TestFunctionPass(FunctionPassRunCount3, AnalyzedInstrCount3,<br>
> +                                 AnalyzedFunctionCount3));<br>
> +    FPM.addPass(TestInvalidationFunctionPass("f"));<br>
> +    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));<br>
> +  }<br>
><br>
>    // A fourth function pass manager but with a minimal intervening passes.<br>
>    MPM.addPass(TestMinPreservingModulePass());<br>
> -  FunctionPassManager FPM4;<br>
>    int FunctionPassRunCount4 = 0;<br>
>    int AnalyzedInstrCount4 = 0;<br>
>    int AnalyzedFunctionCount4 = 0;<br>
> -  FPM4.addPass(TestFunctionPass(FunctionPassRunCount4, AnalyzedInstrCount4,<br>
> -                                AnalyzedFunctionCount4));<br>
> -  MPM.addPass(createModuleToFunctionPassAdaptor(FPM4));<br>
> +  {<br>
> +    FunctionPassManager FPM;<br>
> +    FPM.addPass(TestFunctionPass(FunctionPassRunCount4, AnalyzedInstrCount4,<br>
> +                                 AnalyzedFunctionCount4));<br>
> +    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));<br>
> +  }<br>
><br>
>    // A fifth function pass manager but which uses only cached results.<br>
> -  FunctionPassManager FPM5;<br>
>    int FunctionPassRunCount5 = 0;<br>
>    int AnalyzedInstrCount5 = 0;<br>
>    int AnalyzedFunctionCount5 = 0;<br>
> -  FPM5.addPass(TestInvalidationFunctionPass("f"));<br>
> -  FPM5.addPass(TestFunctionPass(FunctionPassRunCount5, AnalyzedInstrCount5,<br>
> -                                AnalyzedFunctionCount5,<br>
> -                                /*OnlyUseCachedResults=*/true));<br>
> -  MPM.addPass(createModuleToFunctionPassAdaptor(FPM5));<br>
> +  {<br>
> +    FunctionPassManager FPM;<br>
> +    FPM.addPass(TestInvalidationFunctionPass("f"));<br>
> +    FPM.addPass(TestFunctionPass(FunctionPassRunCount5, AnalyzedInstrCount5,<br>
> +                                 AnalyzedFunctionCount5,<br>
> +                                 /*OnlyUseCachedResults=*/true));<br>
> +    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));<br>
> +  }<br>
><br>
>    MPM.run(M.get(), &MAM);<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>