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