1 ; RUN: opt < %s -basicaa -licm -S | FileCheck %s 2 ; RUN: opt < %s -debugify -basicaa -licm -S | FileCheck %s -check-prefix=DEBUGIFY 3 4 declare i32 @strlen(i8*) readonly nounwind 5 6 declare void @foo() 7 8 ; Sink readonly function. 9 define i32 @test1(i8* %P) { 10 br label %Loop 11 12 Loop: ; preds = %Loop, %0 13 %A = call i32 @strlen( i8* %P ) readonly 14 br i1 false, label %Loop, label %Out 15 16 Out: ; preds = %Loop 17 ret i32 %A 18 ; CHECK-LABEL: @test1( 19 ; CHECK: Out: 20 ; CHECK-NEXT: call i32 @strlen 21 ; CHECK-NEXT: ret i32 %A 22 } 23 24 declare double @sin(double) readnone nounwind 25 26 ; Sink readnone function out of loop with unknown memory behavior. 27 define double @test2(double %X) { 28 br label %Loop 29 30 Loop: ; preds = %Loop, %0 31 call void @foo( ) 32 %A = call double @sin( double %X ) readnone 33 br i1 true, label %Loop, label %Out 34 35 Out: ; preds = %Loop 36 ret double %A 37 ; CHECK-LABEL: @test2( 38 ; CHECK: Out: 39 ; CHECK-NEXT: call double @sin 40 ; CHECK-NEXT: ret double %A 41 } 42 43 ; This testcase checks to make sure the sinker does not cause problems with 44 ; critical edges. 45 define void @test3() { 46 Entry: 47 br i1 false, label %Loop, label %Exit 48 Loop: 49 %X = add i32 0, 1 50 br i1 false, label %Loop, label %Exit 51 Exit: 52 %Y = phi i32 [ 0, %Entry ], [ %X, %Loop ] 53 ret void 54 55 ; CHECK-LABEL: @test3( 56 ; CHECK: Exit.loopexit: 57 ; CHECK-NEXT: %X.le = add i32 0, 1 58 ; CHECK-NEXT: br label %Exit 59 60 } 61 62 ; If the result of an instruction is only used outside of the loop, sink 63 ; the instruction to the exit blocks instead of executing it on every 64 ; iteration of the loop. 65 ; 66 define i32 @test4(i32 %N) { 67 Entry: 68 br label %Loop 69 Loop: ; preds = %Loop, %Entry 70 %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] 71 %tmp.6 = mul i32 %N, %N_addr.0.pn ; <i32> [#uses=1] 72 %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=1] 73 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 74 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1] 75 br i1 %tmp.1, label %Loop, label %Out 76 Out: ; preds = %Loop 77 ret i32 %tmp.7 78 ; CHECK-LABEL: @test4( 79 ; CHECK: Out: 80 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 81 ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 82 ; CHECK-NEXT: sub i32 %tmp.6.le, %N 83 ; CHECK-NEXT: ret i32 84 } 85 86 ; To reduce register pressure, if a load is hoistable out of the loop, and the 87 ; result of the load is only used outside of the loop, sink the load instead of 88 ; hoisting it! 89 ; 90 @X = global i32 5 ; <i32*> [#uses=1] 91 92 define i32 @test5(i32 %N) { 93 Entry: 94 br label %Loop 95 Loop: ; preds = %Loop, %Entry 96 %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] 97 %tmp.6 = load i32, i32* @X ; <i32> [#uses=1] 98 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 99 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1] 100 br i1 %tmp.1, label %Loop, label %Out 101 Out: ; preds = %Loop 102 ret i32 %tmp.6 103 ; CHECK-LABEL: @test5( 104 ; CHECK: Out: 105 ; CHECK-NEXT: %tmp.6.le = load i32, i32* @X 106 ; CHECK-NEXT: ret i32 %tmp.6.le 107 } 108 109 110 111 ; The loop sinker was running from the bottom of the loop to the top, causing 112 ; it to miss opportunities to sink instructions that depended on sinking other 113 ; instructions from the loop. Instead they got hoisted, which is better than 114 ; leaving them in the loop, but increases register pressure pointlessly. 115 116 %Ty = type { i32, i32 } 117 @X2 = external global %Ty 118 119 define i32 @test6() { 120 br label %Loop 121 Loop: 122 %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 123 %sunk2 = load i32, i32* %dead 124 br i1 false, label %Loop, label %Out 125 Out: ; preds = %Loop 126 ret i32 %sunk2 127 ; CHECK-LABEL: @test6( 128 ; CHECK: Out: 129 ; CHECK-NEXT: %dead.le = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 130 ; CHECK-NEXT: %sunk2.le = load i32, i32* %dead.le 131 ; CHECK-NEXT: ret i32 %sunk2.le 132 } 133 134 135 136 ; This testcase ensures that we can sink instructions from loops with 137 ; multiple exits. 138 ; 139 define i32 @test7(i32 %N, i1 %C) { 140 Entry: 141 br label %Loop 142 Loop: ; preds = %ContLoop, %Entry 143 %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ] 144 %tmp.6 = mul i32 %N, %N_addr.0.pn 145 %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=2] 146 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 147 br i1 %C, label %ContLoop, label %Out1 148 ContLoop: 149 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 150 br i1 %tmp.1, label %Loop, label %Out2 151 Out1: ; preds = %Loop 152 ret i32 %tmp.7 153 Out2: ; preds = %ContLoop 154 ret i32 %tmp.7 155 ; CHECK-LABEL: @test7( 156 ; CHECK: Out1: 157 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 158 ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 159 ; CHECK-NEXT: sub i32 %tmp.6.le, %N 160 ; CHECK-NEXT: ret 161 ; CHECK: Out2: 162 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 163 ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 164 ; CHECK-NEXT: sub i32 %tmp.6.le4, %N 165 ; CHECK-NEXT: ret 166 } 167 168 169 ; This testcase checks to make sure we can sink values which are only live on 170 ; some exits out of the loop, and that we can do so without breaking dominator 171 ; info. 172 define i32 @test8(i1 %C1, i1 %C2, i32* %P, i32* %Q) { 173 Entry: 174 br label %Loop 175 Loop: ; preds = %Cont, %Entry 176 br i1 %C1, label %Cont, label %exit1 177 Cont: ; preds = %Loop 178 %X = load i32, i32* %P ; <i32> [#uses=2] 179 store i32 %X, i32* %Q 180 %V = add i32 %X, 1 ; <i32> [#uses=1] 181 br i1 %C2, label %Loop, label %exit2 182 exit1: ; preds = %Loop 183 ret i32 0 184 exit2: ; preds = %Cont 185 ret i32 %V 186 ; CHECK-LABEL: @test8( 187 ; CHECK: exit1: 188 ; CHECK-NEXT: ret i32 0 189 ; CHECK: exit2: 190 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %X 191 ; CHECK-NEXT: %V.le = add i32 %[[LCSSAPHI]], 1 192 ; CHECK-NEXT: ret i32 %V.le 193 } 194 195 196 define void @test9() { 197 loopentry.2.i: 198 br i1 false, label %no_exit.1.i.preheader, label %loopentry.3.i.preheader 199 no_exit.1.i.preheader: ; preds = %loopentry.2.i 200 br label %no_exit.1.i 201 no_exit.1.i: ; preds = %endif.8.i, %no_exit.1.i.preheader 202 br i1 false, label %return.i, label %endif.8.i 203 endif.8.i: ; preds = %no_exit.1.i 204 %inc.1.i = add i32 0, 1 ; <i32> [#uses=1] 205 br i1 false, label %no_exit.1.i, label %loopentry.3.i.preheader.loopexit 206 loopentry.3.i.preheader.loopexit: ; preds = %endif.8.i 207 br label %loopentry.3.i.preheader 208 loopentry.3.i.preheader: ; preds = %loopentry.3.i.preheader.loopexit, %loopentry.2.i 209 %arg_num.0.i.ph13000 = phi i32 [ 0, %loopentry.2.i ], [ %inc.1.i, %loopentry.3.i.preheader.loopexit ] ; <i32> [#uses=0] 210 ret void 211 return.i: ; preds = %no_exit.1.i 212 ret void 213 214 ; CHECK-LABEL: @test9( 215 ; CHECK: loopentry.3.i.preheader.loopexit: 216 ; CHECK-NEXT: %inc.1.i.le = add i32 0, 1 217 ; CHECK-NEXT: br label %loopentry.3.i.preheader 218 } 219 220 221 ; Potentially trapping instructions may be sunk as long as they are guaranteed 222 ; to be executed. 223 define i32 @test10(i32 %N) { 224 Entry: 225 br label %Loop 226 Loop: ; preds = %Loop, %Entry 227 %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] ; <i32> [#uses=3] 228 %tmp.6 = sdiv i32 %N, %N_addr.0.pn ; <i32> [#uses=1] 229 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 230 %tmp.1 = icmp ne i32 %N_addr.0.pn, 0 ; <i1> [#uses=1] 231 br i1 %tmp.1, label %Loop, label %Out 232 Out: ; preds = %Loop 233 ret i32 %tmp.6 234 235 ; CHECK-LABEL: @test10( 236 ; CHECK: Out: 237 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 238 ; CHECK-NEXT: %tmp.6.le = sdiv i32 %N, %[[LCSSAPHI]] 239 ; CHECK-NEXT: ret i32 %tmp.6.le 240 } 241 242 ; Should delete, not sink, dead instructions. 243 define void @test11() { 244 br label %Loop 245 Loop: 246 %dead1 = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 247 %dead2 = getelementptr %Ty, %Ty* @X2, i64 0, i32 1 248 br i1 false, label %Loop, label %Out 249 Out: 250 ret void 251 ; CHECK-LABEL: @test11( 252 ; CHECK: Out: 253 ; CHECK-NEXT: ret void 254 255 ; The GEP in dead1 is adding a zero offset, so the DIExpression can be kept as 256 ; a "register location". 257 ; The GEP in dead2 is adding a 4 bytes to the pointer, so the DIExpression is 258 ; turned into an "implicit location" using DW_OP_stack_value. 259 ; 260 ; DEBUGIFY-LABEL: @test11( 261 ; DEBUGIFY: call void @llvm.dbg.value(metadata %Ty* @X2, metadata {{.*}}, metadata !DIExpression()) 262 ; DEBUGIFY: call void @llvm.dbg.value(metadata %Ty* @X2, metadata {{.*}}, metadata !DIExpression(DW_OP_plus_uconst, 4, DW_OP_stack_value)) 263 } 264 265 @c = common global [1 x i32] zeroinitializer, align 4 266 267 ; Test a *many* way nested loop with multiple exit blocks both of which exit 268 ; multiple loop nests. This exercises LCSSA corner cases. 269 define i32 @PR18753(i1* %a, i1* %b, i1* %c, i1* %d) { 270 entry: 271 br label %l1.header 272 273 l1.header: 274 %iv = phi i64 [ %iv.next, %l1.latch ], [ 0, %entry ] 275 %arrayidx.i = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 %iv 276 br label %l2.header 277 278 l2.header: 279 %x0 = load i1, i1* %c, align 4 280 br i1 %x0, label %l1.latch, label %l3.preheader 281 282 l3.preheader: 283 br label %l3.header 284 285 l3.header: 286 %x1 = load i1, i1* %d, align 4 287 br i1 %x1, label %l2.latch, label %l4.preheader 288 289 l4.preheader: 290 br label %l4.header 291 292 l4.header: 293 %x2 = load i1, i1* %a 294 br i1 %x2, label %l3.latch, label %l4.body 295 296 l4.body: 297 call void @f(i32* %arrayidx.i) 298 %x3 = load i1, i1* %b 299 %l = trunc i64 %iv to i32 300 br i1 %x3, label %l4.latch, label %exit 301 302 l4.latch: 303 call void @g() 304 %x4 = load i1, i1* %b, align 4 305 br i1 %x4, label %l4.header, label %exit 306 307 l3.latch: 308 br label %l3.header 309 310 l2.latch: 311 br label %l2.header 312 313 l1.latch: 314 %iv.next = add nsw i64 %iv, 1 315 br label %l1.header 316 317 exit: 318 %lcssa = phi i32 [ %l, %l4.latch ], [ %l, %l4.body ] 319 ; CHECK-LABEL: @PR18753( 320 ; CHECK: exit: 321 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i64 [ %iv, %l4.latch ], [ %iv, %l4.body ] 322 ; CHECK-NEXT: %l.le = trunc i64 %[[LCSSAPHI]] to i32 323 ; CHECK-NEXT: ret i32 %l.le 324 325 ret i32 %lcssa 326 } 327 328 ; Can't sink stores out of exit blocks containing indirectbr instructions 329 ; because loop simplify does not create dedicated exits for such blocks. Test 330 ; that by sinking the store from lab21 to lab22, but not further. 331 define void @test12() { 332 ; CHECK-LABEL: @test12 333 br label %lab4 334 335 lab4: 336 br label %lab20 337 338 lab5: 339 br label %lab20 340 341 lab6: 342 br label %lab4 343 344 lab7: 345 br i1 undef, label %lab8, label %lab13 346 347 lab8: 348 br i1 undef, label %lab13, label %lab10 349 350 lab10: 351 br label %lab7 352 353 lab13: 354 ret void 355 356 lab20: 357 br label %lab21 358 359 lab21: 360 ; CHECK: lab21: 361 ; CHECK-NOT: store 362 ; CHECK: br i1 false, label %lab21, label %lab22 363 store i32 36127957, i32* undef, align 4 364 br i1 undef, label %lab21, label %lab22 365 366 lab22: 367 ; CHECK: lab22: 368 ; CHECK: store 369 ; CHECK-NEXT: indirectbr i8* undef 370 indirectbr i8* undef, [label %lab5, label %lab6, label %lab7] 371 } 372 373 ; Test that we don't crash when trying to sink stores and there's no preheader 374 ; available (which is used for creating loads that may be used by the SSA 375 ; updater) 376 define void @test13() { 377 ; CHECK-LABEL: @test13 378 br label %lab59 379 380 lab19: 381 br i1 undef, label %lab20, label %lab38 382 383 lab20: 384 br label %lab60 385 386 lab21: 387 br i1 undef, label %lab22, label %lab38 388 389 lab22: 390 br label %lab38 391 392 lab38: 393 ret void 394 395 lab59: 396 indirectbr i8* undef, [label %lab60, label %lab38] 397 398 lab60: 399 ; CHECK: lab60: 400 ; CHECK: store 401 ; CHECK-NEXT: indirectbr 402 store i32 2145244101, i32* undef, align 4 403 indirectbr i8* undef, [label %lab21, label %lab19] 404 } 405 406 ; Check if LICM can sink a sinkable instruction the exit blocks through 407 ; a non-trivially replacable PHI node. 408 ; 409 ; CHECK-LABEL: @test14 410 ; CHECK-LABEL: Loop: 411 ; CHECK-NOT: mul 412 ; CHECK-NOT: sub 413 ; 414 ; CHECK-LABEL: Out12.split.loop.exit: 415 ; CHECK: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn, %ContLoop ] 416 ; CHECK: %[[MUL:.*]] = mul i32 %N, %[[LCSSAPHI]] 417 ; CHECK: br label %Out12 418 ; 419 ; CHECK-LABEL: Out12.split.loop.exit1: 420 ; CHECK: %[[LCSSAPHI2:.*]] = phi i32 [ %N_addr.0.pn, %Loop ] 421 ; CHECK: %[[MUL2:.*]] = mul i32 %N, %[[LCSSAPHI2]] 422 ; CHECK: %[[SUB:.*]] = sub i32 %[[MUL2]], %N 423 ; CHECK: br label %Out12 424 ; 425 ; CHECK-LABEL: Out12: 426 ; CHECK: phi i32 [ %[[MUL]], %Out12.split.loop.exit ], [ %[[SUB]], %Out12.split.loop.exit1 ] 427 define i32 @test14(i32 %N, i32 %N2, i1 %C) { 428 Entry: 429 br label %Loop 430 Loop: 431 %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ] 432 %sink.mul = mul i32 %N, %N_addr.0.pn 433 %sink.sub = sub i32 %sink.mul, %N 434 %dec = add i32 %N_addr.0.pn, -1 435 br i1 %C, label %ContLoop, label %Out12 436 ContLoop: 437 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 438 br i1 %tmp.1, label %Loop, label %Out12 439 Out12: 440 %tmp = phi i32 [%sink.mul, %ContLoop], [%sink.sub, %Loop] 441 ret i32 %tmp 442 } 443 444 ; In this test, splitting predecessors is not really required because the 445 ; operations of sinkable instructions (sub and mul) are same. In this case, we 446 ; can sink the same sinkable operations and modify the PHI to pass the operands 447 ; to the shared operations. As of now, we split predecessors of non-trivially 448 ; replicalbe PHIs by default in LICM because all incoming edges of a 449 ; non-trivially replacable PHI in LCSSA is critical. 450 ; 451 ; CHECK-LABEL: @test15 452 ; CHECK-LABEL: Loop: 453 ; CHECK-NOT: mul 454 ; CHECK-NOT: sub 455 ; 456 ; CHECK-LABEL: Out12.split.loop.exit: 457 ; CHECK: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn, %ContLoop ] 458 ; CHECK: %[[MUL:.*]] = mul i32 %N, %[[LCSSAPHI]] 459 ; CHECK: %[[SUB:.*]] = sub i32 %[[MUL]], %N2 460 ; CHECK: br label %Out12 461 ; 462 ; CHECK-LABEL: Out12.split.loop.exit1: 463 ; CHECK: %[[LCSSAPHI2:.*]] = phi i32 [ %N_addr.0.pn, %Loop ] 464 ; CHECK: %[[MUL2:.*]] = mul i32 %N, %[[LCSSAPHI2]] 465 ; CHECK: %[[SUB2:.*]] = sub i32 %[[MUL2]], %N 466 ; CHECK: br label %Out12 467 ; 468 ; CHECK-LABEL: Out12: 469 ; CHECK: phi i32 [ %[[SUB]], %Out12.split.loop.exit ], [ %[[SUB2]], %Out12.split.loop.exit1 ] 470 define i32 @test15(i32 %N, i32 %N2, i1 %C) { 471 Entry: 472 br label %Loop 473 Loop: 474 %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ] 475 %sink.mul = mul i32 %N, %N_addr.0.pn 476 %sink.sub = sub i32 %sink.mul, %N 477 %sink.sub2 = sub i32 %sink.mul, %N2 478 %dec = add i32 %N_addr.0.pn, -1 479 br i1 %C, label %ContLoop, label %Out12 480 ContLoop: 481 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 482 br i1 %tmp.1, label %Loop, label %Out12 483 Out12: 484 %tmp = phi i32 [%sink.sub2, %ContLoop], [%sink.sub, %Loop] 485 ret i32 %tmp 486 } 487 488 ; Sink through a non-trivially replacable PHI node which use the same sinkable 489 ; instruction multiple times. 490 ; 491 ; CHECK-LABEL: @test16 492 ; CHECK-LABEL: Loop: 493 ; CHECK-NOT: mul 494 ; 495 ; CHECK-LABEL: Out.split.loop.exit: 496 ; CHECK: %[[PHI:.*]] = phi i32 [ %l2, %ContLoop ] 497 ; CHECK: br label %Out 498 ; 499 ; CHECK-LABEL: Out.split.loop.exit1: 500 ; CHECK: %[[SINKABLE:.*]] = mul i32 %l2.lcssa, %t.le 501 ; CHECK: br label %Out 502 ; 503 ; CHECK-LABEL: Out: 504 ; CHECK: %idx = phi i32 [ %[[PHI]], %Out.split.loop.exit ], [ %[[SINKABLE]], %Out.split.loop.exit1 ] 505 define i32 @test16(i1 %c, i8** %P, i32* %P2, i64 %V) { 506 entry: 507 br label %loop.ph 508 loop.ph: 509 br label %Loop 510 Loop: 511 %iv = phi i64 [ 0, %loop.ph ], [ %next, %ContLoop ] 512 %l2 = call i32 @getv() 513 %t = trunc i64 %iv to i32 514 %sinkable = mul i32 %l2, %t 515 switch i32 %l2, label %ContLoop [ 516 i32 32, label %Out 517 i32 46, label %Out 518 i32 95, label %Out 519 ] 520 ContLoop: 521 %next = add nuw i64 %iv, 1 522 %c1 = call i1 @getc() 523 br i1 %c1, label %Loop, label %Out 524 Out: 525 %idx = phi i32 [ %l2, %ContLoop ], [ %sinkable, %Loop ], [ %sinkable, %Loop ], [ %sinkable, %Loop ] 526 ret i32 %idx 527 } 528 529 ; Sink a sinkable instruction through multiple non-trivially replacable PHIs in 530 ; differect exit blocks. 531 ; 532 ; CHECK-LABEL: @test17 533 ; CHECK-LABEL: Loop: 534 ; CHECK-NOT: mul 535 ; 536 ; CHECK-LABEL:OutA.split.loop.exit{{.*}}: 537 ; CHECK: %[[OP1:.*]] = phi i32 [ %N_addr.0.pn, %ContLoop1 ] 538 ; CHECK: %[[SINKABLE:.*]] = mul i32 %N, %[[OP1]] 539 ; CHECK: br label %OutA 540 ; 541 ; CHECK-LABEL:OutA: 542 ; CHECK: phi i32{{.*}}[ %[[SINKABLE]], %OutA.split.loop.exit{{.*}} ] 543 ; 544 ; CHECK-LABEL:OutB.split.loop.exit{{.*}}: 545 ; CHECK: %[[OP2:.*]] = phi i32 [ %N_addr.0.pn, %ContLoop2 ] 546 ; CHECK: %[[SINKABLE2:.*]] = mul i32 %N, %[[OP2]] 547 ; CHECK: br label %OutB 548 ; 549 ; CHECK-LABEL:OutB: 550 ; CHECK: phi i32 {{.*}}[ %[[SINKABLE2]], %OutB.split.loop.exit{{.*}} ] 551 define i32 @test17(i32 %N, i32 %N2) { 552 Entry: 553 br label %Loop 554 Loop: 555 %N_addr.0.pn = phi i32 [ %dec, %ContLoop3 ], [ %N, %Entry ] 556 %sink.mul = mul i32 %N, %N_addr.0.pn 557 %c0 = call i1 @getc() 558 br i1 %c0 , label %ContLoop1, label %OutA 559 ContLoop1: 560 %c1 = call i1 @getc() 561 br i1 %c1, label %ContLoop2, label %OutA 562 563 ContLoop2: 564 %c2 = call i1 @getc() 565 br i1 %c2, label %ContLoop3, label %OutB 566 ContLoop3: 567 %c3 = call i1 @getc() 568 %dec = add i32 %N_addr.0.pn, -1 569 br i1 %c3, label %Loop, label %OutB 570 OutA: 571 %tmp1 = phi i32 [%sink.mul, %ContLoop1], [%N2, %Loop] 572 br label %Out12 573 OutB: 574 %tmp2 = phi i32 [%sink.mul, %ContLoop2], [%dec, %ContLoop3] 575 br label %Out12 576 Out12: 577 %tmp = phi i32 [%tmp1, %OutA], [%tmp2, %OutB] 578 ret i32 %tmp 579 } 580 581 582 ; Sink a sinkable instruction through both trivially and non-trivially replacable PHIs. 583 ; 584 ; CHECK-LABEL: @test18 585 ; CHECK-LABEL: Loop: 586 ; CHECK-NOT: mul 587 ; CHECK-NOT: sub 588 ; 589 ; CHECK-LABEL:Out12.split.loop.exit: 590 ; CHECK: %[[OP:.*]] = phi i32 [ %iv, %ContLoop ] 591 ; CHECK: %[[DEC:.*]] = phi i32 [ %dec, %ContLoop ] 592 ; CHECK: %[[SINKMUL:.*]] = mul i32 %N, %[[OP]] 593 ; CHECK: %[[SINKSUB:.*]] = sub i32 %[[SINKMUL]], %N2 594 ; CHECK: br label %Out12 595 ; 596 ; CHECK-LABEL:Out12.split.loop.exit1: 597 ; CHECK: %[[OP2:.*]] = phi i32 [ %iv, %Loop ] 598 ; CHECK: %[[SINKMUL2:.*]] = mul i32 %N, %[[OP2]] 599 ; CHECK: %[[SINKSUB2:.*]] = sub i32 %[[SINKMUL2]], %N2 600 ; CHECK: br label %Out12 601 ; 602 ; CHECK-LABEL:Out12: 603 ; CHECK: %tmp1 = phi i32 [ %[[SINKSUB]], %Out12.split.loop.exit ], [ %[[SINKSUB2]], %Out12.split.loop.exit1 ] 604 ; CHECK: %tmp2 = phi i32 [ %[[DEC]], %Out12.split.loop.exit ], [ %[[SINKSUB2]], %Out12.split.loop.exit1 ] 605 ; CHECK: %add = add i32 %tmp1, %tmp2 606 define i32 @test18(i32 %N, i32 %N2) { 607 Entry: 608 br label %Loop 609 Loop: 610 %iv = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ] 611 %sink.mul = mul i32 %N, %iv 612 %sink.sub = sub i32 %sink.mul, %N2 613 %c0 = call i1 @getc() 614 br i1 %c0, label %ContLoop, label %Out12 615 ContLoop: 616 %dec = add i32 %iv, -1 617 %c1 = call i1 @getc() 618 br i1 %c1, label %Loop, label %Out12 619 Out12: 620 %tmp1 = phi i32 [%sink.sub, %ContLoop], [%sink.sub, %Loop] 621 %tmp2 = phi i32 [%dec, %ContLoop], [%sink.sub, %Loop] 622 %add = add i32 %tmp1, %tmp2 623 ret i32 %add 624 } 625 626 ; Do not sink an instruction through a non-trivially replacable PHI, to avoid 627 ; assert while splitting predecessors, if the terminator of predecessor is an 628 ; indirectbr. 629 ; CHECK-LABEL: @test19 630 ; CHECK-LABEL: L0: 631 ; CHECK: %sinkable = mul 632 ; CHECK: %sinkable2 = add 633 634 define i32 @test19(i1 %cond, i1 %cond2, i8* %address, i32 %v1) nounwind { 635 entry: 636 br label %L0 637 L0: 638 %indirect.goto.dest = select i1 %cond, i8* blockaddress(@test19, %exit), i8* %address 639 %v2 = call i32 @getv() 640 %sinkable = mul i32 %v1, %v2 641 %sinkable2 = add i32 %v1, %v2 642 indirectbr i8* %indirect.goto.dest, [label %L1, label %exit] 643 644 L1: 645 %indirect.goto.dest2 = select i1 %cond2, i8* blockaddress(@test19, %exit), i8* %address 646 indirectbr i8* %indirect.goto.dest2, [label %L0, label %exit] 647 648 exit: 649 %r = phi i32 [%sinkable, %L0], [%sinkable2, %L1] 650 ret i32 %r 651 } 652 653 654 ; Do not sink through a non-trivially replacable PHI if splitting predecessors 655 ; not allowed in SplitBlockPredecessors(). 656 ; 657 ; CHECK-LABEL: @test20 658 ; CHECK-LABEL: while.cond 659 ; CHECK: %sinkable = mul 660 ; CHECK: %sinkable2 = add 661 define void @test20(i32* %s, i1 %b, i32 %v1, i32 %v2) personality i32 (...)* @__CxxFrameHandler3 { 662 entry: 663 br label %while.cond 664 while.cond: 665 %v = call i32 @getv() 666 %sinkable = mul i32 %v, %v2 667 %sinkable2 = add i32 %v, %v2 668 br i1 %b, label %try.cont, label %while.body 669 while.body: 670 invoke void @may_throw() 671 to label %while.body2 unwind label %catch.dispatch 672 while.body2: 673 invoke void @may_throw2() 674 to label %while.cond unwind label %catch.dispatch 675 catch.dispatch: 676 %.lcssa1 = phi i32 [ %sinkable, %while.body ], [ %sinkable2, %while.body2 ] 677 %cp = cleanuppad within none [] 678 store i32 %.lcssa1, i32* %s 679 cleanupret from %cp unwind to caller 680 try.cont: 681 ret void 682 } 683 684 ; The sinkable call should be sunk into an exit block split. After splitting 685 ; the exit block, BlockColor for new blocks should be added properly so 686 ; that we should be able to access valid ColorVector. 687 ; 688 ; CHECK-LABEL:@test21_pr36184 689 ; CHECK-LABEL: Loop 690 ; CHECK-NOT: %sinkableCall 691 ; CHECK-LABEL:Out.split.loop.exit 692 ; CHECK: %sinkableCall 693 define i32 @test21_pr36184(i8* %P) personality i32 (...)* @__CxxFrameHandler3 { 694 entry: 695 br label %loop.ph 696 697 loop.ph: 698 br label %Loop 699 700 Loop: 701 %sinkableCall = call i32 @strlen( i8* %P ) readonly 702 br i1 undef, label %ContLoop, label %Out 703 704 ContLoop: 705 br i1 undef, label %Loop, label %Out 706 707 Out: 708 %idx = phi i32 [ %sinkableCall, %Loop ], [0, %ContLoop ] 709 ret i32 %idx 710 } 711 712 ; We do not support splitting a landingpad block if BlockColors is not empty. 713 ; CHECK-LABEL: @test22 714 ; CHECK-LABEL: while.body2 715 ; CHECK-LABEL: %mul 716 ; CHECK-NOT: lpadBB.split{{.*}} 717 define void @test22(i1 %b, i32 %v1, i32 %v2) personality i32 (...)* @__CxxFrameHandler3 { 718 entry: 719 br label %while.cond 720 while.cond: 721 br i1 %b, label %try.cont, label %while.body 722 723 while.body: 724 invoke void @may_throw() 725 to label %while.body2 unwind label %lpadBB 726 727 while.body2: 728 %v = call i32 @getv() 729 %mul = mul i32 %v, %v2 730 invoke void @may_throw2() 731 to label %while.cond unwind label %lpadBB 732 lpadBB: 733 %.lcssa1 = phi i32 [ 0, %while.body ], [ %mul, %while.body2 ] 734 landingpad { i8*, i32 } 735 catch i8* null 736 br label %lpadBBSucc1 737 738 lpadBBSucc1: 739 ret void 740 741 try.cont: 742 ret void 743 } 744 745 declare void @may_throw() 746 declare void @may_throw2() 747 declare i32 @__CxxFrameHandler3(...) 748 declare i32 @getv() 749 declare i1 @getc() 750 declare void @f(i32*) 751 declare void @g() 752