xref: /llvm-project/llvm/test/Other/loop-pm-invalidation.ll (revision 361cba22b2013f66e5b18896ffcf2564b332ab7b)
1; Test that the loop PM infrastructure is invalidated appropriately.
2;
3; Check that we always nuke the LPM stuff when the loops themselves are
4; invalidated.
5; RUN: opt -disable-output -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager -aa-pipeline= %s 2>&1 \
6; RUN:     -passes='loop(no-op-loop),invalidate<loops>,loop(no-op-loop)' \
7; RUN:     | FileCheck %s --check-prefix=CHECK-LOOP-INV
8;
9; If we ended up building the standard analyses, their invalidation should nuke
10; stuff as well.
11; RUN: opt -disable-output -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager %s -aa-pipeline= 2>&1 \
12; RUN:     -passes='loop(no-op-loop),invalidate<scalar-evolution>,loop(no-op-loop)' \
13; RUN:     | FileCheck %s --check-prefix=CHECK-SCEV-INV
14;
15; Also provide a test that can delete loops after populating analyses for them.
16; RUN: opt -disable-output -disable-verify -verify-analysis-invalidation=0  -debug-pass-manager %s -aa-pipeline= 2>&1 \
17; RUN:     -passes='loop(no-op-loop,loop-deletion),invalidate<scalar-evolution>,loop(no-op-loop)' \
18; RUN:     | FileCheck %s --check-prefix=CHECK-SCEV-INV-AFTER-DELETE
19
20define void @no_loops() {
21; CHECK-LOOP-INV: Running pass: LoopSimplifyPass
22; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
23; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis
24; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis
25; CHECK-LOOP-INV-NEXT: Running analysis: TargetIRAnalysis
26; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
27; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis
28; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis
29; CHECK-LOOP-INV-NEXT: Running pass: LoopSimplifyPass
30; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
31; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
32;
33; CHECK-SCEV-INV: Running pass: LoopSimplifyPass
34; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis
35; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis
36; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis
37; CHECK-SCEV-INV-NEXT: Running analysis: TargetIRAnalysis
38; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
39; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis
40; CHECK-SCEV-INV-NEXT: Running pass: LoopSimplifyPass
41; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
42
43entry:
44  ret void
45}
46
47define void @one_loop(ptr %ptr) {
48; CHECK-LOOP-INV: Running pass: LoopSimplifyPass
49; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
50; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis
51; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis
52; CHECK-LOOP-INV-NEXT: Running analysis: TargetIRAnalysis
53; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
54; CHECK-LOOP-INV-NEXT: Running analysis: AAManager
55; CHECK-LOOP-INV-NEXT: Running analysis: TargetLibraryAnalysis
56; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
57; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
58; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
59; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis
60; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
61; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis
62; CHECK-LOOP-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis
63; CHECK-LOOP-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop
64; CHECK-LOOP-INV-NEXT: Running pass: LoopSimplifyPass
65; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
66; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
67; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
68; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
69; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
70;
71; CHECK-SCEV-INV-NEXT: Running pass: LoopSimplifyPass
72; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis
73; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis
74; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis
75; CHECK-SCEV-INV-NEXT: Running analysis: TargetIRAnalysis
76; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
77; CHECK-SCEV-INV-NEXT: Running analysis: AAManager
78; CHECK-SCEV-INV-NEXT: Running analysis: TargetLibraryAnalysis
79; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
80; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
81; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
82; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis
83; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
84; CHECK-SCEV-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis
85; CHECK-SCEV-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop
86; CHECK-SCEV-INV-NEXT: Running pass: LoopSimplifyPass
87; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
88; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
89; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
90; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
91
92entry:
93  br label %l0.header
94
95l0.header:
96  %flag0 = load volatile i1, ptr %ptr
97  br i1 %flag0, label %l0.header, label %exit
98
99exit:
100  ret void
101}
102
103define void @nested_loops(ptr %ptr) {
104; CHECK-LOOP-INV: Running pass: LoopSimplifyPass
105; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
106; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis
107; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis
108; CHECK-LOOP-INV-NEXT: Running analysis: TargetIRAnalysis
109; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
110; CHECK-LOOP-INV-NEXT: Running analysis: AAManager
111; CHECK-LOOP-INV-NEXT: Running analysis: TargetLibraryAnalysis
112; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
113; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
114; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
115; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
116; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis
117; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
118; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
119; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis
120; CHECK-LOOP-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis
121; CHECK-LOOP-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop
122; CHECK-LOOP-INV-NEXT: Running pass: LoopSimplifyPass
123; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
124; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
125; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
126; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
127; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
128; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
129;
130; CHECK-SCEV-INV: Running pass: LoopSimplifyPass
131; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis
132; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis
133; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis
134; CHECK-SCEV-INV-NEXT: Running analysis: TargetIRAnalysis
135; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
136; CHECK-SCEV-INV-NEXT: Running analysis: AAManager
137; CHECK-SCEV-INV-NEXT: Running analysis: TargetLibraryAnalysis
138; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
139; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
140; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
141; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
142; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis
143; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
144; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
145; CHECK-SCEV-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis
146; CHECK-SCEV-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop
147; CHECK-SCEV-INV-NEXT: Running pass: LoopSimplifyPass
148; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
149; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
150; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
151; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
152; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
153
154entry:
155  br label %l.0.header
156
157l.0.header:
158  br label %l.0.0.header
159
160l.0.0.header:
161  %flag.0.0 = load volatile i1, ptr %ptr
162  br i1 %flag.0.0, label %l.0.0.header, label %l.0.latch
163
164l.0.latch:
165  %flag.0 = load volatile i1, ptr %ptr
166  br i1 %flag.0, label %l.0.header, label %exit
167
168exit:
169  ret void
170}
171
172define void @dead_loop() {
173; CHECK-LOOP-INV: Running pass: LoopSimplifyPass
174; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
175; CHECK-LOOP-INV-NEXT: Running analysis: DominatorTreeAnalysis
176; CHECK-LOOP-INV-NEXT: Running analysis: AssumptionAnalysis
177; CHECK-LOOP-INV-NEXT: Running analysis: TargetIRAnalysis
178; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
179; CHECK-LOOP-INV-NEXT: Running analysis: AAManager
180; CHECK-LOOP-INV-NEXT: Running analysis: TargetLibraryAnalysis
181; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
182; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
183; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
184; CHECK-LOOP-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}LoopAnalysis
185; CHECK-LOOP-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
186; CHECK-LOOP-INV-NEXT: Invalidating analysis: LoopAnalysis
187; CHECK-LOOP-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis
188; CHECK-LOOP-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop
189; CHECK-LOOP-INV-NEXT: Running pass: LoopSimplifyPass
190; CHECK-LOOP-INV-NEXT: Running analysis: LoopAnalysis
191; CHECK-LOOP-INV-NEXT: Running pass: LCSSAPass
192; CHECK-LOOP-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
193; CHECK-LOOP-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
194; CHECK-LOOP-INV-NEXT: Running pass: NoOpLoopPass
195;
196; CHECK-SCEV-INV: Running pass: LoopSimplifyPass
197; CHECK-SCEV-INV-NEXT: Running analysis: LoopAnalysis
198; CHECK-SCEV-INV-NEXT: Running analysis: DominatorTreeAnalysis
199; CHECK-SCEV-INV-NEXT: Running analysis: AssumptionAnalysis
200; CHECK-SCEV-INV-NEXT: Running analysis: TargetIRAnalysis
201; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
202; CHECK-SCEV-INV-NEXT: Running analysis: AAManager
203; CHECK-SCEV-INV-NEXT: Running analysis: TargetLibraryAnalysis
204; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
205; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
206; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
207; CHECK-SCEV-INV-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis
208; CHECK-SCEV-INV-NEXT: Clearing all analysis results for: <possibly invalidated loop>
209; CHECK-SCEV-INV-NEXT: Invalidating analysis: ScalarEvolutionAnalysis
210; CHECK-SCEV-INV-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop
211; CHECK-SCEV-INV-NEXT: Running pass: LoopSimplifyPass
212; CHECK-SCEV-INV-NEXT: Running pass: LCSSAPass
213; CHECK-SCEV-INV-NEXT: Running analysis: ScalarEvolutionAnalysis
214; CHECK-SCEV-INV-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
215; CHECK-SCEV-INV-NEXT: Running pass: NoOpLoopPass
216;
217; CHECK-SCEV-INV-AFTER-DELETE-LABEL: Running pass: LoopSimplifyPass on dead_loop
218; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: LoopAnalysis
219; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: DominatorTreeAnalysis
220; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: AssumptionAnalysis
221; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: TargetIRAnalysis
222; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: LCSSAPass
223; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: AAManager
224; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: TargetLibraryAnalysis
225; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: ScalarEvolutionAnalysis
226; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Loop
227; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: NoOpLoopPass
228; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: LoopDeletionPass
229; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Clearing all analysis results for:
230; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ScalarEvolutionAnalysis
231; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Invalidating analysis: ScalarEvolutionAnalysis
232; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Invalidating analysis: InnerAnalysisManagerProxy<{{.*}}Loop
233; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: LoopSimplifyPass
234; CHECK-SCEV-INV-AFTER-DELETE-NEXT: Running pass: LCSSAPass
235
236entry:
237  br label %l0.header
238
239l0.header:
240  br i1 false, label %l0.header, label %exit
241
242exit:
243  ret void
244}
245