1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O3 2*9880d681SAndroid Build Coastguard Worker; PR4626 3*9880d681SAndroid Build Coastguard Worker; ModuleID = '<stdin>' 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" 5*9880d681SAndroid Build Coastguard Workertarget triple = "i386-pc-linux-gnu" 6*9880d681SAndroid Build Coastguard Worker@g_3 = common global i8 0, align 1 ; <i8*> [#uses=2] 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine signext i8 @safe_mul_func_int16_t_s_s(i32 %_si1, i8 signext %_si2) nounwind readnone { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %_si1, 0 ; <i1> [#uses=1] 11*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i8 %_si2, 0 ; <i1> [#uses=2] 12*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %cmp, %tobool ; <i1> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker br i1 %or.cond, label %lor.rhs, label %land.lhs.true3 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerland.lhs.true3: ; preds = %entry 16*9880d681SAndroid Build Coastguard Worker %conv5 = sext i8 %_si2 to i32 ; <i32> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker %cmp7 = icmp slt i32 %conv5, %_si1 ; <i1> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker br i1 %cmp7, label %cond.end, label %lor.rhs 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerlor.rhs: ; preds = %land.lhs.true3, %entry 21*9880d681SAndroid Build Coastguard Worker %cmp10.not = icmp slt i32 %_si1, 1 ; <i1> [#uses=1] 22*9880d681SAndroid Build Coastguard Worker %or.cond23 = and i1 %cmp, %cmp10.not ; <i1> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker br i1 %or.cond23, label %lor.end, label %cond.false 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerlor.end: ; preds = %lor.rhs 26*9880d681SAndroid Build Coastguard Worker %tobool19 = icmp ne i8 %_si2, 0 ; <i1> [#uses=2] 27*9880d681SAndroid Build Coastguard Worker %lor.ext = zext i1 %tobool19 to i32 ; <i32> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker br i1 %tobool19, label %cond.end, label %cond.false 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workercond.false: ; preds = %lor.end, %lor.rhs 31*9880d681SAndroid Build Coastguard Worker %conv21 = sext i8 %_si2 to i32 ; <i32> [#uses=1] 32*9880d681SAndroid Build Coastguard Worker br label %cond.end 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workercond.end: ; preds = %cond.false, %lor.end, %land.lhs.true3 35*9880d681SAndroid Build Coastguard Worker %cond = phi i32 [ %conv21, %cond.false ], [ 1, %land.lhs.true3 ], [ %lor.ext, %lor.end ] ; <i32> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker %conv22 = trunc i32 %cond to i8 ; <i8> [#uses=1] 37*9880d681SAndroid Build Coastguard Worker ret i8 %conv22 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine i32 @func_34(i8 signext %p_35) nounwind readonly { 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %p_35, 0 ; <i1> [#uses=1] 43*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %lor.lhs.false, label %if.then 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerlor.lhs.false: ; preds = %entry 46*9880d681SAndroid Build Coastguard Worker %tmp1 = load i8, i8* @g_3 ; <i8> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i8 %tmp1, 0 ; <i1> [#uses=1] 48*9880d681SAndroid Build Coastguard Worker br i1 %tobool3, label %return, label %if.then 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %lor.lhs.false, %entry 51*9880d681SAndroid Build Coastguard Worker %tmp4 = load i8, i8* @g_3 ; <i8> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker %conv5 = sext i8 %tmp4 to i32 ; <i32> [#uses=1] 53*9880d681SAndroid Build Coastguard Worker ret i32 %conv5 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %lor.lhs.false 56*9880d681SAndroid Build Coastguard Worker ret i32 0 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine void @foo(i32 %p_5) noreturn nounwind { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %p_5, 0 ; <i1> [#uses=2] 62*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @safe() nounwind ; <i32> [#uses=1] 63*9880d681SAndroid Build Coastguard Worker %conv1 = trunc i32 %call to i8 ; <i8> [#uses=3] 64*9880d681SAndroid Build Coastguard Worker %tobool.i = xor i1 %cmp, true ; <i1> [#uses=3] 65*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp sgt i8 %conv1, 0 ; <i1> [#uses=3] 66*9880d681SAndroid Build Coastguard Worker %or.cond.i = or i1 %cmp.i, %tobool.i ; <i1> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker br i1 %or.cond.i, label %lor.rhs.i, label %land.lhs.true3.i 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerland.lhs.true3.i: ; preds = %entry 70*9880d681SAndroid Build Coastguard Worker %xor = zext i1 %cmp to i32 ; <i32> [#uses=1] 71*9880d681SAndroid Build Coastguard Worker %conv5.i = sext i8 %conv1 to i32 ; <i32> [#uses=1] 72*9880d681SAndroid Build Coastguard Worker %cmp7.i = icmp slt i32 %conv5.i, %xor ; <i1> [#uses=1] 73*9880d681SAndroid Build Coastguard Worker %cmp7.i.not = xor i1 %cmp7.i, true ; <i1> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker %or.cond23.i = and i1 %cmp.i, %tobool.i ; <i1> [#uses=1] 75*9880d681SAndroid Build Coastguard Worker %or.cond = and i1 %cmp7.i.not, %or.cond23.i ; <i1> [#uses=1] 76*9880d681SAndroid Build Coastguard Worker br i1 %or.cond, label %lor.end.i, label %for.inc 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerlor.rhs.i: ; preds = %entry 79*9880d681SAndroid Build Coastguard Worker %or.cond23.i.old = and i1 %cmp.i, %tobool.i ; <i1> [#uses=1] 80*9880d681SAndroid Build Coastguard Worker br i1 %or.cond23.i.old, label %lor.end.i, label %for.inc 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerlor.end.i: ; preds = %lor.rhs.i, %land.lhs.true3.i 83*9880d681SAndroid Build Coastguard Worker %tobool19.i = icmp eq i8 %conv1, 0 ; <i1> [#uses=0] 84*9880d681SAndroid Build Coastguard Worker br label %for.inc 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %for.inc, %lor.end.i, %lor.rhs.i, %land.lhs.true3.i 87*9880d681SAndroid Build Coastguard Worker br label %for.inc 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i32 @func_35(i8 signext %p_35) nounwind readonly { 91*9880d681SAndroid Build Coastguard Workerentry: 92*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %p_35, 0 ; <i1> [#uses=1] 93*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %lor.lhs.false, label %if.then 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerlor.lhs.false: ; preds = %entry 96*9880d681SAndroid Build Coastguard Worker %tmp1 = load i8, i8* @g_3 ; <i8> [#uses=1] 97*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i8 %tmp1, 0 ; <i1> [#uses=1] 98*9880d681SAndroid Build Coastguard Worker br i1 %tobool3, label %return, label %if.then 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %lor.lhs.false, %entry 101*9880d681SAndroid Build Coastguard Worker %tmp4 = load i8, i8* @g_3 ; <i8> [#uses=1] 102*9880d681SAndroid Build Coastguard Worker %conv5 = sext i8 %tmp4 to i32 ; <i32> [#uses=1] 103*9880d681SAndroid Build Coastguard Worker ret i32 %conv5 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %lor.lhs.false 106*9880d681SAndroid Build Coastguard Worker ret i32 0 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine void @bar(i32 %p_5) noreturn nounwind { 110*9880d681SAndroid Build Coastguard Workerentry: 111*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %p_5, 0 ; <i1> [#uses=2] 112*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @safe() nounwind ; <i32> [#uses=1] 113*9880d681SAndroid Build Coastguard Worker %conv1 = trunc i32 %call to i8 ; <i8> [#uses=3] 114*9880d681SAndroid Build Coastguard Worker %tobool.i = xor i1 %cmp, true ; <i1> [#uses=3] 115*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp sgt i8 %conv1, 0 ; <i1> [#uses=3] 116*9880d681SAndroid Build Coastguard Worker %or.cond.i = or i1 %cmp.i, %tobool.i ; <i1> [#uses=1] 117*9880d681SAndroid Build Coastguard Worker br i1 %or.cond.i, label %lor.rhs.i, label %land.lhs.true3.i 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerland.lhs.true3.i: ; preds = %entry 120*9880d681SAndroid Build Coastguard Worker %xor = zext i1 %cmp to i32 ; <i32> [#uses=1] 121*9880d681SAndroid Build Coastguard Worker %conv5.i = sext i8 %conv1 to i32 ; <i32> [#uses=1] 122*9880d681SAndroid Build Coastguard Worker %cmp7.i = icmp slt i32 %conv5.i, %xor ; <i1> [#uses=1] 123*9880d681SAndroid Build Coastguard Worker %cmp7.i.not = xor i1 %cmp7.i, true ; <i1> [#uses=1] 124*9880d681SAndroid Build Coastguard Worker %or.cond23.i = and i1 %cmp.i, %tobool.i ; <i1> [#uses=1] 125*9880d681SAndroid Build Coastguard Worker %or.cond = and i1 %cmp7.i.not, %or.cond23.i ; <i1> [#uses=1] 126*9880d681SAndroid Build Coastguard Worker br i1 %or.cond, label %lor.end.i, label %for.inc 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerlor.rhs.i: ; preds = %entry 129*9880d681SAndroid Build Coastguard Worker %or.cond23.i.old = and i1 %cmp.i, %tobool.i ; <i1> [#uses=1] 130*9880d681SAndroid Build Coastguard Worker br i1 %or.cond23.i.old, label %lor.end.i, label %for.inc 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerlor.end.i: ; preds = %lor.rhs.i, %land.lhs.true3.i 133*9880d681SAndroid Build Coastguard Worker %tobool19.i = icmp eq i8 %conv1, 0 ; <i1> [#uses=0] 134*9880d681SAndroid Build Coastguard Worker br label %for.inc 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %for.inc, %lor.end.i, %lor.rhs.i, %land.lhs.true3.i 137*9880d681SAndroid Build Coastguard Worker br label %for.inc 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdeclare i32 @safe() 141