1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -licm -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i32 @strlen(i8*) readonly nounwind 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @foo() 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Sink readonly function. 8*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i8* %P) { 9*9880d681SAndroid Build Coastguard Worker br label %Loop 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %0 12*9880d681SAndroid Build Coastguard Worker %A = call i32 @strlen( i8* %P ) readonly 13*9880d681SAndroid Build Coastguard Worker br i1 false, label %Loop, label %Out 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard WorkerOut: ; preds = %Loop 16*9880d681SAndroid Build Coastguard Worker ret i32 %A 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 18*9880d681SAndroid Build Coastguard Worker; CHECK: Out: 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i32 @strlen 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdeclare double @sin(double) readnone nounwind 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Sink readnone function out of loop with unknown memory behavior. 26*9880d681SAndroid Build Coastguard Workerdefine double @test2(double %X) { 27*9880d681SAndroid Build Coastguard Worker br label %Loop 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %0 30*9880d681SAndroid Build Coastguard Worker call void @foo( ) 31*9880d681SAndroid Build Coastguard Worker %A = call double @sin( double %X ) readnone 32*9880d681SAndroid Build Coastguard Worker br i1 true, label %Loop, label %Out 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard WorkerOut: ; preds = %Loop 35*9880d681SAndroid Build Coastguard Worker ret double %A 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 37*9880d681SAndroid Build Coastguard Worker; CHECK: Out: 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call double @sin 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %A 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; This testcase checks to make sure the sinker does not cause problems with 43*9880d681SAndroid Build Coastguard Worker; critical edges. 44*9880d681SAndroid Build Coastguard Workerdefine void @test3() { 45*9880d681SAndroid Build Coastguard WorkerEntry: 46*9880d681SAndroid Build Coastguard Worker br i1 false, label %Loop, label %Exit 47*9880d681SAndroid Build Coastguard WorkerLoop: 48*9880d681SAndroid Build Coastguard Worker %X = add i32 0, 1 49*9880d681SAndroid Build Coastguard Worker br i1 false, label %Loop, label %Exit 50*9880d681SAndroid Build Coastguard WorkerExit: 51*9880d681SAndroid Build Coastguard Worker %Y = phi i32 [ 0, %Entry ], [ %X, %Loop ] 52*9880d681SAndroid Build Coastguard Worker ret void 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 55*9880d681SAndroid Build Coastguard Worker; CHECK: Exit.loopexit: 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %X.le = add i32 0, 1 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %Exit 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; If the result of an instruction is only used outside of the loop, sink 62*9880d681SAndroid Build Coastguard Worker; the instruction to the exit blocks instead of executing it on every 63*9880d681SAndroid Build Coastguard Worker; iteration of the loop. 64*9880d681SAndroid Build Coastguard Worker; 65*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %N) { 66*9880d681SAndroid Build Coastguard WorkerEntry: 67*9880d681SAndroid Build Coastguard Worker br label %Loop 68*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %Entry 69*9880d681SAndroid Build Coastguard Worker %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] 70*9880d681SAndroid Build Coastguard Worker %tmp.6 = mul i32 %N, %N_addr.0.pn ; <i32> [#uses=1] 71*9880d681SAndroid Build Coastguard Worker %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=1] 72*9880d681SAndroid Build Coastguard Worker %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 73*9880d681SAndroid Build Coastguard Worker %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker br i1 %tmp.1, label %Loop, label %Out 75*9880d681SAndroid Build Coastguard WorkerOut: ; preds = %Loop 76*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.7 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 78*9880d681SAndroid Build Coastguard Worker; CHECK: Out: 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i32 %tmp.6.le, %N 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; To reduce register pressure, if a load is hoistable out of the loop, and the 86*9880d681SAndroid Build Coastguard Worker; result of the load is only used outside of the loop, sink the load instead of 87*9880d681SAndroid Build Coastguard Worker; hoisting it! 88*9880d681SAndroid Build Coastguard Worker; 89*9880d681SAndroid Build Coastguard Worker@X = global i32 5 ; <i32*> [#uses=1] 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %N) { 92*9880d681SAndroid Build Coastguard WorkerEntry: 93*9880d681SAndroid Build Coastguard Worker br label %Loop 94*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %Entry 95*9880d681SAndroid Build Coastguard Worker %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] 96*9880d681SAndroid Build Coastguard Worker %tmp.6 = load i32, i32* @X ; <i32> [#uses=1] 97*9880d681SAndroid Build Coastguard Worker %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 98*9880d681SAndroid Build Coastguard Worker %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1] 99*9880d681SAndroid Build Coastguard Worker br i1 %tmp.1, label %Loop, label %Out 100*9880d681SAndroid Build Coastguard WorkerOut: ; preds = %Loop 101*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.6 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 103*9880d681SAndroid Build Coastguard Worker; CHECK: Out: 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp.6.le = load i32, i32* @X 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %tmp.6.le 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; The loop sinker was running from the bottom of the loop to the top, causing 111*9880d681SAndroid Build Coastguard Worker; it to miss opportunities to sink instructions that depended on sinking other 112*9880d681SAndroid Build Coastguard Worker; instructions from the loop. Instead they got hoisted, which is better than 113*9880d681SAndroid Build Coastguard Worker; leaving them in the loop, but increases register pressure pointlessly. 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker %Ty = type { i32, i32 } 116*9880d681SAndroid Build Coastguard Worker@X2 = external global %Ty 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine i32 @test6() { 119*9880d681SAndroid Build Coastguard Worker br label %Loop 120*9880d681SAndroid Build Coastguard WorkerLoop: 121*9880d681SAndroid Build Coastguard Worker %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 122*9880d681SAndroid Build Coastguard Worker %sunk2 = load i32, i32* %dead 123*9880d681SAndroid Build Coastguard Worker br i1 false, label %Loop, label %Out 124*9880d681SAndroid Build Coastguard WorkerOut: ; preds = %Loop 125*9880d681SAndroid Build Coastguard Worker ret i32 %sunk2 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 127*9880d681SAndroid Build Coastguard Worker; CHECK: Out: 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %dead.le = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sunk2.le = load i32, i32* %dead.le 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %sunk2.le 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; This testcase ensures that we can sink instructions from loops with 136*9880d681SAndroid Build Coastguard Worker; multiple exits. 137*9880d681SAndroid Build Coastguard Worker; 138*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %N, i1 %C) { 139*9880d681SAndroid Build Coastguard WorkerEntry: 140*9880d681SAndroid Build Coastguard Worker br label %Loop 141*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %ContLoop, %Entry 142*9880d681SAndroid Build Coastguard Worker %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ] 143*9880d681SAndroid Build Coastguard Worker %tmp.6 = mul i32 %N, %N_addr.0.pn 144*9880d681SAndroid Build Coastguard Worker %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=2] 145*9880d681SAndroid Build Coastguard Worker %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 146*9880d681SAndroid Build Coastguard Worker br i1 %C, label %ContLoop, label %Out1 147*9880d681SAndroid Build Coastguard WorkerContLoop: 148*9880d681SAndroid Build Coastguard Worker %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 149*9880d681SAndroid Build Coastguard Worker br i1 %tmp.1, label %Loop, label %Out2 150*9880d681SAndroid Build Coastguard WorkerOut1: ; preds = %Loop 151*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.7 152*9880d681SAndroid Build Coastguard WorkerOut2: ; preds = %ContLoop 153*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.7 154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 155*9880d681SAndroid Build Coastguard Worker; CHECK: Out1: 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i32 %tmp.6.le, %N 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 160*9880d681SAndroid Build Coastguard Worker; CHECK: Out2: 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i32 %tmp.6.le4, %N 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; This testcase checks to make sure we can sink values which are only live on 169*9880d681SAndroid Build Coastguard Worker; some exits out of the loop, and that we can do so without breaking dominator 170*9880d681SAndroid Build Coastguard Worker; info. 171*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i1 %C1, i1 %C2, i32* %P, i32* %Q) { 172*9880d681SAndroid Build Coastguard WorkerEntry: 173*9880d681SAndroid Build Coastguard Worker br label %Loop 174*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Cont, %Entry 175*9880d681SAndroid Build Coastguard Worker br i1 %C1, label %Cont, label %exit1 176*9880d681SAndroid Build Coastguard WorkerCont: ; preds = %Loop 177*9880d681SAndroid Build Coastguard Worker %X = load i32, i32* %P ; <i32> [#uses=2] 178*9880d681SAndroid Build Coastguard Worker store i32 %X, i32* %Q 179*9880d681SAndroid Build Coastguard Worker %V = add i32 %X, 1 ; <i32> [#uses=1] 180*9880d681SAndroid Build Coastguard Worker br i1 %C2, label %Loop, label %exit2 181*9880d681SAndroid Build Coastguard Workerexit1: ; preds = %Loop 182*9880d681SAndroid Build Coastguard Worker ret i32 0 183*9880d681SAndroid Build Coastguard Workerexit2: ; preds = %Cont 184*9880d681SAndroid Build Coastguard Worker ret i32 %V 185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 186*9880d681SAndroid Build Coastguard Worker; CHECK: exit1: 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 188*9880d681SAndroid Build Coastguard Worker; CHECK: exit2: 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %X 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %V.le = add i32 %[[LCSSAPHI]], 1 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %V.le 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdefine void @test9() { 196*9880d681SAndroid Build Coastguard Workerloopentry.2.i: 197*9880d681SAndroid Build Coastguard Worker br i1 false, label %no_exit.1.i.preheader, label %loopentry.3.i.preheader 198*9880d681SAndroid Build Coastguard Workerno_exit.1.i.preheader: ; preds = %loopentry.2.i 199*9880d681SAndroid Build Coastguard Worker br label %no_exit.1.i 200*9880d681SAndroid Build Coastguard Workerno_exit.1.i: ; preds = %endif.8.i, %no_exit.1.i.preheader 201*9880d681SAndroid Build Coastguard Worker br i1 false, label %return.i, label %endif.8.i 202*9880d681SAndroid Build Coastguard Workerendif.8.i: ; preds = %no_exit.1.i 203*9880d681SAndroid Build Coastguard Worker %inc.1.i = add i32 0, 1 ; <i32> [#uses=1] 204*9880d681SAndroid Build Coastguard Worker br i1 false, label %no_exit.1.i, label %loopentry.3.i.preheader.loopexit 205*9880d681SAndroid Build Coastguard Workerloopentry.3.i.preheader.loopexit: ; preds = %endif.8.i 206*9880d681SAndroid Build Coastguard Worker br label %loopentry.3.i.preheader 207*9880d681SAndroid Build Coastguard Workerloopentry.3.i.preheader: ; preds = %loopentry.3.i.preheader.loopexit, %loopentry.2.i 208*9880d681SAndroid Build Coastguard Worker %arg_num.0.i.ph13000 = phi i32 [ 0, %loopentry.2.i ], [ %inc.1.i, %loopentry.3.i.preheader.loopexit ] ; <i32> [#uses=0] 209*9880d681SAndroid Build Coastguard Worker ret void 210*9880d681SAndroid Build Coastguard Workerreturn.i: ; preds = %no_exit.1.i 211*9880d681SAndroid Build Coastguard Worker ret void 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 214*9880d681SAndroid Build Coastguard Worker; CHECK: loopentry.3.i.preheader.loopexit: 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %inc.1.i.le = add i32 0, 1 216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %loopentry.3.i.preheader 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; Potentially trapping instructions may be sunk as long as they are guaranteed 221*9880d681SAndroid Build Coastguard Worker; to be executed. 222*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %N) { 223*9880d681SAndroid Build Coastguard WorkerEntry: 224*9880d681SAndroid Build Coastguard Worker br label %Loop 225*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %Entry 226*9880d681SAndroid Build Coastguard Worker %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] ; <i32> [#uses=3] 227*9880d681SAndroid Build Coastguard Worker %tmp.6 = sdiv i32 %N, %N_addr.0.pn ; <i32> [#uses=1] 228*9880d681SAndroid Build Coastguard Worker %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 229*9880d681SAndroid Build Coastguard Worker %tmp.1 = icmp ne i32 %N_addr.0.pn, 0 ; <i1> [#uses=1] 230*9880d681SAndroid Build Coastguard Worker br i1 %tmp.1, label %Loop, label %Out 231*9880d681SAndroid Build Coastguard WorkerOut: ; preds = %Loop 232*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.6 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 235*9880d681SAndroid Build Coastguard Worker; CHECK: Out: 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp.6.le = sdiv i32 %N, %[[LCSSAPHI]] 238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %tmp.6.le 239*9880d681SAndroid Build Coastguard Worker} 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker; Should delete, not sink, dead instructions. 242*9880d681SAndroid Build Coastguard Workerdefine void @test11() { 243*9880d681SAndroid Build Coastguard Worker br label %Loop 244*9880d681SAndroid Build Coastguard WorkerLoop: 245*9880d681SAndroid Build Coastguard Worker %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 246*9880d681SAndroid Build Coastguard Worker br i1 false, label %Loop, label %Out 247*9880d681SAndroid Build Coastguard WorkerOut: 248*9880d681SAndroid Build Coastguard Worker ret void 249*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 250*9880d681SAndroid Build Coastguard Worker; CHECK: Out: 251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker@c = common global [1 x i32] zeroinitializer, align 4 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker; Test a *many* way nested loop with multiple exit blocks both of which exit 257*9880d681SAndroid Build Coastguard Worker; multiple loop nests. This exercises LCSSA corner cases. 258*9880d681SAndroid Build Coastguard Workerdefine i32 @PR18753(i1* %a, i1* %b, i1* %c, i1* %d) { 259*9880d681SAndroid Build Coastguard Workerentry: 260*9880d681SAndroid Build Coastguard Worker br label %l1.header 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerl1.header: 263*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %l1.latch ], [ 0, %entry ] 264*9880d681SAndroid Build Coastguard Worker %arrayidx.i = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 %iv 265*9880d681SAndroid Build Coastguard Worker br label %l2.header 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Workerl2.header: 268*9880d681SAndroid Build Coastguard Worker %x0 = load i1, i1* %c, align 4 269*9880d681SAndroid Build Coastguard Worker br i1 %x0, label %l1.latch, label %l3.preheader 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workerl3.preheader: 272*9880d681SAndroid Build Coastguard Worker br label %l3.header 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Workerl3.header: 275*9880d681SAndroid Build Coastguard Worker %x1 = load i1, i1* %d, align 4 276*9880d681SAndroid Build Coastguard Worker br i1 %x1, label %l2.latch, label %l4.preheader 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerl4.preheader: 279*9880d681SAndroid Build Coastguard Worker br label %l4.header 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Workerl4.header: 282*9880d681SAndroid Build Coastguard Worker %x2 = load i1, i1* %a 283*9880d681SAndroid Build Coastguard Worker br i1 %x2, label %l3.latch, label %l4.body 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerl4.body: 286*9880d681SAndroid Build Coastguard Worker call void @f(i32* %arrayidx.i) 287*9880d681SAndroid Build Coastguard Worker %x3 = load i1, i1* %b 288*9880d681SAndroid Build Coastguard Worker %l = trunc i64 %iv to i32 289*9880d681SAndroid Build Coastguard Worker br i1 %x3, label %l4.latch, label %exit 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerl4.latch: 292*9880d681SAndroid Build Coastguard Worker call void @g() 293*9880d681SAndroid Build Coastguard Worker %x4 = load i1, i1* %b, align 4 294*9880d681SAndroid Build Coastguard Worker br i1 %x4, label %l4.header, label %exit 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Workerl3.latch: 297*9880d681SAndroid Build Coastguard Worker br label %l3.header 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerl2.latch: 300*9880d681SAndroid Build Coastguard Worker br label %l2.header 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerl1.latch: 303*9880d681SAndroid Build Coastguard Worker %iv.next = add nsw i64 %iv, 1 304*9880d681SAndroid Build Coastguard Worker br label %l1.header 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Workerexit: 307*9880d681SAndroid Build Coastguard Worker %lcssa = phi i32 [ %l, %l4.latch ], [ %l, %l4.body ] 308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR18753( 309*9880d681SAndroid Build Coastguard Worker; CHECK: exit: 310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i64 [ %iv, %l4.latch ], [ %iv, %l4.body ] 311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l.le = trunc i64 %[[LCSSAPHI]] to i32 312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l.le 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker ret i32 %lcssa 315*9880d681SAndroid Build Coastguard Worker} 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker; Can't sink stores out of exit blocks containing indirectbr instructions 318*9880d681SAndroid Build Coastguard Worker; because loop simplify does not create dedicated exits for such blocks. Test 319*9880d681SAndroid Build Coastguard Worker; that by sinking the store from lab21 to lab22, but not further. 320*9880d681SAndroid Build Coastguard Workerdefine void @test12() { 321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12 322*9880d681SAndroid Build Coastguard Worker br label %lab4 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Workerlab4: 325*9880d681SAndroid Build Coastguard Worker br label %lab20 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerlab5: 328*9880d681SAndroid Build Coastguard Worker br label %lab20 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Workerlab6: 331*9880d681SAndroid Build Coastguard Worker br label %lab4 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Workerlab7: 334*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lab8, label %lab13 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Workerlab8: 337*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lab13, label %lab10 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerlab10: 340*9880d681SAndroid Build Coastguard Worker br label %lab7 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Workerlab13: 343*9880d681SAndroid Build Coastguard Worker ret void 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Workerlab20: 346*9880d681SAndroid Build Coastguard Worker br label %lab21 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Workerlab21: 349*9880d681SAndroid Build Coastguard Worker; CHECK: lab21: 350*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store 351*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 false, label %lab21, label %lab22 352*9880d681SAndroid Build Coastguard Worker store i32 36127957, i32* undef, align 4 353*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lab21, label %lab22 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Workerlab22: 356*9880d681SAndroid Build Coastguard Worker; CHECK: lab22: 357*9880d681SAndroid Build Coastguard Worker; CHECK: store 358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: indirectbr i8* undef 359*9880d681SAndroid Build Coastguard Worker indirectbr i8* undef, [label %lab5, label %lab6, label %lab7] 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Worker; Test that we don't crash when trying to sink stores and there's no preheader 363*9880d681SAndroid Build Coastguard Worker; available (which is used for creating loads that may be used by the SSA 364*9880d681SAndroid Build Coastguard Worker; updater) 365*9880d681SAndroid Build Coastguard Workerdefine void @test13() { 366*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13 367*9880d681SAndroid Build Coastguard Worker br label %lab59 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerlab19: 370*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lab20, label %lab38 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerlab20: 373*9880d681SAndroid Build Coastguard Worker br label %lab60 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Workerlab21: 376*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lab22, label %lab38 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Workerlab22: 379*9880d681SAndroid Build Coastguard Worker br label %lab38 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Workerlab38: 382*9880d681SAndroid Build Coastguard Worker ret void 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Workerlab59: 385*9880d681SAndroid Build Coastguard Worker indirectbr i8* undef, [label %lab60, label %lab38] 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerlab60: 388*9880d681SAndroid Build Coastguard Worker; CHECK: lab60: 389*9880d681SAndroid Build Coastguard Worker; CHECK: store 390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: indirectbr 391*9880d681SAndroid Build Coastguard Worker store i32 2145244101, i32* undef, align 4 392*9880d681SAndroid Build Coastguard Worker indirectbr i8* undef, [label %lab21, label %lab19] 393*9880d681SAndroid Build Coastguard Worker} 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Workerdeclare void @f(i32*) 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerdeclare void @g() 398