diff options
| author | Chandler Carruth <chandlerc@gmail.com> | 2019-03-28 00:51:36 +0000 |
|---|---|---|
| committer | Chandler Carruth <chandlerc@gmail.com> | 2019-03-28 00:51:36 +0000 |
| commit | 923ff550b91ebb843f3bbf4cfe9061da90f64780 (patch) | |
| tree | 59033f04ed1271c34efdc5f8556cdb2605622770 /llvm/test | |
| parent | 8ff45859c280089fc3371c45e16efcd57c0e9ce2 (diff) | |
| download | bcm5719-llvm-923ff550b91ebb843f3bbf4cfe9061da90f64780.tar.gz bcm5719-llvm-923ff550b91ebb843f3bbf4cfe9061da90f64780.zip | |
[NewPM] Fix a nasty bug with analysis invalidation in the new PM.
The issue here is that we actually allow CGSCC passes to mutate IR (and
therefore invalidate analyses) outside of the current SCC. At a minimum,
we need to support mutating parent and ancestor SCCs to support the
ArgumentPromotion pass which rewrites all calls to a function.
However, the analysis invalidation infrastructure is heavily based
around not needing to invalidate the same IR-unit at multiple levels.
With Loop passes for example, they don't invalidate other Loops. So we
need to customize how we handle CGSCC invalidation. Doing this without
gratuitously re-running analyses is even harder. I've avoided most of
these by using an out-of-band preserved set to accumulate the cross-SCC
invalidation, but it still isn't perfect in the case of re-visiting the
same SCC repeatedly *but* it coming off the worklist. Unclear how
important this use case really is, but I wanted to call it out.
Another wrinkle is that in order for this to successfully propagate to
function analyses, we have to make sure we have a proxy from the SCC to
the Function level. That requires pre-creating the necessary proxy.
The motivating test case now works cleanly and is added for
ArgumentPromotion.
Thanks for the review from Philip and Wei!
Differential Revision: https://reviews.llvm.org/D59869
llvm-svn: 357137
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Other/new-pass-manager.ll | 4 | ||||
| -rw-r--r-- | llvm/test/Other/new-pm-defaults.ll | 4 | ||||
| -rw-r--r-- | llvm/test/Other/new-pm-thinlto-defaults.ll | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/ArgumentPromotion/invalidation.ll | 50 | ||||
| -rw-r--r-- | llvm/test/Transforms/Inline/cgscc-incremental-invalidate.ll | 1 |
5 files changed, 58 insertions, 5 deletions
diff --git a/llvm/test/Other/new-pass-manager.ll b/llvm/test/Other/new-pass-manager.ll index 5f5ba19a62a..9c914d4de4c 100644 --- a/llvm/test/Other/new-pass-manager.ll +++ b/llvm/test/Other/new-pass-manager.ll @@ -24,7 +24,9 @@ ; CHECK-CGSCC-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*(FunctionAnalysisManager|AnalysisManager<.*Function.*>).*}},{{.*}}Module> ; CHECK-CGSCC-PASS-NEXT: Running analysis: LazyCallGraphAnalysis ; CHECK-CGSCC-PASS-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-CGSCC-PASS-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy ; CHECK-CGSCC-PASS-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-CGSCC-PASS-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph::SCC{{.*}}> ; CHECK-CGSCC-PASS-NEXT: Starting CGSCC pass manager run ; CHECK-CGSCC-PASS-NEXT: Running pass: NoOpCGSCCPass ; CHECK-CGSCC-PASS-NEXT: Finished CGSCC pass manager run @@ -410,7 +412,9 @@ ; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*(FunctionAnalysisManager|AnalysisManager<.*Function.*>).*}},{{.*}}Module> ; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: LazyCallGraphAnalysis ; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy ; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph::SCC{{.*}}> ; CHECK-REPEAT-CGSCC-PASS-NEXT: Starting CGSCC pass manager run ; CHECK-REPEAT-CGSCC-PASS-NEXT: Running pass: RepeatedPass ; CHECK-REPEAT-CGSCC-PASS-NEXT: Starting CGSCC pass manager run diff --git a/llvm/test/Other/new-pm-defaults.ll b/llvm/test/Other/new-pm-defaults.ll index 3ea52063c46..7ca22bf8882 100644 --- a/llvm/test/Other/new-pm-defaults.ll +++ b/llvm/test/Other/new-pm-defaults.ll @@ -117,11 +117,11 @@ ; CHECK-O-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}LazyCallGraph{{.*}}> ; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy ; CHECK-O-NEXT: Running analysis: LazyCallGraphAnalysis +; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy ; CHECK-O-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph::SCC{{.*}}> ; CHECK-O-NEXT: Starting CGSCC pass manager run. ; CHECK-O-NEXT: Running pass: InlinerPass -; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph{{.*}}> -; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy ; CHECK-O-NEXT: Running pass: PostOrderFunctionAttrsPass ; CHECK-O3-NEXT: Running pass: ArgumentPromotionPass ; CHECK-O-NEXT: Running pass: CGSCCToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> diff --git a/llvm/test/Other/new-pm-thinlto-defaults.ll b/llvm/test/Other/new-pm-thinlto-defaults.ll index 4d05f73c593..9ad383a4e3b 100644 --- a/llvm/test/Other/new-pm-thinlto-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-defaults.ll @@ -98,11 +98,11 @@ ; CHECK-O-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}LazyCallGraph{{.*}}> ; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy ; CHECK-O-NEXT: Running analysis: LazyCallGraphAnalysis +; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy ; CHECK-O-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph::SCC{{.*}}> ; CHECK-O-NEXT: Starting CGSCC pass manager run. ; CHECK-O-NEXT: Running pass: InlinerPass -; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph{{.*}}> -; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy ; CHECK-O-NEXT: Running pass: PostOrderFunctionAttrsPass ; CHECK-O3-NEXT: Running pass: ArgumentPromotionPass ; CHECK-O-NEXT: Running pass: CGSCCToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> diff --git a/llvm/test/Transforms/ArgumentPromotion/invalidation.ll b/llvm/test/Transforms/ArgumentPromotion/invalidation.ll new file mode 100644 index 00000000000..fd7168e35a3 --- /dev/null +++ b/llvm/test/Transforms/ArgumentPromotion/invalidation.ll @@ -0,0 +1,50 @@ +; Check that when argument promotion changes a function in some parent node of +; the call graph, any analyses that happened to be cached for that function are +; actually invalidated. We are using `demanded-bits` here because when printed +; it will end up caching a value for every instruction, making it easy to +; detect the instruction-level changes that will fail here. With improper +; invalidation this will crash in the second printer as it tries to reuse +; now-invalid demanded bits. +; +; RUN: opt < %s -passes='function(print<demanded-bits>),cgscc(argpromotion,function(print<demanded-bits>))' -S | FileCheck %s + +@G = constant i32 0 + +define internal i32 @a(i32* %x) { +; CHECK-LABEL: define internal i32 @a( +; CHECK-SAME: i32 %[[V:.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: ret i32 %[[V]] +; CHECK-NEXT: } +entry: + %v = load i32, i32* %x + ret i32 %v +} + +define i32 @b() { +; CHECK-LABEL: define i32 @b() +; CHECK-NEXT: entry: +; CHECK-NEXT: %[[L:.*]] = load i32, i32* @G +; CHECK-NEXT: %[[V:.*]] = call i32 @a(i32 %[[L]]) +; CHECK-NEXT: ret i32 %[[V]] +; CHECK-NEXT: } +entry: + %v = call i32 @a(i32* @G) + ret i32 %v +} + +define i32 @c() { +; CHECK-LABEL: define i32 @c() +; CHECK-NEXT: entry: +; CHECK-NEXT: %[[L:.*]] = load i32, i32* @G +; CHECK-NEXT: %[[V1:.*]] = call i32 @a(i32 %[[L]]) +; CHECK-NEXT: %[[V2:.*]] = call i32 @b() +; CHECK-NEXT: %[[RESULT:.*]] = add i32 %[[V1]], %[[V2]] +; CHECK-NEXT: ret i32 %[[RESULT]] +; CHECK-NEXT: } +entry: + %v1 = call i32 @a(i32* @G) + %v2 = call i32 @b() + %result = add i32 %v1, %v2 + ret i32 %result +} diff --git a/llvm/test/Transforms/Inline/cgscc-incremental-invalidate.ll b/llvm/test/Transforms/Inline/cgscc-incremental-invalidate.ll index ba9f087a1cb..5a429bc3a4f 100644 --- a/llvm/test/Transforms/Inline/cgscc-incremental-invalidate.ll +++ b/llvm/test/Transforms/Inline/cgscc-incremental-invalidate.ll @@ -8,7 +8,6 @@ ; ; CHECK-LABEL: Starting llvm::Module pass manager run. ; CHECK: Running pass: InlinerPass on (test1_f, test1_g, test1_h) -; CHECK: Running analysis: FunctionAnalysisManagerCGSCCProxy on (test1_f, test1_g, test1_h) ; CHECK: Running analysis: DominatorTreeAnalysis on test1_f ; CHECK: Running analysis: DominatorTreeAnalysis on test1_g ; CHECK: Invalidating all non-preserved analyses for: (test1_f) |

