From 6347acc24693cb25fd532a9b12af1aaa6ff159a4 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Fri, 21 May 2021 16:12:03 -0700 Subject: [PATCH] Revert "[NPM] Do not run function simplification pipeline unnecessarily" This reverts commit 97ab068034161fb35e5c9a7b293bf1e569cf077b. Depends on D100917, which is to be reverted. --- include/llvm/Analysis/CGSCCPassManager.h | 12 ------ lib/Analysis/CGSCCPassManager.cpp | 9 ---- lib/Passes/PassBuilder.cpp | 14 +------ lib/Passes/PassRegistry.def | 1 - .../Other/new-pass-manager-cgscc-fct-proxy.ll | 41 ------------------- unittests/Analysis/CGSCCPassManagerTest.cpp | 1 - 6 files changed, 2 insertions(+), 76 deletions(-) delete mode 100644 test/Other/new-pass-manager-cgscc-fct-proxy.ll diff --git a/include/llvm/Analysis/CGSCCPassManager.h b/include/llvm/Analysis/CGSCCPassManager.h index 4a9f7f11895..985424a7405 100644 --- a/include/llvm/Analysis/CGSCCPassManager.h +++ b/include/llvm/Analysis/CGSCCPassManager.h @@ -487,18 +487,6 @@ private: std::unique_ptr Pass; }; -/// A 'signaling' analysis to indicate whether a function has been changed. It -/// is meant to control the runs of the function pass(es) managed by the -/// FunctionAnalysisManagerCGSCCProxy. -class FunctionStatusAnalysis - : public AnalysisInfoMixin { -public: - static AnalysisKey Key; - struct Result {}; - - Result run(Function &F, FunctionAnalysisManager &FAM) { return Result(); } -}; - /// A function to deduce a function pass type and wrap it in the /// templated adaptor. template diff --git a/lib/Analysis/CGSCCPassManager.cpp b/lib/Analysis/CGSCCPassManager.cpp index 38d5c205e5e..c01704162e9 100644 --- a/lib/Analysis/CGSCCPassManager.cpp +++ b/lib/Analysis/CGSCCPassManager.cpp @@ -44,8 +44,6 @@ static cl::opt AbortOnMaxDevirtIterationsReached( cl::desc("Abort when the max iterations for devirtualization CGSCC repeat " "pass is reached")); -AnalysisKey FunctionStatusAnalysis::Key; - // Explicit instantiations for the core proxy templates. template class AllAnalysesOn; template class AnalysisManager; @@ -543,13 +541,6 @@ PreservedAnalyses CGSCCToFunctionPassAdaptor::run(LazyCallGraph::SCC &C, continue; Function &F = N->getFunction(); - // The expectation here is that FunctionStatusAnalysis was required at the - // end of the function passes pipeline managed by this adaptor. Then, if any - // CGSCC passes were re-run because CGSCCs changed (or devirtualization), - // and none changed F, then FunctionStatusAnalysis would still be cached - // here and we don't need to rerun the passes managed by this adaptor. - if (FAM.getCachedResult(F)) - continue; PassInstrumentation PI = FAM.getResult(F); if (!PI.runBeforePass(*Pass, F)) diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index 4f18dac2d1e..3a44dcf82ad 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -277,11 +277,6 @@ static cl::opt EnableO3NonTrivialUnswitching( "enable-npm-O3-nontrivial-unswitch", cl::init(true), cl::Hidden, cl::ZeroOrMore, cl::desc("Enable non-trivial loop unswitching for -O3")); -static cl::opt DoNotRerunFunctionPasses( - "cgscc-npm-no-fp-rerun", cl::init(false), - cl::desc("Do not rerun function passes wrapped by the scc pass adapter, if " - "they were run already and the function hasn't changed.")); - PipelineTuningOptions::PipelineTuningOptions() { LoopInterleaving = true; LoopVectorization = true; @@ -1027,10 +1022,8 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level, // Lastly, add the core function simplification pipeline nested inside the // CGSCC walk. - auto FSP = buildFunctionSimplificationPipeline(Level, Phase); - if (DoNotRerunFunctionPasses) - FSP.addPass(RequireAnalysisPass()); - MainCGPipeline.addPass(createCGSCCToFunctionPassAdaptor(std::move(FSP))); + MainCGPipeline.addPass(createCGSCCToFunctionPassAdaptor( + buildFunctionSimplificationPipeline(Level, Phase))); return MIWP; } @@ -1189,9 +1182,6 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level, MPM.addPass(SyntheticCountsPropagation()); MPM.addPass(buildInlinerPipeline(Level, Phase)); - if (DoNotRerunFunctionPasses) - MPM.addPass(createModuleToFunctionPassAdaptor( - InvalidateAnalysisPass())); if (EnableMemProfiler && Phase != ThinOrFullLTOPhase::ThinLTOPreLink) { MPM.addPass(createModuleToFunctionPassAdaptor(MemProfilerPass())); diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index 66bbe6eea4a..99e190b99fc 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -173,7 +173,6 @@ FUNCTION_ANALYSIS("targetir", FUNCTION_ANALYSIS("verify", VerifierAnalysis()) FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) FUNCTION_ANALYSIS("divergence", DivergenceAnalysis()) -FUNCTION_ANALYSIS("func-status", FunctionStatusAnalysis()) #ifndef FUNCTION_ALIAS_ANALYSIS #define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \ diff --git a/test/Other/new-pass-manager-cgscc-fct-proxy.ll b/test/Other/new-pass-manager-cgscc-fct-proxy.ll deleted file mode 100644 index 90f23faefdf..00000000000 --- a/test/Other/new-pass-manager-cgscc-fct-proxy.ll +++ /dev/null @@ -1,41 +0,0 @@ -; RUN: opt %s -disable-verify -disable-output -passes='default' -debug-pass-manager=verbose -cgscc-npm-no-fp-rerun=1 \ -; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,NOREPS -; RUN: opt %s -disable-verify -disable-output -passes='default' -debug-pass-manager=verbose -cgscc-npm-no-fp-rerun=0 \ -; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,REPS - -; Pre-attribute the functions to avoid the PostOrderFunctionAttrsPass cause -; changes (and keep the test simple) -attributes #0 = { nofree noreturn nosync nounwind readnone } - -define void @f1(void()* %p) { - call void %p() - ret void -} - -define void @f2() #0 { - call void @f1(void()* @f2) - call void @f3() - ret void -} - -define void @f3() #0 { - call void @f2() - ret void -} - -; CHECK: Running pass: PassManager{{.*}}CGSCC -; CHECK-NEXT: Running pass: InlinerPass on (f1) -; NOREPS: Running analysis: FunctionStatusAnalysis on f1 - -; CHECK: Running pass: PassManager{{.*}}CGSCC -; CHECK-NEXT: Running pass: InlinerPass on (f2, f3) -; NOREPS: Running analysis: FunctionStatusAnalysis on f2 - -; CHECK: Running pass: PassManager{{.*}}CGSCC -; CHECK-NEXT: Running pass: InlinerPass on (f2) -; REPS: Running pass: SROA on f2 -; NOREPS-NOT: Running pass: SROA on f2 - -; CHECK: Running pass: PassManager{{.*}}CGSCC -; CHECK-NEXT: Running pass: InlinerPass on (f3) -; CHECK: Running pass: SROA on f3 diff --git a/unittests/Analysis/CGSCCPassManagerTest.cpp b/unittests/Analysis/CGSCCPassManagerTest.cpp index 5b0eb90f75a..e0b0aeda5bb 100644 --- a/unittests/Analysis/CGSCCPassManagerTest.cpp +++ b/unittests/Analysis/CGSCCPassManagerTest.cpp @@ -251,7 +251,6 @@ public: " call void @h1()\n" " ret void\n" "}\n")) { - FAM.registerPass([&] { return FunctionStatusAnalysis(); }); FAM.registerPass([&] { return TargetLibraryAnalysis(); }); MAM.registerPass([&] { return LazyCallGraphAnalysis(); }); MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); });