| OLD | NEW |
| (Empty) | |
| 1 ; Test the the loop nest depth is correctly calculated for basic blocks. |
| 2 |
| 3 ; REQUIRES: allow_dump |
| 4 |
| 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 \ |
| 7 ; RUN: --threads=0 | FileCheck %s |
| 8 |
| 9 define void @test_single_loop(i32 %a32) { |
| 10 entry: |
| 11 %a = trunc i32 %a32 to i1 |
| 12 br label %loop0 |
| 13 |
| 14 loop0: ; <-+ |
| 15 br label %loop1 ; | |
| 16 loop1: ; | |
| 17 br i1 %a, label %loop0, label %out ; --+ |
| 18 |
| 19 out: |
| 20 ret void |
| 21 } |
| 22 |
| 23 ; CHECK-LABEL: After loop nest depth analysis |
| 24 ; CHECK-NEXT: entry: |
| 25 ; CHECK-NEXT: LoopNestDepth = 0 |
| 26 ; CHECK-NEXT: loop0: |
| 27 ; CHECK-NEXT: LoopNestDepth = 1 |
| 28 ; CHECK-NEXT: loop1: |
| 29 ; CHECK-NEXT: LoopNestDepth = 1 |
| 30 ; CHECK-NEXT: out: |
| 31 ; CHECK-NEXT: LoopNestDepth = 0 |
| 32 ; CHECK-LABEL: Before RMW |
| 33 |
| 34 define void @test_single_loop_with_continue(i32 %a32, i32 %b32) { |
| 35 entry: |
| 36 %a = trunc i32 %a32 to i1 |
| 37 %b = trunc i32 %b32 to i1 |
| 38 br label %loop0 |
| 39 |
| 40 loop0: ; <-+ |
| 41 br label %loop1 ; | |
| 42 loop1: ; | |
| 43 br i1 %a, label %loop0, label %loop2 ; --+ |
| 44 loop2: ; | |
| 45 br i1 %b, label %loop0, label %out ; --+ |
| 46 |
| 47 out: |
| 48 ret void |
| 49 } |
| 50 |
| 51 ; CHECK-LABEL: After loop nest depth analysis |
| 52 ; CHECK-NEXT: entry: |
| 53 ; CHECK-NEXT: LoopNestDepth = 0 |
| 54 ; CHECK-NEXT: loop0: |
| 55 ; CHECK-NEXT: LoopNestDepth = 1 |
| 56 ; CHECK-NEXT: loop1: |
| 57 ; CHECK-NEXT: LoopNestDepth = 1 |
| 58 ; CHECK-NEXT: loop2: |
| 59 ; CHECK-NEXT: LoopNestDepth = 1 |
| 60 ; CHECK-NEXT: out: |
| 61 ; CHECK-NEXT: LoopNestDepth = 0 |
| 62 ; CHECK-LABEL: Before RMW |
| 63 |
| 64 define void @test_multiple_exits(i32 %a32, i32 %b32) { |
| 65 entry: |
| 66 %a = trunc i32 %a32 to i1 |
| 67 %b = trunc i32 %b32 to i1 |
| 68 br label %loop0 |
| 69 |
| 70 loop0: ; <-+ |
| 71 br label %loop1 ; | |
| 72 loop1: ; | |
| 73 br i1 %a, label %loop2, label %out ; --+-+ |
| 74 loop2: ; | | |
| 75 br i1 %b, label %loop0, label %out ; --+ | |
| 76 ; | |
| 77 out: ; <---+ |
| 78 ret void |
| 79 } |
| 80 |
| 81 ; CHECK-LABEL: After loop nest depth analysis |
| 82 ; CHECK-NEXT: entry: |
| 83 ; CHECK-NEXT: LoopNestDepth = 0 |
| 84 ; CHECK-NEXT: loop0: |
| 85 ; CHECK-NEXT: LoopNestDepth = 1 |
| 86 ; CHECK-NEXT: loop1: |
| 87 ; CHECK-NEXT: LoopNestDepth = 1 |
| 88 ; CHECK-NEXT: loop2: |
| 89 ; CHECK-NEXT: LoopNestDepth = 1 |
| 90 ; CHECK-NEXT: out: |
| 91 ; CHECK-NEXT: LoopNestDepth = 0 |
| 92 ; CHECK-LABEL: Before RMW |
| 93 |
| 94 define void @test_two_nested_loops(i32 %a32, i32 %b32) { |
| 95 entry: |
| 96 %a = trunc i32 %a32 to i1 |
| 97 %b = trunc i32 %b32 to i1 |
| 98 br label %loop0_0 |
| 99 |
| 100 loop0_0: ; <---+ |
| 101 br label %loop1_0 ; | |
| 102 loop1_0: ; <-+ | |
| 103 br label %loop1_1 ; | | |
| 104 loop1_1: ; | | |
| 105 br i1 %a, label %loop1_0, label %loop0_1 ; --+ | |
| 106 loop0_1: ; | |
| 107 br i1 %b, label %loop0_0, label %out ; ----+ |
| 108 |
| 109 out: |
| 110 ret void |
| 111 } |
| 112 |
| 113 ; CHECK-LABEL: After loop nest depth analysis |
| 114 ; CHECK-NEXT: entry: |
| 115 ; CHECK-NEXT: LoopNestDepth = 0 |
| 116 ; CHECK-NEXT: loop0_0: |
| 117 ; CHECK-NEXT: LoopNestDepth = 1 |
| 118 ; CHECK-NEXT: loop1_0: |
| 119 ; CHECK-NEXT: LoopNestDepth = 2 |
| 120 ; CHECK-NEXT: loop1_1: |
| 121 ; CHECK-NEXT: LoopNestDepth = 2 |
| 122 ; CHECK-NEXT: loop0_1: |
| 123 ; CHECK-NEXT: LoopNestDepth = 1 |
| 124 ; CHECK-NEXT: out: |
| 125 ; CHECK-NEXT: LoopNestDepth = 0 |
| 126 ; CHECK-LABEL: Before RMW |
| 127 |
| 128 define void @test_two_nested_loops_with_continue(i32 %a32, i32 %b32, i32 %c32) { |
| 129 entry: |
| 130 %a = trunc i32 %a32 to i1 |
| 131 %b = trunc i32 %b32 to i1 |
| 132 %c = trunc i32 %c32 to i1 |
| 133 br label %loop0_0 |
| 134 |
| 135 loop0_0: ; <---+ |
| 136 br label %loop1_0 ; | |
| 137 loop1_0: ; <-+ | |
| 138 br label %loop1_1 ; | | |
| 139 loop1_1: ; | | |
| 140 br i1 %a, label %loop1_0, label %loop1_2 ; --+ | |
| 141 loop1_2: ; | | |
| 142 br i1 %a, label %loop1_0, label %loop0_1 ; --+ | |
| 143 loop0_1: ; | |
| 144 br i1 %b, label %loop0_0, label %out ; ----+ |
| 145 |
| 146 out: |
| 147 ret void |
| 148 } |
| 149 |
| 150 ; CHECK-LABEL: After loop nest depth analysis |
| 151 ; CHECK-NEXT: entry: |
| 152 ; CHECK-NEXT: LoopNestDepth = 0 |
| 153 ; CHECK-NEXT: loop0_0: |
| 154 ; CHECK-NEXT: LoopNestDepth = 1 |
| 155 ; CHECK-NEXT: loop1_0: |
| 156 ; CHECK-NEXT: LoopNestDepth = 2 |
| 157 ; CHECK-NEXT: loop1_1: |
| 158 ; CHECK-NEXT: LoopNestDepth = 2 |
| 159 ; CHECK-NEXT: loop1_2: |
| 160 ; CHECK-NEXT: LoopNestDepth = 2 |
| 161 ; CHECK-NEXT: loop0_1: |
| 162 ; CHECK-NEXT: LoopNestDepth = 1 |
| 163 ; CHECK-NEXT: out: |
| 164 ; CHECK-NEXT: LoopNestDepth = 0 |
| 165 ; CHECK-LABEL: Before RMW |
| 166 |
| 167 define void @test_multiple_nested_loops(i32 %a32, i32 %b32) { |
| 168 entry: |
| 169 %a = trunc i32 %a32 to i1 |
| 170 %b = trunc i32 %b32 to i1 |
| 171 br label %loop0_0 |
| 172 |
| 173 loop0_0: ; <---+ |
| 174 br label %loop1_0 ; | |
| 175 loop1_0: ; <-+ | |
| 176 br label %loop1_1 ; | | |
| 177 loop1_1: ; | | |
| 178 br i1 %a, label %loop1_0, label %loop0_1 ; --+ | |
| 179 loop0_1: ; | |
| 180 br label %loop2_0 ; | |
| 181 loop2_0: ; <-+ | |
| 182 br label %loop2_1 ; | | |
| 183 loop2_1: ; | | |
| 184 br i1 %a, label %loop2_0, label %loop0_2 ; --+ | |
| 185 loop0_2: ; | |
| 186 br i1 %b, label %loop0_0, label %out ; ----+ |
| 187 |
| 188 out: |
| 189 ret void |
| 190 } |
| 191 |
| 192 ; CHECK-LABEL: After loop nest depth analysis |
| 193 ; CHECK-NEXT: entry: |
| 194 ; CHECK-NEXT: LoopNestDepth = 0 |
| 195 ; CHECK-NEXT: loop0_0: |
| 196 ; CHECK-NEXT: LoopNestDepth = 1 |
| 197 ; CHECK-NEXT: loop1_0: |
| 198 ; CHECK-NEXT: LoopNestDepth = 2 |
| 199 ; CHECK-NEXT: loop1_1: |
| 200 ; CHECK-NEXT: LoopNestDepth = 2 |
| 201 ; CHECK-NEXT: loop0_1: |
| 202 ; CHECK-NEXT: LoopNestDepth = 1 |
| 203 ; CHECK-NEXT: loop2_0: |
| 204 ; CHECK-NEXT: LoopNestDepth = 2 |
| 205 ; CHECK-NEXT: loop2_1: |
| 206 ; CHECK-NEXT: LoopNestDepth = 2 |
| 207 ; CHECK-NEXT: loop0_2: |
| 208 ; CHECK-NEXT: LoopNestDepth = 1 |
| 209 ; CHECK-NEXT: out: |
| 210 ; CHECK-NEXT: LoopNestDepth = 0 |
| 211 ; CHECK-LABEL: Before RMW |
| 212 |
| 213 define void @test_three_nested_loops(i32 %a32, i32 %b32, i32 %c32) { |
| 214 entry: |
| 215 %a = trunc i32 %a32 to i1 |
| 216 %b = trunc i32 %b32 to i1 |
| 217 %c = trunc i32 %c32 to i1 |
| 218 br label %loop0_0 |
| 219 |
| 220 loop0_0: ; <-----+ |
| 221 br label %loop1_0 ; | |
| 222 loop1_0: ; <---+ | |
| 223 br label %loop2_0 ; | | |
| 224 loop2_0: ; <-+ | | |
| 225 br label %loop2_1 ; | | | |
| 226 loop2_1: ; | | | |
| 227 br i1 %a, label %loop2_0, label %loop1_1 ; --+ | | |
| 228 loop1_1: ; | | |
| 229 br i1 %b, label %loop1_0, label %loop0_1 ; ----+ | |
| 230 loop0_1: ; | |
| 231 br i1 %c, label %loop0_0, label %out ; ------+ |
| 232 |
| 233 out: |
| 234 ret void |
| 235 } |
| 236 |
| 237 ; CHECK-LABEL: After loop nest depth analysis |
| 238 ; CHECK-NEXT: entry: |
| 239 ; CHECK-NEXT: LoopNestDepth = 0 |
| 240 ; CHECK-NEXT: loop0_0: |
| 241 ; CHECK-NEXT: LoopNestDepth = 1 |
| 242 ; CHECK-NEXT: loop1_0: |
| 243 ; CHECK-NEXT: LoopNestDepth = 2 |
| 244 ; CHECK-NEXT: loop2_0: |
| 245 ; CHECK-NEXT: LoopNestDepth = 3 |
| 246 ; CHECK-NEXT: loop2_1: |
| 247 ; CHECK-NEXT: LoopNestDepth = 3 |
| 248 ; CHECK-NEXT: loop1_1: |
| 249 ; CHECK-NEXT: LoopNestDepth = 2 |
| 250 ; CHECK-NEXT: loop0_1: |
| 251 ; CHECK-NEXT: LoopNestDepth = 1 |
| 252 ; CHECK-NEXT: out: |
| 253 ; CHECK-NEXT: LoopNestDepth = 0 |
| 254 ; CHECK-LABEL: Before RMW |
| 255 |
| 256 define void @test_diamond(i32 %a32) { |
| 257 entry: |
| 258 %a = trunc i32 %a32 to i1 |
| 259 br i1 %a, label %left, label %right |
| 260 |
| 261 left: |
| 262 br label %out |
| 263 |
| 264 right: |
| 265 br label %out |
| 266 |
| 267 out: |
| 268 ret void |
| 269 } |
| 270 |
| 271 ; CHECK-LABEL: After loop nest depth analysis |
| 272 ; CHECK-NEXT: entry: |
| 273 ; CHECK-NEXT: LoopNestDepth = 0 |
| 274 ; CHECK-NEXT: left: |
| 275 ; CHECK-NEXT: LoopNestDepth = 0 |
| 276 ; CHECK-NEXT: right: |
| 277 ; CHECK-NEXT: LoopNestDepth = 0 |
| 278 ; CHECK-NEXT: out: |
| 279 ; CHECK-NEXT: LoopNestDepth = 0 |
| 280 ; CHECK-LABEL: Before RMW |
| OLD | NEW |