1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2 3; RUN: llc -mtriple=aarch64-linux-gnu %s -o - -verify-machineinstrs \ 4; RUN: -start-before=aarch64-isel -stop-after=finalize-isel \ 5; RUN: -global-isel=0 -fast-isel=0 | FileCheck %s 6 7; This file was initially generated via: 8; $ opt -S -callbrprepare llvm/test/CodeGen/AArch64/callbr-prepare.ll -o \ 9; llvm/test/CodeGen/AArch64/callbr-asm-outputs-indirect-isel.ll 10 11; TODO: should we remove test cases that don't use landingpad intrinsic? 12; They're not interesting IMO. 13 14; Removed is the test case for x86 machine specific physreg constraints. 15 16define i32 @test0() { 17 ; CHECK-LABEL: name: test0 18 ; CHECK: bb.0.entry: 19 ; CHECK-NEXT: successors: %bb.2(0x80000000), %bb.1(0x00000000) 20 ; CHECK-NEXT: {{ $}} 21 ; CHECK-NEXT: INLINEASM_BR &"# $0", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %5, 13 /* imm */, %bb.1 22 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %5 23 ; CHECK-NEXT: B %bb.2 24 ; CHECK-NEXT: {{ $}} 25 ; CHECK-NEXT: bb.1.entry.indirect_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 26 ; CHECK-NEXT: successors: %bb.5(0x80000000) 27 ; CHECK-NEXT: {{ $}} 28 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %5 29 ; CHECK-NEXT: B %bb.5 30 ; CHECK-NEXT: {{ $}} 31 ; CHECK-NEXT: bb.2.direct: 32 ; CHECK-NEXT: successors: %bb.4(0x80000000), %bb.3(0x00000000) 33 ; CHECK-NEXT: {{ $}} 34 ; CHECK-NEXT: INLINEASM_BR &"# $0", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %7, 13 /* imm */, %bb.3 35 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY %7 36 ; CHECK-NEXT: B %bb.4 37 ; CHECK-NEXT: {{ $}} 38 ; CHECK-NEXT: bb.3.direct.indirect_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 39 ; CHECK-NEXT: successors: %bb.5(0x80000000) 40 ; CHECK-NEXT: {{ $}} 41 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr32all = COPY %7 42 ; CHECK-NEXT: B %bb.5 43 ; CHECK-NEXT: {{ $}} 44 ; CHECK-NEXT: bb.4.direct2: 45 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr32all = COPY $wzr 46 ; CHECK-NEXT: $w0 = COPY [[COPY4]] 47 ; CHECK-NEXT: RET_ReallyLR implicit $w0 48 ; CHECK-NEXT: {{ $}} 49 ; CHECK-NEXT: bb.5.indirect: 50 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY1]], %bb.1, [[COPY3]], %bb.3 51 ; CHECK-NEXT: $w0 = COPY [[PHI]] 52 ; CHECK-NEXT: RET_ReallyLR implicit $w0 53entry: 54 %out = callbr i32 asm "# $0", "=r,!i"() 55 to label %direct [label %entry.indirect_crit_edge] 56 57entry.indirect_crit_edge: ; preds = %entry 58 %0 = call i32 @llvm.callbr.landingpad.i32(i32 %out) 59 br label %indirect 60 61direct: ; preds = %entry 62 %out2 = callbr i32 asm "# $0", "=r,!i"() 63 to label %direct2 [label %direct.indirect_crit_edge] 64 65direct.indirect_crit_edge: ; preds = %direct 66 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %out2) 67 br label %indirect 68 69direct2: ; preds = %direct 70 ret i32 0 71 72indirect: ; preds = %direct.indirect_crit_edge, %entry.indirect_crit_edge 73 %out3 = phi i32 [ %0, %entry.indirect_crit_edge ], [ %1, %direct.indirect_crit_edge ] 74 ret i32 %out3 75} 76 77define i32 @dont_split0() { 78 ; CHECK-LABEL: name: dont_split0 79 ; CHECK: bb.0.entry: 80 ; CHECK-NEXT: successors: %bb.1(0x80000000), %bb.2(0x00000000) 81 ; CHECK-NEXT: {{ $}} 82 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, 13 /* imm */, %bb.2 83 ; CHECK-NEXT: B %bb.1 84 ; CHECK-NEXT: {{ $}} 85 ; CHECK-NEXT: bb.1.x: 86 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42 87 ; CHECK-NEXT: $w0 = COPY [[MOVi32imm]] 88 ; CHECK-NEXT: RET_ReallyLR implicit $w0 89 ; CHECK-NEXT: {{ $}} 90 ; CHECK-NEXT: bb.2.y (machine-block-address-taken, inlineasm-br-indirect-target): 91 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY $wzr 92 ; CHECK-NEXT: $w0 = COPY [[COPY]] 93 ; CHECK-NEXT: RET_ReallyLR implicit $w0 94entry: 95 callbr void asm "", "!i"() 96 to label %x [label %y] 97 98x: ; preds = %entry 99 ret i32 42 100 101y: ; preds = %entry 102 ret i32 0 103} 104 105define i32 @dont_split1() { 106 ; CHECK-LABEL: name: dont_split1 107 ; CHECK: bb.0.entry: 108 ; CHECK-NEXT: successors: %bb.1(0x80000000), %bb.2(0x00000000) 109 ; CHECK-NEXT: {{ $}} 110 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %1, 13 /* imm */, %bb.2 111 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %1 112 ; CHECK-NEXT: B %bb.1 113 ; CHECK-NEXT: {{ $}} 114 ; CHECK-NEXT: bb.1.x: 115 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42 116 ; CHECK-NEXT: $w0 = COPY [[MOVi32imm]] 117 ; CHECK-NEXT: RET_ReallyLR implicit $w0 118 ; CHECK-NEXT: {{ $}} 119 ; CHECK-NEXT: bb.2.y (machine-block-address-taken, inlineasm-br-indirect-target): 120 ; CHECK-NEXT: $w0 = COPY %1 121 ; CHECK-NEXT: RET_ReallyLR implicit $w0 122entry: 123 %0 = callbr i32 asm "", "=r,!i"() 124 to label %x [label %y] 125 126x: ; preds = %entry 127 ret i32 42 128 129y: ; preds = %entry 130 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 131 ret i32 %1 132} 133 134define i32 @dont_split2() { 135 ; CHECK-LABEL: name: dont_split2 136 ; CHECK: bb.0.entry: 137 ; CHECK-NEXT: successors: %bb.1(0x80000000), %bb.2(0x00000000) 138 ; CHECK-NEXT: {{ $}} 139 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42 140 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY [[MOVi32imm]] 141 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, 13 /* imm */, %bb.2 142 ; CHECK-NEXT: B %bb.1 143 ; CHECK-NEXT: {{ $}} 144 ; CHECK-NEXT: bb.1.x: 145 ; CHECK-NEXT: successors: %bb.2(0x80000000) 146 ; CHECK-NEXT: {{ $}} 147 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY $wzr 148 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY [[COPY1]] 149 ; CHECK-NEXT: {{ $}} 150 ; CHECK-NEXT: bb.2.y (machine-block-address-taken, inlineasm-br-indirect-target): 151 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY]], %bb.0, [[COPY2]], %bb.1 152 ; CHECK-NEXT: $w0 = COPY [[PHI]] 153 ; CHECK-NEXT: RET_ReallyLR implicit $w0 154entry: 155 callbr void asm "", "!i"() 156 to label %x [label %y] 157 158x: ; preds = %entry 159 br label %y 160 161y: ; preds = %x, %entry 162 %0 = phi i32 [ 0, %x ], [ 42, %entry ] 163 ret i32 %0 164} 165 166define i32 @dont_split3() { 167 ; CHECK-LABEL: name: dont_split3 168 ; CHECK: bb.0.entry: 169 ; CHECK-NEXT: successors: %bb.1(0x80000000), %bb.2(0x00000000) 170 ; CHECK-NEXT: {{ $}} 171 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %0, 13 /* imm */, %bb.2 172 ; CHECK-NEXT: B %bb.1 173 ; CHECK-NEXT: {{ $}} 174 ; CHECK-NEXT: bb.1.x: 175 ; CHECK-NEXT: successors: %bb.2(0x80000000) 176 ; CHECK-NEXT: {{ $}} 177 ; CHECK-NEXT: bb.2.v (machine-block-address-taken, inlineasm-br-indirect-target): 178 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42 179 ; CHECK-NEXT: $w0 = COPY [[MOVi32imm]] 180 ; CHECK-NEXT: RET_ReallyLR implicit $w0 181entry: 182 %0 = callbr i32 asm "", "=r,!i"() 183 to label %x [label %v] 184 185x: ; preds = %entry 186 br label %v 187 188v: ; preds = %x, %entry 189 ret i32 42 190} 191 192define i32 @split_me0() { 193 ; CHECK-LABEL: name: split_me0 194 ; CHECK: bb.0.entry: 195 ; CHECK-NEXT: successors: %bb.2(0x80000000), %bb.1(0x00000000) 196 ; CHECK-NEXT: {{ $}} 197 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %3, 13 /* imm */, %bb.1 198 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %3 199 ; CHECK-NEXT: B %bb.2 200 ; CHECK-NEXT: {{ $}} 201 ; CHECK-NEXT: bb.1.entry.y_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 202 ; CHECK-NEXT: successors: %bb.3(0x80000000) 203 ; CHECK-NEXT: {{ $}} 204 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %3 205 ; CHECK-NEXT: B %bb.3 206 ; CHECK-NEXT: {{ $}} 207 ; CHECK-NEXT: bb.2.x: 208 ; CHECK-NEXT: successors: %bb.3(0x80000000) 209 ; CHECK-NEXT: {{ $}} 210 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42 211 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY [[MOVi32imm]] 212 ; CHECK-NEXT: {{ $}} 213 ; CHECK-NEXT: bb.3.y: 214 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY1]], %bb.1, [[COPY2]], %bb.2 215 ; CHECK-NEXT: $w0 = COPY [[PHI]] 216 ; CHECK-NEXT: RET_ReallyLR implicit $w0 217entry: 218 %0 = callbr i32 asm "", "=r,!i"() 219 to label %x [label %entry.y_crit_edge] 220 221entry.y_crit_edge: ; preds = %entry 222 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 223 br label %y 224 225x: ; preds = %entry 226 br label %y 227 228y: ; preds = %entry.y_crit_edge, %x 229 %2 = phi i32 [ %1, %entry.y_crit_edge ], [ 42, %x ] 230 ret i32 %2 231} 232 233define i32 @split_me1(i1 %z) { 234 ; CHECK-LABEL: name: split_me1 235 ; CHECK: bb.0.entry: 236 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000) 237 ; CHECK-NEXT: liveins: $w0 238 ; CHECK-NEXT: {{ $}} 239 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 240 ; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr32all = IMPLICIT_DEF 241 ; CHECK-NEXT: TBZW [[COPY]], 0, %bb.4 242 ; CHECK-NEXT: B %bb.1 243 ; CHECK-NEXT: {{ $}} 244 ; CHECK-NEXT: bb.1.w: 245 ; CHECK-NEXT: successors: %bb.3(0x80000000), %bb.2(0x00000000) 246 ; CHECK-NEXT: {{ $}} 247 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %5, 13 /* imm */, %bb.2, 13 /* imm */, %bb.2 248 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %5 249 ; CHECK-NEXT: B %bb.3 250 ; CHECK-NEXT: {{ $}} 251 ; CHECK-NEXT: bb.2.w.v_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 252 ; CHECK-NEXT: successors: %bb.4(0x80000000) 253 ; CHECK-NEXT: {{ $}} 254 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY %5 255 ; CHECK-NEXT: B %bb.4 256 ; CHECK-NEXT: {{ $}} 257 ; CHECK-NEXT: bb.3.x: 258 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42 259 ; CHECK-NEXT: $w0 = COPY [[MOVi32imm]] 260 ; CHECK-NEXT: RET_ReallyLR implicit $w0 261 ; CHECK-NEXT: {{ $}} 262 ; CHECK-NEXT: bb.4.v: 263 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[DEF]], %bb.0, [[COPY2]], %bb.2 264 ; CHECK-NEXT: $w0 = COPY [[PHI]] 265 ; CHECK-NEXT: RET_ReallyLR implicit $w0 266entry: 267 br i1 %z, label %w, label %v 268 269w: ; preds = %entry 270 %0 = callbr i32 asm "", "=r,!i,!i"() 271 to label %x [label %w.v_crit_edge, label %w.v_crit_edge] 272 273w.v_crit_edge: ; preds = %w, %w 274 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 275 br label %v 276 277x: ; preds = %w 278 ret i32 42 279 280v: ; preds = %w.v_crit_edge, %entry 281 %2 = phi i32 [ %1, %w.v_crit_edge ], [ undef, %entry ] 282 ret i32 %2 283} 284 285define i32 @split_me2(i1 %z) { 286 ; CHECK-LABEL: name: split_me2 287 ; CHECK: bb.0.entry: 288 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000) 289 ; CHECK-NEXT: liveins: $w0 290 ; CHECK-NEXT: {{ $}} 291 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 292 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42 293 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY [[MOVi32imm]] 294 ; CHECK-NEXT: TBZW [[COPY]], 0, %bb.4 295 ; CHECK-NEXT: B %bb.1 296 ; CHECK-NEXT: {{ $}} 297 ; CHECK-NEXT: bb.1.w: 298 ; CHECK-NEXT: successors: %bb.3(0x80000000), %bb.2(0x00000000) 299 ; CHECK-NEXT: {{ $}} 300 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %6, 13 /* imm */, %bb.2, 13 /* imm */, %bb.2 301 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY %6 302 ; CHECK-NEXT: B %bb.3 303 ; CHECK-NEXT: {{ $}} 304 ; CHECK-NEXT: bb.2.w.v_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 305 ; CHECK-NEXT: successors: %bb.4(0x80000000) 306 ; CHECK-NEXT: {{ $}} 307 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr32all = COPY %6 308 ; CHECK-NEXT: B %bb.4 309 ; CHECK-NEXT: {{ $}} 310 ; CHECK-NEXT: bb.3.x: 311 ; CHECK-NEXT: [[MOVi32imm1:%[0-9]+]]:gpr32 = MOVi32imm 42 312 ; CHECK-NEXT: $w0 = COPY [[MOVi32imm1]] 313 ; CHECK-NEXT: RET_ReallyLR implicit $w0 314 ; CHECK-NEXT: {{ $}} 315 ; CHECK-NEXT: bb.4.v: 316 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY1]], %bb.0, [[COPY3]], %bb.2 317 ; CHECK-NEXT: $w0 = COPY [[PHI]] 318 ; CHECK-NEXT: RET_ReallyLR implicit $w0 319entry: 320 br i1 %z, label %w, label %v 321 322w: ; preds = %entry 323 %0 = callbr i32 asm "", "=r,!i,!i"() 324 to label %x [label %w.v_crit_edge, label %w.v_crit_edge] 325 326w.v_crit_edge: ; preds = %w, %w 327 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 328 br label %v 329 330x: ; preds = %w 331 ret i32 42 332 333v: ; preds = %w.v_crit_edge, %entry 334 %2 = phi i32 [ %1, %w.v_crit_edge ], [ 42, %entry ] 335 ret i32 %2 336} 337 338define i32 @dont_split4() { 339 ; CHECK-LABEL: name: dont_split4 340 ; CHECK: bb.0.entry: 341 ; CHECK-NEXT: successors: %bb.1(0x80000000), %bb.2(0x00000000) 342 ; CHECK-NEXT: {{ $}} 343 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %3, 13 /* imm */, %bb.2 344 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %3 345 ; CHECK-NEXT: B %bb.1 346 ; CHECK-NEXT: {{ $}} 347 ; CHECK-NEXT: bb.1.x: 348 ; CHECK-NEXT: successors: %bb.3(0x80000000) 349 ; CHECK-NEXT: {{ $}} 350 ; CHECK-NEXT: B %bb.3 351 ; CHECK-NEXT: {{ $}} 352 ; CHECK-NEXT: bb.2.y (machine-block-address-taken, inlineasm-br-indirect-target): 353 ; CHECK-NEXT: successors: %bb.3(0x80000000) 354 ; CHECK-NEXT: {{ $}} 355 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %3 356 ; CHECK-NEXT: {{ $}} 357 ; CHECK-NEXT: bb.3.out: 358 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY1]], %bb.2, [[COPY]], %bb.1 359 ; CHECK-NEXT: $w0 = COPY [[PHI]] 360 ; CHECK-NEXT: RET_ReallyLR implicit $w0 361entry: 362 %0 = callbr i32 asm "", "=r,!i"() 363 to label %x [label %y] 364 365x: ; preds = %entry 366 br label %out 367 368y: ; preds = %entry 369 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 370 br label %out 371 372out: ; preds = %y, %x 373 %2 = phi i32 [ %1, %y ], [ %0, %x ] 374 ret i32 %2 375} 376 377define i32 @dont_split5() { 378 ; CHECK-LABEL: name: dont_split5 379 ; CHECK: bb.0.entry: 380 ; CHECK-NEXT: successors: %bb.2(0x80000000), %bb.1(0x00000000) 381 ; CHECK-NEXT: {{ $}} 382 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %3, 13 /* imm */, %bb.1 383 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %3 384 ; CHECK-NEXT: B %bb.2 385 ; CHECK-NEXT: {{ $}} 386 ; CHECK-NEXT: bb.1.y (machine-block-address-taken, inlineasm-br-indirect-target): 387 ; CHECK-NEXT: successors: %bb.2(0x80000000) 388 ; CHECK-NEXT: {{ $}} 389 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %3 390 ; CHECK-NEXT: {{ $}} 391 ; CHECK-NEXT: bb.2.out: 392 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY]], %bb.0, [[COPY1]], %bb.1 393 ; CHECK-NEXT: $w0 = COPY [[PHI]] 394 ; CHECK-NEXT: RET_ReallyLR implicit $w0 395entry: 396 %0 = callbr i32 asm "", "=r,!i"() 397 to label %out [label %y] 398 399y: ; preds = %entry 400 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 401 br label %out 402 403out: ; preds = %y, %entry 404 %2 = phi i32 [ %1, %y ], [ %0, %entry ] 405 ret i32 %2 406} 407 408define i32 @split_me3() { 409 ; CHECK-LABEL: name: split_me3 410 ; CHECK: bb.0.entry: 411 ; CHECK-NEXT: successors: %bb.2(0x80000000), %bb.1(0x00000000) 412 ; CHECK-NEXT: {{ $}} 413 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %3, 13 /* imm */, %bb.1 414 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %3 415 ; CHECK-NEXT: B %bb.2 416 ; CHECK-NEXT: {{ $}} 417 ; CHECK-NEXT: bb.1.entry.out_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 418 ; CHECK-NEXT: successors: %bb.3(0x80000000) 419 ; CHECK-NEXT: {{ $}} 420 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %3 421 ; CHECK-NEXT: B %bb.3 422 ; CHECK-NEXT: {{ $}} 423 ; CHECK-NEXT: bb.2.y: 424 ; CHECK-NEXT: successors: %bb.3(0x80000000) 425 ; CHECK-NEXT: {{ $}} 426 ; CHECK-NEXT: bb.3.out: 427 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY1]], %bb.1, [[COPY]], %bb.2 428 ; CHECK-NEXT: $w0 = COPY [[PHI]] 429 ; CHECK-NEXT: RET_ReallyLR implicit $w0 430entry: 431 %0 = callbr i32 asm "", "=r,!i"() 432 to label %y [label %entry.out_crit_edge] 433 434entry.out_crit_edge: ; preds = %entry 435 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 436 br label %out 437 438y: ; preds = %entry 439 br label %out 440 441out: ; preds = %entry.out_crit_edge, %y 442 %2 = phi i32 [ %1, %entry.out_crit_edge ], [ %0, %y ] 443 ret i32 %2 444} 445 446define i32 @dont_split6(i32 %0) { 447 ; CHECK-LABEL: name: dont_split6 448 ; CHECK: bb.0.entry: 449 ; CHECK-NEXT: successors: %bb.1(0x80000000) 450 ; CHECK-NEXT: liveins: $w0 451 ; CHECK-NEXT: {{ $}} 452 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 453 ; CHECK-NEXT: {{ $}} 454 ; CHECK-NEXT: bb.1.loop: 455 ; CHECK-NEXT: successors: %bb.3(0x80000000), %bb.2(0x00000000) 456 ; CHECK-NEXT: {{ $}} 457 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY]], %bb.0, %2, %bb.2 458 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32common = COPY [[PHI]] 459 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %4, 2147483657 /* reguse tiedto:$0 */, [[COPY1]](tied-def 3), 13 /* imm */, %bb.2 460 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY %4 461 ; CHECK-NEXT: B %bb.3 462 ; CHECK-NEXT: {{ $}} 463 ; CHECK-NEXT: bb.2.loop.loop_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 464 ; CHECK-NEXT: successors: %bb.1(0x80000000) 465 ; CHECK-NEXT: {{ $}} 466 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr32all = COPY %4 467 ; CHECK-NEXT: B %bb.1 468 ; CHECK-NEXT: {{ $}} 469 ; CHECK-NEXT: bb.3.exit: 470 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr32all = COPY $wzr 471 ; CHECK-NEXT: $w0 = COPY [[COPY4]] 472 ; CHECK-NEXT: RET_ReallyLR implicit $w0 473entry: 474 br label %loop 475 476loop: ; preds = %loop.loop_crit_edge, %entry 477 %1 = phi i32 [ %0, %entry ], [ %3, %loop.loop_crit_edge ] 478 %2 = callbr i32 asm "", "=r,0,!i"(i32 %1) 479 to label %exit [label %loop.loop_crit_edge] 480 481loop.loop_crit_edge: ; preds = %loop 482 %3 = call i32 @llvm.callbr.landingpad.i32(i32 %2) 483 br label %loop 484 485exit: ; preds = %loop 486 ret i32 0 487} 488 489define i32 @split_me4() { 490 ; CHECK-LABEL: name: split_me4 491 ; CHECK: bb.0.entry: 492 ; CHECK-NEXT: successors: %bb.2(0x80000000), %bb.1(0x00000000) 493 ; CHECK-NEXT: {{ $}} 494 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %3, 13 /* imm */, %bb.1 495 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %3 496 ; CHECK-NEXT: B %bb.2 497 ; CHECK-NEXT: {{ $}} 498 ; CHECK-NEXT: bb.1.entry.same_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 499 ; CHECK-NEXT: successors: %bb.2(0x80000000) 500 ; CHECK-NEXT: {{ $}} 501 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %3 502 ; CHECK-NEXT: {{ $}} 503 ; CHECK-NEXT: bb.2.same: 504 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY]], %bb.0, [[COPY1]], %bb.1 505 ; CHECK-NEXT: $w0 = COPY [[PHI]] 506 ; CHECK-NEXT: RET_ReallyLR implicit $w0 507entry: 508 %0 = callbr i32 asm "", "=r,!i"() 509 to label %same [label %entry.same_crit_edge] 510 511entry.same_crit_edge: ; preds = %entry 512 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 513 br label %same 514 515same: ; preds = %entry.same_crit_edge, %entry 516 %2 = phi i32 [ %1, %entry.same_crit_edge ], [ %0, %entry ] 517 ret i32 %2 518} 519 520define i32 @split_me5() { 521 ; CHECK-LABEL: name: split_me5 522 ; CHECK: bb.0.entry: 523 ; CHECK-NEXT: successors: %bb.2(0x80000000), %bb.1(0x00000000) 524 ; CHECK-NEXT: {{ $}} 525 ; CHECK-NEXT: INLINEASM_BR &"", 0 /* attdialect */, {{[0-9]+}} /* regdef:GPR32common */, def %3, 13 /* imm */, %bb.1 526 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %3 527 ; CHECK-NEXT: B %bb.2 528 ; CHECK-NEXT: {{ $}} 529 ; CHECK-NEXT: bb.1.entry.same_crit_edge (machine-block-address-taken, inlineasm-br-indirect-target): 530 ; CHECK-NEXT: successors: %bb.2(0x80000000) 531 ; CHECK-NEXT: {{ $}} 532 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32all = COPY %3 533 ; CHECK-NEXT: {{ $}} 534 ; CHECK-NEXT: bb.2.same: 535 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY]], %bb.0, [[COPY1]], %bb.1 536 ; CHECK-NEXT: $w0 = COPY [[PHI]] 537 ; CHECK-NEXT: RET_ReallyLR implicit $w0 538entry: 539 %0 = callbr i32 asm "", "=r,!i"() 540 to label %same [label %entry.same_crit_edge] 541 542entry.same_crit_edge: ; preds = %entry 543 %1 = call i32 @llvm.callbr.landingpad.i32(i32 %0) 544 br label %same 545 546same: ; preds = %entry.same_crit_edge, %entry 547 %2 = phi i32 [ %1, %entry.same_crit_edge ], [ %0, %entry ] 548 ret i32 %2 549} 550 551; Function Attrs: nounwind 552declare i32 @llvm.callbr.landingpad.i32(i32) #0 553 554; Function Attrs: nounwind 555declare i64 @llvm.callbr.landingpad.i64(i64) #0 556 557attributes #0 = { nounwind } 558