OLD | NEW |
1 ; Test the the loop nest depth is correctly calculated for basic blocks. | 1 ; Test the the loop nest depth is correctly calculated for basic blocks. |
2 | 2 |
3 ; REQUIRES: allow_dump | 3 ; REQUIRES: allow_dump |
4 | 4 |
5 ; Single threaded so that the dumps used for checking happen in order. | 5 ; Single threaded so that the dumps used for checking happen in order. |
6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 --verbose=loop \ | 6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 --verbose=loop \ |
7 ; RUN: -log=%t --threads=0 && FileCheck %s < %t | 7 ; RUN: -log=%t --threads=0 && FileCheck %s < %t |
8 | 8 |
9 define internal void @test_single_loop(i32 %a32) { | 9 define internal void @test_single_loop(i32 %a32) { |
10 entry: | 10 entry: |
11 %a = trunc i32 %a32 to i1 | 11 %a = trunc i32 %a32 to i1 |
12 br label %loop0 | 12 br label %loop0 |
13 | 13 |
14 loop0: ; <-+ | 14 loop0: ; <-+ |
15 br label %loop1 ; | | 15 br label %loop1 ; | |
16 loop1: ; | | 16 loop1: ; | |
17 br i1 %a, label %loop0, label %out ; --+ | 17 br i1 %a, label %loop0, label %out ; --+ |
18 | 18 |
19 out: | 19 out: |
20 ret void | 20 ret void |
21 } | 21 } |
22 | 22 |
23 ; CHECK-LABEL: After loop nest depth analysis | 23 ; CHECK-LABEL: After loop analysis |
24 ; CHECK-NEXT: entry: | 24 ; CHECK-NEXT: entry: |
25 ; CHECK-NEXT: LoopNestDepth = 0 | 25 ; CHECK-NEXT: LoopNestDepth = 0 |
26 ; CHECK-NEXT: loop0: | 26 ; CHECK-NEXT: loop0: |
27 ; CHECK-NEXT: LoopNestDepth = 1 | 27 ; CHECK-NEXT: LoopNestDepth = 1 |
28 ; CHECK-NEXT: loop1: | 28 ; CHECK-NEXT: loop1: |
29 ; CHECK-NEXT: LoopNestDepth = 1 | 29 ; CHECK-NEXT: LoopNestDepth = 1 |
30 ; CHECK-NEXT: out: | 30 ; CHECK-NEXT: out: |
31 ; CHECK-NEXT: LoopNestDepth = 0 | 31 ; CHECK-NEXT: LoopNestDepth = 0 |
32 ; CHECK-LABEL: Before RMW | 32 ; CHECK-LABEL: Before RMW |
33 | 33 |
34 define internal void @test_single_loop_with_continue(i32 %a32, i32 %b32) { | 34 define internal void @test_single_loop_with_continue(i32 %a32, i32 %b32) { |
35 entry: | 35 entry: |
36 %a = trunc i32 %a32 to i1 | 36 %a = trunc i32 %a32 to i1 |
37 %b = trunc i32 %b32 to i1 | 37 %b = trunc i32 %b32 to i1 |
38 br label %loop0 | 38 br label %loop0 |
39 | 39 |
40 loop0: ; <-+ | 40 loop0: ; <-+ |
41 br label %loop1 ; | | 41 br label %loop1 ; | |
42 loop1: ; | | 42 loop1: ; | |
43 br i1 %a, label %loop0, label %loop2 ; --+ | 43 br i1 %a, label %loop0, label %loop2 ; --+ |
44 loop2: ; | | 44 loop2: ; | |
45 br i1 %b, label %loop0, label %out ; --+ | 45 br i1 %b, label %loop0, label %out ; --+ |
46 | 46 |
47 out: | 47 out: |
48 ret void | 48 ret void |
49 } | 49 } |
50 | 50 |
51 ; CHECK-LABEL: After loop nest depth analysis | 51 ; CHECK-LABEL: After loop analysis |
52 ; CHECK-NEXT: entry: | 52 ; CHECK-NEXT: entry: |
53 ; CHECK-NEXT: LoopNestDepth = 0 | 53 ; CHECK-NEXT: LoopNestDepth = 0 |
54 ; CHECK-NEXT: loop0: | 54 ; CHECK-NEXT: loop0: |
55 ; CHECK-NEXT: LoopNestDepth = 1 | 55 ; CHECK-NEXT: LoopNestDepth = 1 |
56 ; CHECK-NEXT: loop1: | 56 ; CHECK-NEXT: loop1: |
57 ; CHECK-NEXT: LoopNestDepth = 1 | 57 ; CHECK-NEXT: LoopNestDepth = 1 |
58 ; CHECK-NEXT: loop2: | 58 ; CHECK-NEXT: loop2: |
59 ; CHECK-NEXT: LoopNestDepth = 1 | 59 ; CHECK-NEXT: LoopNestDepth = 1 |
60 ; CHECK-NEXT: out: | 60 ; CHECK-NEXT: out: |
61 ; CHECK-NEXT: LoopNestDepth = 0 | 61 ; CHECK-NEXT: LoopNestDepth = 0 |
62 ; CHECK-LABEL: Before RMW | 62 ; CHECK-LABEL: Before RMW |
63 | 63 |
64 define internal void @test_multiple_exits(i32 %a32, i32 %b32) { | 64 define internal void @test_multiple_exits(i32 %a32, i32 %b32) { |
65 entry: | 65 entry: |
66 %a = trunc i32 %a32 to i1 | 66 %a = trunc i32 %a32 to i1 |
67 %b = trunc i32 %b32 to i1 | 67 %b = trunc i32 %b32 to i1 |
68 br label %loop0 | 68 br label %loop0 |
69 | 69 |
70 loop0: ; <-+ | 70 loop0: ; <-+ |
71 br label %loop1 ; | | 71 br label %loop1 ; | |
72 loop1: ; | | 72 loop1: ; | |
73 br i1 %a, label %loop2, label %out ; --+-+ | 73 br i1 %a, label %loop2, label %out ; --+-+ |
74 loop2: ; | | | 74 loop2: ; | | |
75 br i1 %b, label %loop0, label %out ; --+ | | 75 br i1 %b, label %loop0, label %out ; --+ | |
76 ; | | 76 ; | |
77 out: ; <---+ | 77 out: ; <---+ |
78 ret void | 78 ret void |
79 } | 79 } |
80 | 80 |
81 ; CHECK-LABEL: After loop nest depth analysis | 81 ; CHECK-LABEL: After loop analysis |
82 ; CHECK-NEXT: entry: | 82 ; CHECK-NEXT: entry: |
83 ; CHECK-NEXT: LoopNestDepth = 0 | 83 ; CHECK-NEXT: LoopNestDepth = 0 |
84 ; CHECK-NEXT: loop0: | 84 ; CHECK-NEXT: loop0: |
85 ; CHECK-NEXT: LoopNestDepth = 1 | 85 ; CHECK-NEXT: LoopNestDepth = 1 |
86 ; CHECK-NEXT: loop1: | 86 ; CHECK-NEXT: loop1: |
87 ; CHECK-NEXT: LoopNestDepth = 1 | 87 ; CHECK-NEXT: LoopNestDepth = 1 |
88 ; CHECK-NEXT: loop2: | 88 ; CHECK-NEXT: loop2: |
89 ; CHECK-NEXT: LoopNestDepth = 1 | 89 ; CHECK-NEXT: LoopNestDepth = 1 |
90 ; CHECK-NEXT: out: | 90 ; CHECK-NEXT: out: |
91 ; CHECK-NEXT: LoopNestDepth = 0 | 91 ; CHECK-NEXT: LoopNestDepth = 0 |
(...skipping 11 matching lines...) Expand all Loading... |
103 br label %loop1_1 ; | | | 103 br label %loop1_1 ; | | |
104 loop1_1: ; | | | 104 loop1_1: ; | | |
105 br i1 %a, label %loop1_0, label %loop0_1 ; --+ | | 105 br i1 %a, label %loop1_0, label %loop0_1 ; --+ | |
106 loop0_1: ; | | 106 loop0_1: ; | |
107 br i1 %b, label %loop0_0, label %out ; ----+ | 107 br i1 %b, label %loop0_0, label %out ; ----+ |
108 | 108 |
109 out: | 109 out: |
110 ret void | 110 ret void |
111 } | 111 } |
112 | 112 |
113 ; CHECK-LABEL: After loop nest depth analysis | 113 ; CHECK-LABEL: After loop analysis |
114 ; CHECK-NEXT: entry: | 114 ; CHECK-NEXT: entry: |
115 ; CHECK-NEXT: LoopNestDepth = 0 | 115 ; CHECK-NEXT: LoopNestDepth = 0 |
116 ; CHECK-NEXT: loop0_0: | 116 ; CHECK-NEXT: loop0_0: |
117 ; CHECK-NEXT: LoopNestDepth = 1 | 117 ; CHECK-NEXT: LoopNestDepth = 1 |
118 ; CHECK-NEXT: loop1_0: | 118 ; CHECK-NEXT: loop1_0: |
119 ; CHECK-NEXT: LoopNestDepth = 2 | 119 ; CHECK-NEXT: LoopNestDepth = 2 |
120 ; CHECK-NEXT: loop1_1: | 120 ; CHECK-NEXT: loop1_1: |
121 ; CHECK-NEXT: LoopNestDepth = 2 | 121 ; CHECK-NEXT: LoopNestDepth = 2 |
122 ; CHECK-NEXT: loop0_1: | 122 ; CHECK-NEXT: loop0_1: |
123 ; CHECK-NEXT: LoopNestDepth = 1 | 123 ; CHECK-NEXT: LoopNestDepth = 1 |
(...skipping 17 matching lines...) Expand all Loading... |
141 br i1 %a, label %loop1_0, label %loop1_2 ; --+ | | 141 br i1 %a, label %loop1_0, label %loop1_2 ; --+ | |
142 loop1_2: ; | | | 142 loop1_2: ; | | |
143 br i1 %a, label %loop1_0, label %loop0_1 ; --+ | | 143 br i1 %a, label %loop1_0, label %loop0_1 ; --+ | |
144 loop0_1: ; | | 144 loop0_1: ; | |
145 br i1 %b, label %loop0_0, label %out ; ----+ | 145 br i1 %b, label %loop0_0, label %out ; ----+ |
146 | 146 |
147 out: | 147 out: |
148 ret void | 148 ret void |
149 } | 149 } |
150 | 150 |
151 ; CHECK-LABEL: After loop nest depth analysis | 151 ; CHECK-LABEL: After loop analysis |
152 ; CHECK-NEXT: entry: | 152 ; CHECK-NEXT: entry: |
153 ; CHECK-NEXT: LoopNestDepth = 0 | 153 ; CHECK-NEXT: LoopNestDepth = 0 |
154 ; CHECK-NEXT: loop0_0: | 154 ; CHECK-NEXT: loop0_0: |
155 ; CHECK-NEXT: LoopNestDepth = 1 | 155 ; CHECK-NEXT: LoopNestDepth = 1 |
156 ; CHECK-NEXT: loop1_0: | 156 ; CHECK-NEXT: loop1_0: |
157 ; CHECK-NEXT: LoopNestDepth = 2 | 157 ; CHECK-NEXT: LoopNestDepth = 2 |
158 ; CHECK-NEXT: loop1_1: | 158 ; CHECK-NEXT: loop1_1: |
159 ; CHECK-NEXT: LoopNestDepth = 2 | 159 ; CHECK-NEXT: LoopNestDepth = 2 |
160 ; CHECK-NEXT: loop1_2: | 160 ; CHECK-NEXT: loop1_2: |
161 ; CHECK-NEXT: LoopNestDepth = 2 | 161 ; CHECK-NEXT: LoopNestDepth = 2 |
(...skipping 21 matching lines...) Expand all Loading... |
183 br label %loop2_1 ; | | | 183 br label %loop2_1 ; | | |
184 loop2_1: ; | | | 184 loop2_1: ; | | |
185 br i1 %a, label %loop2_0, label %loop0_2 ; --+ | | 185 br i1 %a, label %loop2_0, label %loop0_2 ; --+ | |
186 loop0_2: ; | | 186 loop0_2: ; | |
187 br i1 %b, label %loop0_0, label %out ; ----+ | 187 br i1 %b, label %loop0_0, label %out ; ----+ |
188 | 188 |
189 out: | 189 out: |
190 ret void | 190 ret void |
191 } | 191 } |
192 | 192 |
193 ; CHECK-LABEL: After loop nest depth analysis | 193 ; CHECK-LABEL: After loop analysis |
194 ; CHECK-NEXT: entry: | 194 ; CHECK-NEXT: entry: |
195 ; CHECK-NEXT: LoopNestDepth = 0 | 195 ; CHECK-NEXT: LoopNestDepth = 0 |
196 ; CHECK-NEXT: loop0_0: | 196 ; CHECK-NEXT: loop0_0: |
197 ; CHECK-NEXT: LoopNestDepth = 1 | 197 ; CHECK-NEXT: LoopNestDepth = 1 |
198 ; CHECK-NEXT: loop1_0: | 198 ; CHECK-NEXT: loop1_0: |
199 ; CHECK-NEXT: LoopNestDepth = 2 | 199 ; CHECK-NEXT: LoopNestDepth = 2 |
200 ; CHECK-NEXT: loop1_1: | 200 ; CHECK-NEXT: loop1_1: |
201 ; CHECK-NEXT: LoopNestDepth = 2 | 201 ; CHECK-NEXT: LoopNestDepth = 2 |
202 ; CHECK-NEXT: loop0_1: | 202 ; CHECK-NEXT: loop0_1: |
203 ; CHECK-NEXT: LoopNestDepth = 1 | 203 ; CHECK-NEXT: LoopNestDepth = 1 |
(...skipping 24 matching lines...) Expand all Loading... |
228 br i1 %a, label %loop2_0, label %loop1_1 ; --+ | | | 228 br i1 %a, label %loop2_0, label %loop1_1 ; --+ | | |
229 loop1_1: ; | | | 229 loop1_1: ; | | |
230 br i1 %b, label %loop1_0, label %loop0_1 ; ----+ | | 230 br i1 %b, label %loop1_0, label %loop0_1 ; ----+ | |
231 loop0_1: ; | | 231 loop0_1: ; | |
232 br i1 %c, label %loop0_0, label %out ; ------+ | 232 br i1 %c, label %loop0_0, label %out ; ------+ |
233 | 233 |
234 out: | 234 out: |
235 ret void | 235 ret void |
236 } | 236 } |
237 | 237 |
238 ; CHECK-LABEL: After loop nest depth analysis | 238 ; CHECK-LABEL: After loop analysis |
239 ; CHECK-NEXT: entry: | 239 ; CHECK-NEXT: entry: |
240 ; CHECK-NEXT: LoopNestDepth = 0 | 240 ; CHECK-NEXT: LoopNestDepth = 0 |
241 ; CHECK-NEXT: loop0_0: | 241 ; CHECK-NEXT: loop0_0: |
242 ; CHECK-NEXT: LoopNestDepth = 1 | 242 ; CHECK-NEXT: LoopNestDepth = 1 |
243 ; CHECK-NEXT: loop1_0: | 243 ; CHECK-NEXT: loop1_0: |
244 ; CHECK-NEXT: LoopNestDepth = 2 | 244 ; CHECK-NEXT: LoopNestDepth = 2 |
245 ; CHECK-NEXT: loop2_0: | 245 ; CHECK-NEXT: loop2_0: |
246 ; CHECK-NEXT: LoopNestDepth = 3 | 246 ; CHECK-NEXT: LoopNestDepth = 3 |
247 ; CHECK-NEXT: loop2_1: | 247 ; CHECK-NEXT: loop2_1: |
248 ; CHECK-NEXT: LoopNestDepth = 3 | 248 ; CHECK-NEXT: LoopNestDepth = 3 |
(...skipping 13 matching lines...) Expand all Loading... |
262 left: | 262 left: |
263 br label %out | 263 br label %out |
264 | 264 |
265 right: | 265 right: |
266 br label %out | 266 br label %out |
267 | 267 |
268 out: | 268 out: |
269 ret void | 269 ret void |
270 } | 270 } |
271 | 271 |
272 ; CHECK-LABEL: After loop nest depth analysis | 272 ; CHECK-LABEL: After loop analysis |
273 ; CHECK-NEXT: entry: | 273 ; CHECK-NEXT: entry: |
274 ; CHECK-NEXT: LoopNestDepth = 0 | 274 ; CHECK-NEXT: LoopNestDepth = 0 |
275 ; CHECK-NEXT: left: | 275 ; CHECK-NEXT: left: |
276 ; CHECK-NEXT: LoopNestDepth = 0 | 276 ; CHECK-NEXT: LoopNestDepth = 0 |
277 ; CHECK-NEXT: right: | 277 ; CHECK-NEXT: right: |
278 ; CHECK-NEXT: LoopNestDepth = 0 | 278 ; CHECK-NEXT: LoopNestDepth = 0 |
279 ; CHECK-NEXT: out: | 279 ; CHECK-NEXT: out: |
280 ; CHECK-NEXT: LoopNestDepth = 0 | 280 ; CHECK-NEXT: LoopNestDepth = 0 |
281 ; CHECK-LABEL: Before RMW | 281 ; CHECK-LABEL: Before RMW |
282 | 282 |
283 define internal void @test_single_block_loop(i32 %count) { | 283 define internal void @test_single_block_loop(i32 %count) { |
284 entry: | 284 entry: |
285 br label %body | 285 br label %body |
286 body: | 286 body: |
287 ; %i = phi i32 [ 0, %entry ], [ %inc, %body ] | 287 ; %i = phi i32 [ 0, %entry ], [ %inc, %body ] |
288 ; A normal loop would have a phi instruction like above for the induction | 288 ; A normal loop would have a phi instruction like above for the induction |
289 ; variable, but that may introduce new basic blocks due to phi edge splitting, | 289 ; variable, but that may introduce new basic blocks due to phi edge splitting, |
290 ; so we use an alternative definition for %i to make the test more clear. | 290 ; so we use an alternative definition for %i to make the test more clear. |
291 %i = add i32 %count, 1 | 291 %i = add i32 %count, 1 |
292 %inc = add i32 %i, 1 | 292 %inc = add i32 %i, 1 |
293 %cmp = icmp slt i32 %inc, %count | 293 %cmp = icmp slt i32 %inc, %count |
294 br i1 %cmp, label %body, label %exit | 294 br i1 %cmp, label %body, label %exit |
295 exit: | 295 exit: |
296 ret void | 296 ret void |
297 } | 297 } |
298 | 298 |
299 ; CHECK-LABEL: After loop nest depth analysis | 299 ; CHECK-LABEL: After loop analysis |
300 ; CHECK-NEXT: entry: | 300 ; CHECK-NEXT: entry: |
301 ; CHECK-NEXT: LoopNestDepth = 0 | 301 ; CHECK-NEXT: LoopNestDepth = 0 |
302 ; CHECK-NEXT: body: | 302 ; CHECK-NEXT: body: |
303 ; CHECK-NEXT: LoopNestDepth = 1 | 303 ; CHECK-NEXT: LoopNestDepth = 1 |
304 ; CHECK-NEXT: exit: | 304 ; CHECK-NEXT: exit: |
305 ; CHECK-NEXT: LoopNestDepth = 0 | 305 ; CHECK-NEXT: LoopNestDepth = 0 |
306 ; CHECK-LABEL: Before RMW | 306 ; CHECK-LABEL: Before RMW |
OLD | NEW |