[llvm] r280444 - [PM] (NFC) Refactor the CGSCC pass manager tests to use lambda-based

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 1 20:42:28 PDT 2016


Hi Chandler,

Your checkin seems to have broken the VS2013 build. When I attempted to build your change, I got the following errors:

  CGSCCPassManagerTest.cpp
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(283): error C2064: term does not evaluate to a function taking 4 arguments [C:\src\build\unittests\Analysis\AnalysisTests.vcxproj]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(228) : see reference to function template instantiation '_Ret std::_Callable_obj<`anonymous-namespace'::LambdaSCCPass,false>::_ApplyX<_Rx,llvm::LazyCallGraph::SCC&,llvm::CGSCCAnalysisManager&,llvm::LazyCallGraph&,llvm::CGSCCUpdateResult&>(llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Rx=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(228) : see reference to function template instantiation '_Ret std::_Callable_obj<`anonymous-namespace'::LambdaSCCPass,false>::_ApplyX<_Rx,llvm::LazyCallGraph::SCC&,llvm::CGSCCAnalysisManager&,llvm::LazyCallGraph&,llvm::CGSCCUpdateResult&>(llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Rx=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(226) : while compiling class template member function 'llvm::PreservedAnalyses std::_Func_impl<_MyWrapper,_Alloc,_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::_Do_call(llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &)'
          with
          [
              _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>
  ,            _Ret=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(495) : see reference to class template instantiation 'std::_Func_impl<_MyWrapper,_Alloc,_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>' being compiled
          with
          [
              _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>
  ,            _Ret=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(396) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>
  ,            _Fty=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(396) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>
  ,            _Fty=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(385) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Fty=`anonymous-namespace'::LambdaSCCPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(385) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Fty=`anonymous-namespace'::LambdaSCCPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>>
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(671) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::_Reset<_Ty>(_Fty &&)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Fty=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(671) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::_Reset<_Ty>(_Fty &&)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Fty=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(130) : see reference to function template instantiation 'std::function<llvm::PreservedAnalyses (llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &)>::function<_Ty>(_Fx &&)' being compiled
          with
          [
              _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Fx=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(130) : see reference to function template instantiation 'std::function<llvm::PreservedAnalyses (llvm::LazyCallGraph::SCC &,llvm::CGSCCAnalysisManager &,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &)>::function<_Ty>(_Fx &&)' being compiled
          with
          [
              _Ty=`anonymous-namespace'::LambdaSCCPass
  ,            _Fx=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\src\llvm\include\llvm/IR/PassManager.h(319) : see reference to function template instantiation '`anonymous-namespace'::LambdaSCCPass::LambdaSCCPass<`anonymous-namespace'::LambdaSCCPass>(T &&)' being compiled
          with
          [
              T=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(252) : see reference to function template instantiation 'void llvm::PassManager<llvm::LazyCallGraph::SCC,llvm::CGSCCAnalysisManager,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::addPass<`anonymous-namespace'::LambdaSCCPass>(PassT)' being compiled
          with
          [
              PassT=`anonymous-namespace'::LambdaSCCPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(252) : see reference to function template instantiation 'void llvm::PassManager<llvm::LazyCallGraph::SCC,llvm::CGSCCAnalysisManager,llvm::LazyCallGraph &,llvm::CGSCCUpdateResult &>::addPass<`anonymous-namespace'::LambdaSCCPass>(PassT)' being compiled
          with
          [
              PassT=`anonymous-namespace'::LambdaSCCPass
          ]
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(283): error C2064: term does not evaluate to a function taking 2 arguments [C:\src\build\unittests\Analysis\AnalysisTests.vcxproj]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(228) : see reference to function template instantiation '_Ret std::_Callable_obj<`anonymous-namespace'::LambdaFunctionPass,false>::_ApplyX<_Rx,llvm::Function&,llvm::FunctionAnalysisManager&>(llvm::Function &,llvm::FunctionAnalysisManager &)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Rx=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(228) : see reference to function template instantiation '_Ret std::_Callable_obj<`anonymous-namespace'::LambdaFunctionPass,false>::_ApplyX<_Rx,llvm::Function&,llvm::FunctionAnalysisManager&>(llvm::Function &,llvm::FunctionAnalysisManager &)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Rx=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(226) : while compiling class template member function 'llvm::PreservedAnalyses std::_Func_impl<_MyWrapper,_Alloc,_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>::_Do_call(llvm::Function &,llvm::FunctionAnalysisManager &)'
          with
          [
              _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::Function &,llvm::FunctionAnalysisManager &>>
  ,            _Ret=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(495) : see reference to class template instantiation 'std::_Func_impl<_MyWrapper,_Alloc,_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>' being compiled
          with
          [
              _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::Function &,llvm::FunctionAnalysisManager &>>
  ,            _Ret=llvm::PreservedAnalyses
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(396) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::Function &,llvm::FunctionAnalysisManager &>>
  ,            _Fty=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(396) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::Function &,llvm::FunctionAnalysisManager &>>
  ,            _Fty=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(385) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>>>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Fty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::Function &,llvm::FunctionAnalysisManager &>>
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(385) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>>>(_Fty &&,_Alloc)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Fty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Alloc=std::allocator<std::_Func_class<llvm::PreservedAnalyses,llvm::Function &,llvm::FunctionAnalysisManager &>>
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(671) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>::_Reset<_Ty>(_Fty &&)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Fty=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(671) : see reference to function template instantiation 'void std::_Func_class<_Ret,llvm::Function &,llvm::FunctionAnalysisManager &>::_Reset<_Ty>(_Fty &&)' being compiled
          with
          [
              _Ret=llvm::PreservedAnalyses
  ,            _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Fty=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(143) : see reference to function template instantiation 'std::function<llvm::PreservedAnalyses (llvm::Function &,llvm::FunctionAnalysisManager &)>::function<_Ty>(_Fx &&)' being compiled
          with
          [
              _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Fx=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(143) : see reference to function template instantiation 'std::function<llvm::PreservedAnalyses (llvm::Function &,llvm::FunctionAnalysisManager &)>::function<_Ty>(_Fx &&)' being compiled
          with
          [
              _Ty=`anonymous-namespace'::LambdaFunctionPass
  ,            _Fx=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\src\llvm\include\llvm/IR/PassManager.h(319) : see reference to function template instantiation '`anonymous-namespace'::LambdaFunctionPass::LambdaFunctionPass<`anonymous-namespace'::LambdaFunctionPass>(T &&)' being compiled
          with
          [
              T=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(259) : see reference to function template instantiation 'void llvm::PassManager<llvm::Function,llvm::AnalysisManager<IRUnitT,>,>::addPass<`anonymous-namespace'::LambdaFunctionPass>(PassT)' being compiled
          with
          [
              IRUnitT=llvm::Function
  ,            PassT=`anonymous-namespace'::LambdaFunctionPass
          ]
          C:\src\llvm\unittests\Analysis\CGSCCPassManagerTest.cpp(259) : see reference to function template instantiation 'void llvm::PassManager<llvm::Function,llvm::AnalysisManager<IRUnitT,>,>::addPass<`anonymous-namespace'::LambdaFunctionPass>(PassT)' being compiled
          with
          [
              IRUnitT=llvm::Function
  ,            PassT=`anonymous-namespace'::LambdaFunctionPass
          ]


Could you take a look into this?

Douglas Yung

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
> Behalf Of Chandler Carruth via llvm-commits
> Sent: Thursday, September 01, 2016 18:08
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r280444 - [PM] (NFC) Refactor the CGSCC pass manager
> tests to use lambda-based
> 
> Author: chandlerc
> Date: Thu Sep  1 20:08:04 2016
> New Revision: 280444
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=280444&view=rev
> Log:
> [PM] (NFC) Refactor the CGSCC pass manager tests to use lambda-based
> passes.
> 
> This simplifies the test some and makes it more focused and clear what
> is being tested. It will also make it much easier to extend with
> further testing of different pass behaviors.
> 
> I've also replaced a pointless module pass with running the requires
> pass directly as that is all that it was really doing.
> 
> Modified:
>     llvm/trunk/unittests/Analysis/CGSCCPassManagerTest.cpp
> 
> Modified: llvm/trunk/unittests/Analysis/CGSCCPassManagerTest.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/unittests/Analysis/CGSCCPassManagerTest.cpp?rev=2804
> 44&r1=280443&r2=280444&view=diff
> =======================================================================
> =======
> --- llvm/trunk/unittests/Analysis/CGSCCPassManagerTest.cpp (original)
> +++ llvm/trunk/unittests/Analysis/CGSCCPassManagerTest.cpp Thu Sep  1
> +++ 20:08:04 2016
> @@ -126,87 +126,27 @@ private:
> 
>  char TestImmutableFunctionAnalysis::PassID;
> 
> -struct TestModulePass {
> -  TestModulePass(int &RunCount) : RunCount(RunCount) {}
> -
> -  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) {
> -    ++RunCount;
> -    (void)AM.getResult<TestModuleAnalysis>(M);
> -    return PreservedAnalyses::all();
> -  }
> -
> -  static StringRef name() { return "TestModulePass"; }
> -
> -  int &RunCount;
> -};
> -
> -struct TestSCCPass {
> -  TestSCCPass(int &RunCount, int &AnalyzedInstrCount,
> -              int &AnalyzedSCCFunctionCount, int
> &AnalyzedModuleFunctionCount,
> -              bool OnlyUseCachedResults = false)
> -      : RunCount(RunCount), AnalyzedInstrCount(AnalyzedInstrCount),
> -        AnalyzedSCCFunctionCount(AnalyzedSCCFunctionCount),
> -        AnalyzedModuleFunctionCount(AnalyzedModuleFunctionCount),
> -        OnlyUseCachedResults(OnlyUseCachedResults) {}
> +struct LambdaSCCPass : public PassInfoMixin<LambdaSCCPass> {
> +  template <typename T> LambdaSCCPass(T &&Arg) :
> +Func(std::forward<T>(Arg)) {}
> 
>    PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager
> &AM,
>                          LazyCallGraph &CG, CGSCCUpdateResult &UR) {
> -    ++RunCount;
> -
> -    const ModuleAnalysisManager &MAM =
> -        AM.getResult<ModuleAnalysisManagerCGSCCProxy>(C,
> CG).getManager();
> -    FunctionAnalysisManager &FAM =
> -        AM.getResult<FunctionAnalysisManagerCGSCCProxy>(C,
> CG).getManager();
> -    if (TestModuleAnalysis::Result *TMA =
> -            MAM.getCachedResult<TestModuleAnalysis>(
> -                *C.begin()->getFunction().getParent()))
> -      AnalyzedModuleFunctionCount += TMA->FunctionCount;
> -
> -    if (OnlyUseCachedResults) {
> -      // Hack to force the use of the cached interface.
> -      if (TestSCCAnalysis::Result *AR =
> AM.getCachedResult<TestSCCAnalysis>(C))
> -        AnalyzedSCCFunctionCount += AR->FunctionCount;
> -      for (LazyCallGraph::Node &N : C)
> -        if (TestFunctionAnalysis::Result *FAR =
> -
> FAM.getCachedResult<TestFunctionAnalysis>(N.getFunction()))
> -          AnalyzedInstrCount += FAR->InstructionCount;
> -    } else {
> -      // Typical path just runs the analysis as needed.
> -      TestSCCAnalysis::Result &AR = AM.getResult<TestSCCAnalysis>(C,
> CG);
> -      AnalyzedSCCFunctionCount += AR.FunctionCount;
> -      for (LazyCallGraph::Node &N : C) {
> -        TestFunctionAnalysis::Result &FAR =
> -            FAM.getResult<TestFunctionAnalysis>(N.getFunction());
> -        AnalyzedInstrCount += FAR.InstructionCount;
> -
> -        // Just ensure we get the immutable results.
> -
> (void)FAM.getResult<TestImmutableFunctionAnalysis>(N.getFunction());
> -      }
> -    }
> -
> -    return PreservedAnalyses::all();
> +    return Func(C, AM, CG, UR);
>    }
> 
> -  static StringRef name() { return "TestSCCPass"; }
> -
> -  int &RunCount;
> -  int &AnalyzedInstrCount;
> -  int &AnalyzedSCCFunctionCount;
> -  int &AnalyzedModuleFunctionCount;
> -  bool OnlyUseCachedResults;
> +  std::function<PreservedAnalyses(LazyCallGraph::SCC &,
> CGSCCAnalysisManager &,
> +                                  LazyCallGraph &, CGSCCUpdateResult
> &)>
> +      Func;
>  };
> 
> -struct TestFunctionPass {
> -  TestFunctionPass(int &RunCount) : RunCount(RunCount) {}
> +struct LambdaFunctionPass : public PassInfoMixin<LambdaFunctionPass> {
> +  template <typename T> LambdaFunctionPass(T &&Arg) :
> +Func(std::forward<T>(Arg)) {}
> 
> -  PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
> -    ++RunCount;
> -    return PreservedAnalyses::none();
> +  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) {
> +    return Func(F, AM);
>    }
> 
> -  static StringRef name() { return "TestFunctionPass"; }
> -
> -  int &RunCount;
> +  std::function<PreservedAnalyses(Function &, FunctionAnalysisManager
> + &)> Func;
>  };
> 
>  std::unique_ptr<Module> parseIR(const char *IR) { @@ -276,28 +216,52
> @@ TEST(CGSCCPassManagerTest, Basic) {
>    FAM.registerPass([&] { return
> ModuleAnalysisManagerFunctionProxy(MAM); });
> 
>    ModulePassManager MPM(/*DebugLogging*/ true);
> -  int ModulePassRunCount1 = 0;
> -  MPM.addPass(TestModulePass(ModulePassRunCount1));
> +  MPM.addPass(RequireAnalysisPass<TestModuleAnalysis, Module>());
> 
>    CGSCCPassManager CGPM1(/*DebugLogging*/ true);
>    int SCCPassRunCount1 = 0;
>    int AnalyzedInstrCount1 = 0;
>    int AnalyzedSCCFunctionCount1 = 0;
>    int AnalyzedModuleFunctionCount1 = 0;
> -  CGPM1.addPass(TestSCCPass(SCCPassRunCount1, AnalyzedInstrCount1,
> -                            AnalyzedSCCFunctionCount1,
> -                            AnalyzedModuleFunctionCount1));
> +  CGPM1.addPass(
> +      LambdaSCCPass([&](LazyCallGraph::SCC &C, CGSCCAnalysisManager
> &AM,
> +                        LazyCallGraph &CG, CGSCCUpdateResult &UR) {
> +        ++SCCPassRunCount1;
> +
> +        const ModuleAnalysisManager &MAM =
> +            AM.getResult<ModuleAnalysisManagerCGSCCProxy>(C,
> CG).getManager();
> +        FunctionAnalysisManager &FAM =
> +            AM.getResult<FunctionAnalysisManagerCGSCCProxy>(C,
> CG).getManager();
> +        if (TestModuleAnalysis::Result *TMA =
> +                MAM.getCachedResult<TestModuleAnalysis>(
> +                    *C.begin()->getFunction().getParent()))
> +          AnalyzedModuleFunctionCount1 += TMA->FunctionCount;
> +
> +        TestSCCAnalysis::Result &AR = AM.getResult<TestSCCAnalysis>(C,
> CG);
> +        AnalyzedSCCFunctionCount1 += AR.FunctionCount;
> +        for (LazyCallGraph::Node &N : C) {
> +          TestFunctionAnalysis::Result &FAR =
> +              FAM.getResult<TestFunctionAnalysis>(N.getFunction());
> +          AnalyzedInstrCount1 += FAR.InstructionCount;
> +
> +          // Just ensure we get the immutable results.
> +
> (void)FAM.getResult<TestImmutableFunctionAnalysis>(N.getFunction());
> +        }
> +
> +        return PreservedAnalyses::all();
> +      }));
> 
>    FunctionPassManager FPM1(/*DebugLogging*/ true);
>    int FunctionPassRunCount1 = 0;
> -  FPM1.addPass(TestFunctionPass(FunctionPassRunCount1));
> +  FPM1.addPass(LambdaFunctionPass([&](Function &,
> FunctionAnalysisManager &) {
> +    ++FunctionPassRunCount1;
> +    return PreservedAnalyses::all();
> +  }));
>    CGPM1.addPass(createCGSCCToFunctionPassAdaptor(std::move(FPM1)));
> 
> MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM1)));
> 
>    MPM.run(*M, MAM);
> 
> -  EXPECT_EQ(1, ModulePassRunCount1);
> -
>    EXPECT_EQ(1, ModuleAnalysisRuns);
>    EXPECT_EQ(4, SCCAnalysisRuns);
>    EXPECT_EQ(6, FunctionAnalysisRuns);
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list