1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86-64 < %s > /dev/null 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; ScalarEvolution misses an opportunity to fold ((trunc x) + (trunc -x) + y), 4*9880d681SAndroid Build Coastguard Worker; but LSR should tolerate this. 5*9880d681SAndroid Build Coastguard Worker; rdar://7886751 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 8*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin11.0" 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine fastcc void @formatValue(i64 %arg5) nounwind { 11*9880d681SAndroid Build Coastguard Workerbb12: ; preds = %bb11 12*9880d681SAndroid Build Coastguard Worker %t = trunc i64 %arg5 to i32 ; <i32> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %t13 = sub i64 0, %arg5 ; <i64> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker %t14 = and i64 %t13, 4294967295 ; <i64> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker br label %bb15 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerbb15: ; preds = %bb21, %bb12 18*9880d681SAndroid Build Coastguard Worker %t16 = phi i64 [ 0, %bb12 ], [ %t23, %bb15 ] ; <i64> [#uses=2] 19*9880d681SAndroid Build Coastguard Worker %t17 = mul i64 %t14, %t16 ; <i64> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker %t18 = add i64 undef, %t17 ; <i64> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker %t19 = trunc i64 %t18 to i32 ; <i32> [#uses=1] 22*9880d681SAndroid Build Coastguard Worker %t22 = icmp eq i32 %t19, %t ; <i1> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker %t23 = add i64 %t16, 1 ; <i64> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker br i1 %t22, label %bb24, label %bb15 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerbb24: ; preds = %bb21, %bb11 27*9880d681SAndroid Build Coastguard Worker unreachable 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; ScalarEvolution should be able to correctly expand the crazy addrec here. 31*9880d681SAndroid Build Coastguard Worker; PR6914 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine void @int323() nounwind { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker br label %for.cond 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %lbl_264, %for.inc, %entry 38*9880d681SAndroid Build Coastguard Worker %g_263.tmp.1 = phi i8 [ undef, %entry ], [ %g_263.tmp.1, %for.cond ] 39*9880d681SAndroid Build Coastguard Worker %p_95.addr.0 = phi i8 [ 0, %entry ], [ %add, %for.cond ] 40*9880d681SAndroid Build Coastguard Worker %add = add i8 %p_95.addr.0, 1 ; <i8> [#uses=1] 41*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.cond, label %lbl_264 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerlbl_264: ; preds = %if.end, %lbl_264.preheader 44*9880d681SAndroid Build Coastguard Worker %g_263.tmp.0 = phi i8 [ %g_263.tmp.1, %for.cond ] ; <i8> [#uses=1] 45*9880d681SAndroid Build Coastguard Worker %tmp7 = load i16, i16* undef ; <i16> [#uses=1] 46*9880d681SAndroid Build Coastguard Worker %conv8 = trunc i16 %tmp7 to i8 ; <i8> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker %mul.i = mul i8 %p_95.addr.0, %p_95.addr.0 ; <i8> [#uses=1] 48*9880d681SAndroid Build Coastguard Worker %mul.i18 = mul i8 %mul.i, %conv8 ; <i8> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %tobool12 = icmp eq i8 %mul.i18, 0 ; <i1> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker unreachable 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; LSR ends up going into conservative pruning mode; don't prune the solution 54*9880d681SAndroid Build Coastguard Worker; so far that it becomes unsolvable though. 55*9880d681SAndroid Build Coastguard Worker; PR7077 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker%struct.Bu = type { i32, i32, i32 } 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine void @_Z3fooP2Bui(%struct.Bu* nocapture %bu) { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker br label %for.body 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.inc131, %entry 64*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ %indvar.next, %for.inc131 ], [ 0, %entry ] ; <i64> [#uses=3] 65*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.inc131, label %lor.lhs.false 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerlor.lhs.false: ; preds = %for.body 68*9880d681SAndroid Build Coastguard Worker %tmp15 = add i64 %indvar, 1 ; <i64> [#uses=1] 69*9880d681SAndroid Build Coastguard Worker %tmp17 = add i64 %indvar, 2 ; <i64> [#uses=1] 70*9880d681SAndroid Build Coastguard Worker %tmp19 = add i64 %indvar, 3 ; <i64> [#uses=1] 71*9880d681SAndroid Build Coastguard Worker %tmp21 = add i64 %indvar, 4 ; <i64> [#uses=1] 72*9880d681SAndroid Build Coastguard Worker %tmp23 = add i64 %indvar, 5 ; <i64> [#uses=1] 73*9880d681SAndroid Build Coastguard Worker %tmp25 = add i64 %indvar, 6 ; <i64> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker %tmp27 = add i64 %indvar, 7 ; <i64> [#uses=1] 75*9880d681SAndroid Build Coastguard Worker %tmp29 = add i64 %indvar, 8 ; <i64> [#uses=1] 76*9880d681SAndroid Build Coastguard Worker %tmp31 = add i64 %indvar, 9 ; <i64> [#uses=1] 77*9880d681SAndroid Build Coastguard Worker %tmp35 = add i64 %indvar, 11 ; <i64> [#uses=1] 78*9880d681SAndroid Build Coastguard Worker %tmp37 = add i64 %indvar, 12 ; <i64> [#uses=1] 79*9880d681SAndroid Build Coastguard Worker %tmp39 = add i64 %indvar, 13 ; <i64> [#uses=1] 80*9880d681SAndroid Build Coastguard Worker %tmp41 = add i64 %indvar, 14 ; <i64> [#uses=1] 81*9880d681SAndroid Build Coastguard Worker %tmp43 = add i64 %indvar, 15 ; <i64> [#uses=1] 82*9880d681SAndroid Build Coastguard Worker %tmp45 = add i64 %indvar, 16 ; <i64> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker %tmp47 = add i64 %indvar, 17 ; <i64> [#uses=1] 84*9880d681SAndroid Build Coastguard Worker %mul = trunc i64 %indvar to i32 ; <i32> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker %add22 = trunc i64 %tmp15 to i32 ; <i32> [#uses=1] 86*9880d681SAndroid Build Coastguard Worker %add28 = trunc i64 %tmp17 to i32 ; <i32> [#uses=1] 87*9880d681SAndroid Build Coastguard Worker %add34 = trunc i64 %tmp19 to i32 ; <i32> [#uses=1] 88*9880d681SAndroid Build Coastguard Worker %add40 = trunc i64 %tmp21 to i32 ; <i32> [#uses=1] 89*9880d681SAndroid Build Coastguard Worker %add46 = trunc i64 %tmp23 to i32 ; <i32> [#uses=1] 90*9880d681SAndroid Build Coastguard Worker %add52 = trunc i64 %tmp25 to i32 ; <i32> [#uses=1] 91*9880d681SAndroid Build Coastguard Worker %add58 = trunc i64 %tmp27 to i32 ; <i32> [#uses=1] 92*9880d681SAndroid Build Coastguard Worker %add64 = trunc i64 %tmp29 to i32 ; <i32> [#uses=1] 93*9880d681SAndroid Build Coastguard Worker %add70 = trunc i64 %tmp31 to i32 ; <i32> [#uses=1] 94*9880d681SAndroid Build Coastguard Worker %add82 = trunc i64 %tmp35 to i32 ; <i32> [#uses=1] 95*9880d681SAndroid Build Coastguard Worker %add88 = trunc i64 %tmp37 to i32 ; <i32> [#uses=1] 96*9880d681SAndroid Build Coastguard Worker %add94 = trunc i64 %tmp39 to i32 ; <i32> [#uses=1] 97*9880d681SAndroid Build Coastguard Worker %add100 = trunc i64 %tmp41 to i32 ; <i32> [#uses=1] 98*9880d681SAndroid Build Coastguard Worker %add106 = trunc i64 %tmp43 to i32 ; <i32> [#uses=1] 99*9880d681SAndroid Build Coastguard Worker %add112 = trunc i64 %tmp45 to i32 ; <i32> [#uses=1] 100*9880d681SAndroid Build Coastguard Worker %add118 = trunc i64 %tmp47 to i32 ; <i32> [#uses=1] 101*9880d681SAndroid Build Coastguard Worker %tmp10 = getelementptr %struct.Bu, %struct.Bu* %bu, i64 %indvar, i32 2 ; <i32*> [#uses=1] 102*9880d681SAndroid Build Coastguard Worker %tmp11 = load i32, i32* %tmp10 ; <i32> [#uses=0] 103*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add22) 104*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add28) 105*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add34) 106*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add40) 107*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add46) 108*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add52) 109*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add58) 110*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add64) 111*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add70) 112*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add82) 113*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add88) 114*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add94) 115*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add100) 116*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add106) 117*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add112) 118*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add118) 119*9880d681SAndroid Build Coastguard Worker br label %for.body123 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerfor.body123: ; preds = %for.body123, %lor.lhs.false 122*9880d681SAndroid Build Coastguard Worker %j.03 = phi i32 [ 0, %lor.lhs.false ], [ %inc, %for.body123 ] ; <i32> [#uses=2] 123*9880d681SAndroid Build Coastguard Worker %add129 = add i32 %mul, %j.03 ; <i32> [#uses=1] 124*9880d681SAndroid Build Coastguard Worker tail call void undef(i32 %add129) 125*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %j.03, 1 ; <i32> [#uses=1] 126*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.inc131, label %for.body123 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerfor.inc131: ; preds = %for.body123, %for.body 129*9880d681SAndroid Build Coastguard Worker %indvar.next = add i64 %indvar, 1 ; <i64> [#uses=1] 130*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.end134, label %for.body 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerfor.end134: ; preds = %for.inc131 133*9880d681SAndroid Build Coastguard Worker ret void 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; LSR needs to remember inserted instructions even in postinc mode, because 137*9880d681SAndroid Build Coastguard Worker; there could be multiple subexpressions within a single expansion which 138*9880d681SAndroid Build Coastguard Worker; require insert point adjustment. 139*9880d681SAndroid Build Coastguard Worker; PR7306 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine fastcc i32 @GetOptimum() nounwind { 142*9880d681SAndroid Build Coastguard Workerbb: 143*9880d681SAndroid Build Coastguard Worker br label %bb1 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb1, %bb 146*9880d681SAndroid Build Coastguard Worker %t = phi i32 [ 0, %bb ], [ %t2, %bb1 ] ; <i32> [#uses=1] 147*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t, undef ; <i32> [#uses=3] 148*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb1, label %bb3 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb1 151*9880d681SAndroid Build Coastguard Worker %t4 = add i32 undef, -1 ; <i32> [#uses=1] 152*9880d681SAndroid Build Coastguard Worker br label %bb5 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerbb5: ; preds = %bb16, %bb3 155*9880d681SAndroid Build Coastguard Worker %t6 = phi i32 [ %t17, %bb16 ], [ 0, %bb3 ] ; <i32> [#uses=3] 156*9880d681SAndroid Build Coastguard Worker %t7 = add i32 undef, %t6 ; <i32> [#uses=2] 157*9880d681SAndroid Build Coastguard Worker %t8 = add i32 %t4, %t6 ; <i32> [#uses=1] 158*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb9, label %bb10 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerbb9: ; preds = %bb5 161*9880d681SAndroid Build Coastguard Worker br label %bb10 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerbb10: ; preds = %bb9, %bb5 164*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb11, label %bb16 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerbb11: ; preds = %bb10 167*9880d681SAndroid Build Coastguard Worker %t12 = icmp ugt i32 %t7, %t2 ; <i1> [#uses=1] 168*9880d681SAndroid Build Coastguard Worker %t13 = select i1 %t12, i32 %t2, i32 %t7 ; <i32> [#uses=1] 169*9880d681SAndroid Build Coastguard Worker br label %bb14 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerbb14: ; preds = %bb11 172*9880d681SAndroid Build Coastguard Worker store i32 %t13, i32* null 173*9880d681SAndroid Build Coastguard Worker ret i32 %t8 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerbb16: ; preds = %bb10 176*9880d681SAndroid Build Coastguard Worker %t17 = add i32 %t6, 1 ; <i32> [#uses=1] 177*9880d681SAndroid Build Coastguard Worker br label %bb5 178*9880d681SAndroid Build Coastguard Worker} 179