1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -x86-early-ifcvt -stress-early-ifcvt | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.8.0" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK: mm2 5*9880d681SAndroid Build Coastguard Workerdefine i32 @mm2(i32* nocapture %p, i32 %n) nounwind uwtable readonly ssp { 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker br label %do.body 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK: do.body 10*9880d681SAndroid Build Coastguard Worker; Loop body has no branches before the backedge. 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB 12*9880d681SAndroid Build Coastguard Workerdo.body: 13*9880d681SAndroid Build Coastguard Worker %max.0 = phi i32 [ 0, %entry ], [ %max.1, %do.cond ] 14*9880d681SAndroid Build Coastguard Worker %min.0 = phi i32 [ 0, %entry ], [ %min.1, %do.cond ] 15*9880d681SAndroid Build Coastguard Worker %n.addr.0 = phi i32 [ %n, %entry ], [ %dec, %do.cond ] 16*9880d681SAndroid Build Coastguard Worker %p.addr.0 = phi i32* [ %p, %entry ], [ %incdec.ptr, %do.cond ] 17*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %p.addr.0, i64 1 18*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %p.addr.0, align 4 19*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %0, %max.0 20*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %do.cond, label %if.else 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerif.else: 23*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp slt i32 %0, %min.0 24*9880d681SAndroid Build Coastguard Worker %.min.0 = select i1 %cmp1, i32 %0, i32 %min.0 25*9880d681SAndroid Build Coastguard Worker br label %do.cond 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdo.cond: 28*9880d681SAndroid Build Coastguard Worker %max.1 = phi i32 [ %0, %do.body ], [ %max.0, %if.else ] 29*9880d681SAndroid Build Coastguard Worker %min.1 = phi i32 [ %min.0, %do.body ], [ %.min.0, %if.else ] 30*9880d681SAndroid Build Coastguard Worker; CHECK: decl %esi 31*9880d681SAndroid Build Coastguard Worker; CHECK: jne LBB 32*9880d681SAndroid Build Coastguard Worker %dec = add i32 %n.addr.0, -1 33*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %dec, 0 34*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %do.end, label %do.body 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdo.end: 37*9880d681SAndroid Build Coastguard Worker %sub = sub nsw i32 %max.1, %min.1 38*9880d681SAndroid Build Coastguard Worker ret i32 %sub 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK: multipreds 42*9880d681SAndroid Build Coastguard Worker; Deal with alternative tail predecessors 43*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB 44*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 45*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB 46*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB 48*9880d681SAndroid Build Coastguard Worker; CHECK: fprintf 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine void @multipreds(i32 %sw) nounwind uwtable ssp { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker switch i32 %sw, label %if.then29 [ 53*9880d681SAndroid Build Coastguard Worker i32 0, label %if.then37 54*9880d681SAndroid Build Coastguard Worker i32 127, label %if.end41 55*9880d681SAndroid Build Coastguard Worker ] 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerif.then29: 58*9880d681SAndroid Build Coastguard Worker br label %if.end41 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerif.then37: 61*9880d681SAndroid Build Coastguard Worker br label %if.end41 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerif.end41: 64*9880d681SAndroid Build Coastguard Worker %exit_status.0 = phi i32 [ 2, %if.then29 ], [ 0, %if.then37 ], [ 66, %entry ] 65*9880d681SAndroid Build Coastguard Worker call void (...) @fprintf(i32 %exit_status.0) nounwind 66*9880d681SAndroid Build Coastguard Worker unreachable 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdeclare void @fprintf(...) nounwind 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; CHECK: BZ2_decompress 72*9880d681SAndroid Build Coastguard Worker; This test case contains irreducible control flow, so MachineLoopInfo doesn't 73*9880d681SAndroid Build Coastguard Worker; recognize the cycle in the CFG. This would confuse MachineTraceMetrics. 74*9880d681SAndroid Build Coastguard Workerdefine void @BZ2_decompress(i8* %s) nounwind ssp { 75*9880d681SAndroid Build Coastguard Workerentry: 76*9880d681SAndroid Build Coastguard Worker switch i32 undef, label %sw.default [ 77*9880d681SAndroid Build Coastguard Worker i32 39, label %if.end.sw.bb2050_crit_edge 78*9880d681SAndroid Build Coastguard Worker i32 36, label %sw.bb1788 79*9880d681SAndroid Build Coastguard Worker i32 37, label %if.end.sw.bb1855_crit_edge 80*9880d681SAndroid Build Coastguard Worker i32 40, label %sw.bb2409 81*9880d681SAndroid Build Coastguard Worker i32 38, label %sw.bb1983 82*9880d681SAndroid Build Coastguard Worker i32 44, label %if.end.sw.bb3058_crit_edge 83*9880d681SAndroid Build Coastguard Worker ] 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerif.end.sw.bb3058_crit_edge: ; preds = %entry 86*9880d681SAndroid Build Coastguard Worker br label %save_state_and_return 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerif.end.sw.bb1855_crit_edge: ; preds = %entry 89*9880d681SAndroid Build Coastguard Worker br label %save_state_and_return 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerif.end.sw.bb2050_crit_edge: ; preds = %entry 92*9880d681SAndroid Build Coastguard Worker br label %sw.bb2050 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workersw.bb1788: ; preds = %entry 95*9880d681SAndroid Build Coastguard Worker br label %save_state_and_return 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workersw.bb1983: ; preds = %entry 98*9880d681SAndroid Build Coastguard Worker br i1 undef, label %save_state_and_return, label %if.then1990 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerif.then1990: ; preds = %sw.bb1983 101*9880d681SAndroid Build Coastguard Worker br label %while.body2038 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerwhile.body2038: ; preds = %sw.bb2050, %if.then1990 104*9880d681SAndroid Build Coastguard Worker %groupPos.8 = phi i32 [ 0, %if.then1990 ], [ %groupPos.9, %sw.bb2050 ] 105*9880d681SAndroid Build Coastguard Worker br i1 undef, label %save_state_and_return, label %if.end2042 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerif.end2042: ; preds = %while.body2038 108*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.end2048, label %while.end2104 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerif.end2048: ; preds = %if.end2042 111*9880d681SAndroid Build Coastguard Worker %bsLive2054.pre = getelementptr inbounds i8, i8* %s, i32 8 112*9880d681SAndroid Build Coastguard Worker br label %sw.bb2050 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workersw.bb2050: ; preds = %if.end2048, %if.end.sw.bb2050_crit_edge 115*9880d681SAndroid Build Coastguard Worker %groupPos.9 = phi i32 [ 0, %if.end.sw.bb2050_crit_edge ], [ %groupPos.8, %if.end2048 ] 116*9880d681SAndroid Build Coastguard Worker %and2064 = and i32 undef, 1 117*9880d681SAndroid Build Coastguard Worker br label %while.body2038 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerwhile.end2104: ; preds = %if.end2042 120*9880d681SAndroid Build Coastguard Worker br i1 undef, label %save_state_and_return, label %if.end2117 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerif.end2117: ; preds = %while.end2104 123*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.body2161.lr.ph, label %while.body2145.lr.ph 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerwhile.body2145.lr.ph: ; preds = %if.end2117 126*9880d681SAndroid Build Coastguard Worker br label %save_state_and_return 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerwhile.body2161.lr.ph: ; preds = %if.end2117 129*9880d681SAndroid Build Coastguard Worker br label %save_state_and_return 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workersw.bb2409: ; preds = %entry 132*9880d681SAndroid Build Coastguard Worker br label %save_state_and_return 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workersw.default: ; preds = %entry 135*9880d681SAndroid Build Coastguard Worker call void @BZ2_bz__AssertH__fail() nounwind 136*9880d681SAndroid Build Coastguard Worker br label %save_state_and_return 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workersave_state_and_return: 139*9880d681SAndroid Build Coastguard Worker %groupPos.14 = phi i32 [ 0, %sw.default ], [ %groupPos.8, %while.body2038 ], [ %groupPos.8, %while.end2104 ], [ 0, %if.end.sw.bb3058_crit_edge ], [ 0, %if.end.sw.bb1855_crit_edge ], [ %groupPos.8, %while.body2161.lr.ph ], [ %groupPos.8, %while.body2145.lr.ph ], [ 0, %sw.bb2409 ], [ 0, %sw.bb1788 ], [ 0, %sw.bb1983 ] 140*9880d681SAndroid Build Coastguard Worker store i32 %groupPos.14, i32* undef, align 4 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdeclare void @BZ2_bz__AssertH__fail() 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; Make sure we don't speculate on div/idiv instructions 147*9880d681SAndroid Build Coastguard Worker; CHECK: test_idiv 148*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 149*9880d681SAndroid Build Coastguard Workerdefine i32 @test_idiv(i32 %a, i32 %b) nounwind uwtable readnone ssp { 150*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %b, 0 151*9880d681SAndroid Build Coastguard Worker br i1 %1, label %4, label %2 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; <label>:2 ; preds = %0 154*9880d681SAndroid Build Coastguard Worker %3 = sdiv i32 %a, %b 155*9880d681SAndroid Build Coastguard Worker br label %4 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; <label>:4 ; preds = %0, %2 158*9880d681SAndroid Build Coastguard Worker %5 = phi i32 [ %3, %2 ], [ %a, %0 ] 159*9880d681SAndroid Build Coastguard Worker ret i32 %5 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; CHECK: test_div 163*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 164*9880d681SAndroid Build Coastguard Workerdefine i32 @test_div(i32 %a, i32 %b) nounwind uwtable readnone ssp { 165*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %b, 0 166*9880d681SAndroid Build Coastguard Worker br i1 %1, label %4, label %2 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; <label>:2 ; preds = %0 169*9880d681SAndroid Build Coastguard Worker %3 = udiv i32 %a, %b 170*9880d681SAndroid Build Coastguard Worker br label %4 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; <label>:4 ; preds = %0, %2 173*9880d681SAndroid Build Coastguard Worker %5 = phi i32 [ %3, %2 ], [ %a, %0 ] 174*9880d681SAndroid Build Coastguard Worker ret i32 %5 175*9880d681SAndroid Build Coastguard Worker} 176