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