| 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 |