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: --threads=0 | FileCheck %s | 7 ; RUN: --threads=0 | FileCheck %s |
8 | 8 |
9 define 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 nest depth 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 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 nest depth 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 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 nest depth 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 |
92 ; CHECK-LABEL: Before RMW | 92 ; CHECK-LABEL: Before RMW |
93 | 93 |
94 define void @test_two_nested_loops(i32 %a32, i32 %b32) { | 94 define internal void @test_two_nested_loops(i32 %a32, i32 %b32) { |
95 entry: | 95 entry: |
96 %a = trunc i32 %a32 to i1 | 96 %a = trunc i32 %a32 to i1 |
97 %b = trunc i32 %b32 to i1 | 97 %b = trunc i32 %b32 to i1 |
98 br label %loop0_0 | 98 br label %loop0_0 |
99 | 99 |
100 loop0_0: ; <---+ | 100 loop0_0: ; <---+ |
101 br label %loop1_0 ; | | 101 br label %loop1_0 ; | |
102 loop1_0: ; <-+ | | 102 loop1_0: ; <-+ | |
103 br label %loop1_1 ; | | | 103 br label %loop1_1 ; | | |
104 loop1_1: ; | | | 104 loop1_1: ; | | |
(...skipping 13 matching lines...) Expand all Loading... |
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 |
124 ; CHECK-NEXT: out: | 124 ; CHECK-NEXT: out: |
125 ; CHECK-NEXT: LoopNestDepth = 0 | 125 ; CHECK-NEXT: LoopNestDepth = 0 |
126 ; CHECK-LABEL: Before RMW | 126 ; CHECK-LABEL: Before RMW |
127 | 127 |
128 define void @test_two_nested_loops_with_continue(i32 %a32, i32 %b32, i32 %c32) { | 128 define internal void @test_two_nested_loops_with_continue(i32 %a32, i32 %b32, |
| 129 i32 %c32) { |
129 entry: | 130 entry: |
130 %a = trunc i32 %a32 to i1 | 131 %a = trunc i32 %a32 to i1 |
131 %b = trunc i32 %b32 to i1 | 132 %b = trunc i32 %b32 to i1 |
132 %c = trunc i32 %c32 to i1 | 133 %c = trunc i32 %c32 to i1 |
133 br label %loop0_0 | 134 br label %loop0_0 |
134 | 135 |
135 loop0_0: ; <---+ | 136 loop0_0: ; <---+ |
136 br label %loop1_0 ; | | 137 br label %loop1_0 ; | |
137 loop1_0: ; <-+ | | 138 loop1_0: ; <-+ | |
138 br label %loop1_1 ; | | | 139 br label %loop1_1 ; | | |
(...skipping 18 matching lines...) Expand all Loading... |
157 ; CHECK-NEXT: loop1_1: | 158 ; CHECK-NEXT: loop1_1: |
158 ; CHECK-NEXT: LoopNestDepth = 2 | 159 ; CHECK-NEXT: LoopNestDepth = 2 |
159 ; CHECK-NEXT: loop1_2: | 160 ; CHECK-NEXT: loop1_2: |
160 ; CHECK-NEXT: LoopNestDepth = 2 | 161 ; CHECK-NEXT: LoopNestDepth = 2 |
161 ; CHECK-NEXT: loop0_1: | 162 ; CHECK-NEXT: loop0_1: |
162 ; CHECK-NEXT: LoopNestDepth = 1 | 163 ; CHECK-NEXT: LoopNestDepth = 1 |
163 ; CHECK-NEXT: out: | 164 ; CHECK-NEXT: out: |
164 ; CHECK-NEXT: LoopNestDepth = 0 | 165 ; CHECK-NEXT: LoopNestDepth = 0 |
165 ; CHECK-LABEL: Before RMW | 166 ; CHECK-LABEL: Before RMW |
166 | 167 |
167 define void @test_multiple_nested_loops(i32 %a32, i32 %b32) { | 168 define internal void @test_multiple_nested_loops(i32 %a32, i32 %b32) { |
168 entry: | 169 entry: |
169 %a = trunc i32 %a32 to i1 | 170 %a = trunc i32 %a32 to i1 |
170 %b = trunc i32 %b32 to i1 | 171 %b = trunc i32 %b32 to i1 |
171 br label %loop0_0 | 172 br label %loop0_0 |
172 | 173 |
173 loop0_0: ; <---+ | 174 loop0_0: ; <---+ |
174 br label %loop1_0 ; | | 175 br label %loop1_0 ; | |
175 loop1_0: ; <-+ | | 176 loop1_0: ; <-+ | |
176 br label %loop1_1 ; | | | 177 br label %loop1_1 ; | | |
177 loop1_1: ; | | | 178 loop1_1: ; | | |
(...skipping 25 matching lines...) Expand all Loading... |
203 ; CHECK-NEXT: loop2_0: | 204 ; CHECK-NEXT: loop2_0: |
204 ; CHECK-NEXT: LoopNestDepth = 2 | 205 ; CHECK-NEXT: LoopNestDepth = 2 |
205 ; CHECK-NEXT: loop2_1: | 206 ; CHECK-NEXT: loop2_1: |
206 ; CHECK-NEXT: LoopNestDepth = 2 | 207 ; CHECK-NEXT: LoopNestDepth = 2 |
207 ; CHECK-NEXT: loop0_2: | 208 ; CHECK-NEXT: loop0_2: |
208 ; CHECK-NEXT: LoopNestDepth = 1 | 209 ; CHECK-NEXT: LoopNestDepth = 1 |
209 ; CHECK-NEXT: out: | 210 ; CHECK-NEXT: out: |
210 ; CHECK-NEXT: LoopNestDepth = 0 | 211 ; CHECK-NEXT: LoopNestDepth = 0 |
211 ; CHECK-LABEL: Before RMW | 212 ; CHECK-LABEL: Before RMW |
212 | 213 |
213 define void @test_three_nested_loops(i32 %a32, i32 %b32, i32 %c32) { | 214 define internal void @test_three_nested_loops(i32 %a32, i32 %b32, i32 %c32) { |
214 entry: | 215 entry: |
215 %a = trunc i32 %a32 to i1 | 216 %a = trunc i32 %a32 to i1 |
216 %b = trunc i32 %b32 to i1 | 217 %b = trunc i32 %b32 to i1 |
217 %c = trunc i32 %c32 to i1 | 218 %c = trunc i32 %c32 to i1 |
218 br label %loop0_0 | 219 br label %loop0_0 |
219 | 220 |
220 loop0_0: ; <-----+ | 221 loop0_0: ; <-----+ |
221 br label %loop1_0 ; | | 222 br label %loop1_0 ; | |
222 loop1_0: ; <---+ | | 223 loop1_0: ; <---+ | |
223 br label %loop2_0 ; | | | 224 br label %loop2_0 ; | | |
(...skipping 22 matching lines...) Expand all Loading... |
246 ; CHECK-NEXT: loop2_1: | 247 ; CHECK-NEXT: loop2_1: |
247 ; CHECK-NEXT: LoopNestDepth = 3 | 248 ; CHECK-NEXT: LoopNestDepth = 3 |
248 ; CHECK-NEXT: loop1_1: | 249 ; CHECK-NEXT: loop1_1: |
249 ; CHECK-NEXT: LoopNestDepth = 2 | 250 ; CHECK-NEXT: LoopNestDepth = 2 |
250 ; CHECK-NEXT: loop0_1: | 251 ; CHECK-NEXT: loop0_1: |
251 ; CHECK-NEXT: LoopNestDepth = 1 | 252 ; CHECK-NEXT: LoopNestDepth = 1 |
252 ; CHECK-NEXT: out: | 253 ; CHECK-NEXT: out: |
253 ; CHECK-NEXT: LoopNestDepth = 0 | 254 ; CHECK-NEXT: LoopNestDepth = 0 |
254 ; CHECK-LABEL: Before RMW | 255 ; CHECK-LABEL: Before RMW |
255 | 256 |
256 define void @test_diamond(i32 %a32) { | 257 define internal void @test_diamond(i32 %a32) { |
257 entry: | 258 entry: |
258 %a = trunc i32 %a32 to i1 | 259 %a = trunc i32 %a32 to i1 |
259 br i1 %a, label %left, label %right | 260 br i1 %a, label %left, label %right |
260 | 261 |
261 left: | 262 left: |
262 br label %out | 263 br label %out |
263 | 264 |
264 right: | 265 right: |
265 br label %out | 266 br label %out |
266 | 267 |
267 out: | 268 out: |
268 ret void | 269 ret void |
269 } | 270 } |
270 | 271 |
271 ; CHECK-LABEL: After loop nest depth analysis | 272 ; CHECK-LABEL: After loop nest depth analysis |
272 ; CHECK-NEXT: entry: | 273 ; CHECK-NEXT: entry: |
273 ; CHECK-NEXT: LoopNestDepth = 0 | 274 ; CHECK-NEXT: LoopNestDepth = 0 |
274 ; CHECK-NEXT: left: | 275 ; CHECK-NEXT: left: |
275 ; CHECK-NEXT: LoopNestDepth = 0 | 276 ; CHECK-NEXT: LoopNestDepth = 0 |
276 ; CHECK-NEXT: right: | 277 ; CHECK-NEXT: right: |
277 ; CHECK-NEXT: LoopNestDepth = 0 | 278 ; CHECK-NEXT: LoopNestDepth = 0 |
278 ; CHECK-NEXT: out: | 279 ; CHECK-NEXT: out: |
279 ; CHECK-NEXT: LoopNestDepth = 0 | 280 ; CHECK-NEXT: LoopNestDepth = 0 |
280 ; CHECK-LABEL: Before RMW | 281 ; CHECK-LABEL: Before RMW |
OLD | NEW |