1*c59ea32fSYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*c59ea32fSYingwei Zheng; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3*c59ea32fSYingwei Zheng 4*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) 5*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32) 6*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) 7*c59ea32fSYingwei Zhengdeclare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) 8*c59ea32fSYingwei Zheng 9*c59ea32fSYingwei Zhengdeclare void @use(i1) 10*c59ea32fSYingwei Zheng 11*c59ea32fSYingwei Zheng; Tests from PR75360 12*c59ea32fSYingwei Zhengdefine i1 @ckd_add_unsigned(i31 %num) { 13*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @ckd_add_unsigned( 14*c59ea32fSYingwei Zheng; CHECK-SAME: i31 [[NUM:%.*]]) { 15*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = icmp eq i31 [[NUM]], -1 16*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A2]] 17*c59ea32fSYingwei Zheng; 18*c59ea32fSYingwei Zheng %a0 = zext i31 %num to i32 19*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 20*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 21*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 22*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 0 23*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 24*c59ea32fSYingwei Zheng ret i1 %a5 25*c59ea32fSYingwei Zheng} 26*c59ea32fSYingwei Zheng 27*c59ea32fSYingwei Zhengdefine i1 @ckd_add_unsigned_commuted(i31 %num) { 28*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @ckd_add_unsigned_commuted( 29*c59ea32fSYingwei Zheng; CHECK-SAME: i31 [[NUM:%.*]]) { 30*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = icmp eq i31 [[NUM]], -1 31*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A2]] 32*c59ea32fSYingwei Zheng; 33*c59ea32fSYingwei Zheng %a0 = zext i31 %num to i32 34*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 35*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 36*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 37*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 0 38*c59ea32fSYingwei Zheng %a5 = or i1 %a4, %a2 39*c59ea32fSYingwei Zheng ret i1 %a5 40*c59ea32fSYingwei Zheng} 41*c59ea32fSYingwei Zheng 42*c59ea32fSYingwei Zhengdefine i1 @ckd_add_unsigned_imply_true(i31 %num) { 43*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @ckd_add_unsigned_imply_true( 44*c59ea32fSYingwei Zheng; CHECK-SAME: i31 [[NUM:%.*]]) { 45*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 true 46*c59ea32fSYingwei Zheng; 47*c59ea32fSYingwei Zheng %a0 = zext i31 %num to i32 48*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 49*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 50*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 51*c59ea32fSYingwei Zheng %a4 = icmp sgt i32 %a3, -1 52*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 53*c59ea32fSYingwei Zheng ret i1 %a5 54*c59ea32fSYingwei Zheng} 55*c59ea32fSYingwei Zheng 56*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp(i32 %a0) { 57*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp( 58*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 59*c59ea32fSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[A0]], -2147483647 60*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = icmp sgt i32 [[TMP1]], -1 61*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 62*c59ea32fSYingwei Zheng; 63*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 64*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 65*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 66*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 0 67*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 68*c59ea32fSYingwei Zheng ret i1 %a5 69*c59ea32fSYingwei Zheng} 70*c59ea32fSYingwei Zheng 71*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_ssub_with_overflow_icmp(i32 %a0) { 72*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_ssub_with_overflow_icmp( 73*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 74*c59ea32fSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A0]], 1 75*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[TMP1]] 76*c59ea32fSYingwei Zheng; 77*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a0, i32 1) 78*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 79*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 80*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 0 81*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 82*c59ea32fSYingwei Zheng ret i1 %a5 83*c59ea32fSYingwei Zheng} 84*c59ea32fSYingwei Zheng 85*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_uadd_with_overflow_icmp(i32 %a0) { 86*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_uadd_with_overflow_icmp( 87*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 88*c59ea32fSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[A0]], 1 89*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = icmp ult i32 [[TMP1]], 10 90*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 91*c59ea32fSYingwei Zheng; 92*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a0, i32 1) 93*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 94*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 95*c59ea32fSYingwei Zheng %a4 = icmp ult i32 %a3, 10 96*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 97*c59ea32fSYingwei Zheng ret i1 %a5 98*c59ea32fSYingwei Zheng} 99*c59ea32fSYingwei Zheng 100*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_eq(i32 %a0) { 101*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_eq( 102*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 103*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = icmp eq i32 [[A0]], 2147483647 104*c59ea32fSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[A0]], 9 105*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[TMP1]] 106*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 107*c59ea32fSYingwei Zheng; 108*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 109*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 110*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 111*c59ea32fSYingwei Zheng %a4 = icmp eq i32 %a3, 10 112*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 113*c59ea32fSYingwei Zheng ret i1 %a5 114*c59ea32fSYingwei Zheng} 115*c59ea32fSYingwei Zheng 116*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_uadd_with_overflow_icmp_ne(i32 %a0) { 117*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_uadd_with_overflow_icmp_ne( 118*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 119*c59ea32fSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[A0]], 9 120*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[TMP1]] 121*c59ea32fSYingwei Zheng; 122*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a0, i32 1) 123*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 124*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 125*c59ea32fSYingwei Zheng %a4 = icmp ne i32 %a3, 10 126*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 127*c59ea32fSYingwei Zheng ret i1 %a5 128*c59ea32fSYingwei Zheng} 129*c59ea32fSYingwei Zheng 130*c59ea32fSYingwei Zheng; Negative tests 131*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_mismatched_pred(i32 %a0) { 132*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_mismatched_pred( 133*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 134*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 1) 135*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 136*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 137*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp ult i32 [[A3]], 2 138*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 139*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 140*c59ea32fSYingwei Zheng; 141*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 142*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 143*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 144*c59ea32fSYingwei Zheng %a4 = icmp ult i32 %a3, 2 145*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 146*c59ea32fSYingwei Zheng ret i1 %a5 147*c59ea32fSYingwei Zheng} 148*c59ea32fSYingwei Zheng 149*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant1(i32 %a0, i32 %c) { 150*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant1( 151*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]], i32 [[C:%.*]]) { 152*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 [[C]]) 153*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 154*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 155*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp slt i32 [[A3]], 0 156*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 157*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 158*c59ea32fSYingwei Zheng; 159*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 %c) 160*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 161*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 162*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 0 163*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 164*c59ea32fSYingwei Zheng ret i1 %a5 165*c59ea32fSYingwei Zheng} 166*c59ea32fSYingwei Zheng 167*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant2(i32 %a0, i32 %c) { 168*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_non_constant2( 169*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]], i32 [[C:%.*]]) { 170*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 1) 171*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 172*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 173*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp slt i32 [[A3]], [[C]] 174*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 175*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 176*c59ea32fSYingwei Zheng; 177*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 178*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 179*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 180*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, %c 181*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 182*c59ea32fSYingwei Zheng ret i1 %a5 183*c59ea32fSYingwei Zheng} 184*c59ea32fSYingwei Zheng 185*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_multiuse(i32 %a0) { 186*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_multiuse( 187*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 188*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 1) 189*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 190*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 191*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp slt i32 [[A3]], 0 192*c59ea32fSYingwei Zheng; CHECK-NEXT: call void @use(i1 [[A4]]) 193*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 194*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 195*c59ea32fSYingwei Zheng; 196*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 1) 197*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 198*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 199*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 0 200*c59ea32fSYingwei Zheng call void @use(i1 %a4) 201*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 202*c59ea32fSYingwei Zheng ret i1 %a5 203*c59ea32fSYingwei Zheng} 204*c59ea32fSYingwei Zheng 205*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_sadd_with_overflow_icmp_overflow(i32 %a0) { 206*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_sadd_with_overflow_icmp_overflow( 207*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 208*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A0]], i32 -2147483647) 209*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 210*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 211*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp slt i32 [[A3]], 2 212*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 213*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 214*c59ea32fSYingwei Zheng; 215*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a0, i32 -2147483647) 216*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 217*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 218*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 2 219*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 220*c59ea32fSYingwei Zheng ret i1 %a5 221*c59ea32fSYingwei Zheng} 222*c59ea32fSYingwei Zheng 223*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_uadd_with_overflow_icmp_overflow(i32 %a0) { 224*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_uadd_with_overflow_icmp_overflow( 225*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 226*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[A0]], i32 3) 227*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 228*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 229*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp ult i32 [[A3]], 2 230*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 231*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 232*c59ea32fSYingwei Zheng; 233*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a0, i32 3) 234*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 235*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 236*c59ea32fSYingwei Zheng %a4 = icmp ult i32 %a3, 2 237*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 238*c59ea32fSYingwei Zheng ret i1 %a5 239*c59ea32fSYingwei Zheng} 240*c59ea32fSYingwei Zheng 241*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_ssub_with_overflow_icmp_overflow(i32 %a0) { 242*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_ssub_with_overflow_icmp_overflow( 243*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 244*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[A0]], i32 -2147483648) 245*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 246*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 247*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp slt i32 [[A3]], -1 248*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 249*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 250*c59ea32fSYingwei Zheng; 251*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a0, i32 -2147483648) 252*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 253*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 254*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, -1 255*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 256*c59ea32fSYingwei Zheng ret i1 %a5 257*c59ea32fSYingwei Zheng} 258*c59ea32fSYingwei Zheng 259*c59ea32fSYingwei Zhengdefine i1 @canonicalize_or_smul_with_overflow_icmp(i32 %a0) { 260*c59ea32fSYingwei Zheng; CHECK-LABEL: define i1 @canonicalize_or_smul_with_overflow_icmp( 261*c59ea32fSYingwei Zheng; CHECK-SAME: i32 [[A0:%.*]]) { 262*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A1:%.*]] = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[A0]], i32 3) 263*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A2:%.*]] = extractvalue { i32, i1 } [[A1]], 1 264*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A3:%.*]] = extractvalue { i32, i1 } [[A1]], 0 265*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A4:%.*]] = icmp slt i32 [[A3]], 10 266*c59ea32fSYingwei Zheng; CHECK-NEXT: [[A5:%.*]] = or i1 [[A2]], [[A4]] 267*c59ea32fSYingwei Zheng; CHECK-NEXT: ret i1 [[A5]] 268*c59ea32fSYingwei Zheng; 269*c59ea32fSYingwei Zheng %a1 = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %a0, i32 3) 270*c59ea32fSYingwei Zheng %a2 = extractvalue { i32, i1 } %a1, 1 271*c59ea32fSYingwei Zheng %a3 = extractvalue { i32, i1 } %a1, 0 272*c59ea32fSYingwei Zheng %a4 = icmp slt i32 %a3, 10 273*c59ea32fSYingwei Zheng %a5 = or i1 %a2, %a4 274*c59ea32fSYingwei Zheng ret i1 %a5 275*c59ea32fSYingwei Zheng} 276