711 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4define i32 @uadd(i32 %x, i32 %y) {5; CHECK-LABEL: @uadd(6; CHECK-NEXT: [[S:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])7; CHECK-NEXT: ret i32 [[S]]8;9 %ao = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)10 %o = extractvalue { i32, i1 } %ao, 111 %a = extractvalue { i32, i1 } %ao, 012 %s = select i1 %o, i32 -1, i32 %a13 ret i32 %s14}15 16define i32 @usub(i32 %x, i32 %y) {17; CHECK-LABEL: @usub(18; CHECK-NEXT: [[S:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])19; CHECK-NEXT: ret i32 [[S]]20;21 %ao = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %x, i32 %y)22 %o = extractvalue { i32, i1 } %ao, 123 %a = extractvalue { i32, i1 } %ao, 024 %s = select i1 %o, i32 0, i32 %a25 ret i32 %s26}27 28 29define i8 @sadd_x_lt_min(i8 %x, i8 %y) {30; CHECK-LABEL: @sadd_x_lt_min(31; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])32; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 133; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 034; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 035; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -12836; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]37; CHECK-NEXT: ret i8 [[R]]38;39 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)40 %o = extractvalue { i8, i1 } %ao, 141 %a = extractvalue { i8, i1 } %ao, 042 %c = icmp slt i8 %x, 043 %s = select i1 %c, i8 127, i8 -12844 %r = select i1 %o, i8 %s, i8 %a45 ret i8 %r46}47 48define i8 @sadd_x_lt_max(i8 %x, i8 %y) {49; CHECK-LABEL: @sadd_x_lt_max(50; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])51; CHECK-NEXT: ret i8 [[R]]52;53 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)54 %o = extractvalue { i8, i1 } %ao, 155 %a = extractvalue { i8, i1 } %ao, 056 %c = icmp slt i8 %x, 057 %s = select i1 %c, i8 -128, i8 12758 %r = select i1 %o, i8 %s, i8 %a59 ret i8 %r60}61 62define i8 @sadd_x_le_min(i8 %x, i8 %y) {63; CHECK-LABEL: @sadd_x_le_min(64; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])65; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 166; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 067; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 168; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -12869; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]70; CHECK-NEXT: ret i8 [[R]]71;72 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)73 %o = extractvalue { i8, i1 } %ao, 174 %a = extractvalue { i8, i1 } %ao, 075 %c = icmp sle i8 %x, 076 %s = select i1 %c, i8 127, i8 -12877 %r = select i1 %o, i8 %s, i8 %a78 ret i8 %r79}80 81define i8 @sadd_x_le_max(i8 %x, i8 %y) {82; CHECK-LABEL: @sadd_x_le_max(83; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])84; CHECK-NEXT: ret i8 [[R]]85;86 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)87 %o = extractvalue { i8, i1 } %ao, 188 %a = extractvalue { i8, i1 } %ao, 089 %c = icmp sle i8 %x, 090 %s = select i1 %c, i8 -128, i8 12791 %r = select i1 %o, i8 %s, i8 %a92 ret i8 %r93}94 95define i8 @sadd_x_gt_min(i8 %x, i8 %y) {96; CHECK-LABEL: @sadd_x_gt_min(97; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])98; CHECK-NEXT: ret i8 [[R]]99;100 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)101 %o = extractvalue { i8, i1 } %ao, 1102 %a = extractvalue { i8, i1 } %ao, 0103 %c = icmp sgt i8 %x, 0104 %s = select i1 %c, i8 127, i8 -128105 %r = select i1 %o, i8 %s, i8 %a106 ret i8 %r107}108 109define i8 @sadd_x_gt_max(i8 %x, i8 %y) {110; CHECK-LABEL: @sadd_x_gt_max(111; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])112; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1113; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0114; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0115; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127116; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]117; CHECK-NEXT: ret i8 [[R]]118;119 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)120 %o = extractvalue { i8, i1 } %ao, 1121 %a = extractvalue { i8, i1 } %ao, 0122 %c = icmp sgt i8 %x, 0123 %s = select i1 %c, i8 -128, i8 127124 %r = select i1 %o, i8 %s, i8 %a125 ret i8 %r126}127 128define i8 @sadd_x_ge_min(i8 %x, i8 %y) {129; CHECK-LABEL: @sadd_x_ge_min(130; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])131; CHECK-NEXT: ret i8 [[R]]132;133 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)134 %o = extractvalue { i8, i1 } %ao, 1135 %a = extractvalue { i8, i1 } %ao, 0136 %c = icmp sge i8 %x, 0137 %s = select i1 %c, i8 127, i8 -128138 %r = select i1 %o, i8 %s, i8 %a139 ret i8 %r140}141 142define i8 @sadd_x_ge_max(i8 %x, i8 %y) {143; CHECK-LABEL: @sadd_x_ge_max(144; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])145; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1146; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0147; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1148; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127149; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]150; CHECK-NEXT: ret i8 [[R]]151;152 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)153 %o = extractvalue { i8, i1 } %ao, 1154 %a = extractvalue { i8, i1 } %ao, 0155 %c = icmp sge i8 %x, 0156 %s = select i1 %c, i8 -128, i8 127157 %r = select i1 %o, i8 %s, i8 %a158 ret i8 %r159}160 161 162define i8 @sadd_y_lt_min(i8 %x, i8 %y) {163; CHECK-LABEL: @sadd_y_lt_min(164; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])165; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1166; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0167; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0168; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128169; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]170; CHECK-NEXT: ret i8 [[R]]171;172 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)173 %o = extractvalue { i8, i1 } %ao, 1174 %a = extractvalue { i8, i1 } %ao, 0175 %c = icmp slt i8 %y, 0176 %s = select i1 %c, i8 127, i8 -128177 %r = select i1 %o, i8 %s, i8 %a178 ret i8 %r179}180 181define i8 @sadd_y_lt_max(i8 %x, i8 %y) {182; CHECK-LABEL: @sadd_y_lt_max(183; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])184; CHECK-NEXT: ret i8 [[R]]185;186 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)187 %o = extractvalue { i8, i1 } %ao, 1188 %a = extractvalue { i8, i1 } %ao, 0189 %c = icmp slt i8 %y, 0190 %s = select i1 %c, i8 -128, i8 127191 %r = select i1 %o, i8 %s, i8 %a192 ret i8 %r193}194 195define i8 @sadd_y_le_min(i8 %x, i8 %y) {196; CHECK-LABEL: @sadd_y_le_min(197; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])198; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1199; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0200; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1201; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128202; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]203; CHECK-NEXT: ret i8 [[R]]204;205 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)206 %o = extractvalue { i8, i1 } %ao, 1207 %a = extractvalue { i8, i1 } %ao, 0208 %c = icmp sle i8 %y, 0209 %s = select i1 %c, i8 127, i8 -128210 %r = select i1 %o, i8 %s, i8 %a211 ret i8 %r212}213 214define i8 @sadd_y_le_max(i8 %x, i8 %y) {215; CHECK-LABEL: @sadd_y_le_max(216; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])217; CHECK-NEXT: ret i8 [[R]]218;219 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)220 %o = extractvalue { i8, i1 } %ao, 1221 %a = extractvalue { i8, i1 } %ao, 0222 %c = icmp sle i8 %y, 0223 %s = select i1 %c, i8 -128, i8 127224 %r = select i1 %o, i8 %s, i8 %a225 ret i8 %r226}227 228define i8 @sadd_y_gt_min(i8 %x, i8 %y) {229; CHECK-LABEL: @sadd_y_gt_min(230; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])231; CHECK-NEXT: ret i8 [[R]]232;233 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)234 %o = extractvalue { i8, i1 } %ao, 1235 %a = extractvalue { i8, i1 } %ao, 0236 %c = icmp sgt i8 %y, 0237 %s = select i1 %c, i8 127, i8 -128238 %r = select i1 %o, i8 %s, i8 %a239 ret i8 %r240}241 242define i8 @sadd_y_gt_max(i8 %x, i8 %y) {243; CHECK-LABEL: @sadd_y_gt_max(244; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])245; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1246; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0247; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0248; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127249; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]250; CHECK-NEXT: ret i8 [[R]]251;252 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)253 %o = extractvalue { i8, i1 } %ao, 1254 %a = extractvalue { i8, i1 } %ao, 0255 %c = icmp sgt i8 %y, 0256 %s = select i1 %c, i8 -128, i8 127257 %r = select i1 %o, i8 %s, i8 %a258 ret i8 %r259}260 261define i8 @sadd_y_ge_min(i8 %x, i8 %y) {262; CHECK-LABEL: @sadd_y_ge_min(263; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])264; CHECK-NEXT: ret i8 [[R]]265;266 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)267 %o = extractvalue { i8, i1 } %ao, 1268 %a = extractvalue { i8, i1 } %ao, 0269 %c = icmp sge i8 %y, 0270 %s = select i1 %c, i8 127, i8 -128271 %r = select i1 %o, i8 %s, i8 %a272 ret i8 %r273}274 275define i8 @sadd_y_ge_max(i8 %x, i8 %y) {276; CHECK-LABEL: @sadd_y_ge_max(277; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])278; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1279; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0280; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1281; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127282; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]283; CHECK-NEXT: ret i8 [[R]]284;285 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y)286 %o = extractvalue { i8, i1 } %ao, 1287 %a = extractvalue { i8, i1 } %ao, 0288 %c = icmp sge i8 %y, 0289 %s = select i1 %c, i8 -128, i8 127290 %r = select i1 %o, i8 %s, i8 %a291 ret i8 %r292}293 294 295 296 297define i8 @ssub_x_lt_min(i8 %x, i8 %y) {298; CHECK-LABEL: @ssub_x_lt_min(299; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])300; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1301; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0302; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 0303; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128304; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]305; CHECK-NEXT: ret i8 [[R]]306;307 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)308 %o = extractvalue { i8, i1 } %ao, 1309 %a = extractvalue { i8, i1 } %ao, 0310 %c = icmp slt i8 %x, 0311 %s = select i1 %c, i8 127, i8 -128312 %r = select i1 %o, i8 %s, i8 %a313 ret i8 %r314}315 316define i8 @ssub_x_lt_max(i8 %x, i8 %y) {317; CHECK-LABEL: @ssub_x_lt_max(318; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])319; CHECK-NEXT: ret i8 [[R]]320;321 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)322 %o = extractvalue { i8, i1 } %ao, 1323 %a = extractvalue { i8, i1 } %ao, 0324 %c = icmp slt i8 %x, 0325 %s = select i1 %c, i8 -128, i8 127326 %r = select i1 %o, i8 %s, i8 %a327 ret i8 %r328}329 330define i8 @ssub_x_le_min(i8 %x, i8 %y) {331; CHECK-LABEL: @ssub_x_le_min(332; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])333; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1334; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0335; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1336; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128337; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]338; CHECK-NEXT: ret i8 [[R]]339;340 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)341 %o = extractvalue { i8, i1 } %ao, 1342 %a = extractvalue { i8, i1 } %ao, 0343 %c = icmp sle i8 %x, 0344 %s = select i1 %c, i8 127, i8 -128345 %r = select i1 %o, i8 %s, i8 %a346 ret i8 %r347}348 349define i8 @ssub_x_le_max(i8 %x, i8 %y) {350; CHECK-LABEL: @ssub_x_le_max(351; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])352; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1353; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0354; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1355; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127356; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]357; CHECK-NEXT: ret i8 [[R]]358;359 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)360 %o = extractvalue { i8, i1 } %ao, 1361 %a = extractvalue { i8, i1 } %ao, 0362 %c = icmp sle i8 %x, 0363 %s = select i1 %c, i8 -128, i8 127364 %r = select i1 %o, i8 %s, i8 %a365 ret i8 %r366}367 368define i8 @ssub_x_lt2_min(i8 %x, i8 %y) {369; CHECK-LABEL: @ssub_x_lt2_min(370; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])371; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1372; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0373; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], -1374; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128375; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]376; CHECK-NEXT: ret i8 [[R]]377;378 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)379 %o = extractvalue { i8, i1 } %ao, 1380 %a = extractvalue { i8, i1 } %ao, 0381 %c = icmp slt i8 %x, -1382 %s = select i1 %c, i8 127, i8 -128383 %r = select i1 %o, i8 %s, i8 %a384 ret i8 %r385}386 387define i8 @ssub_x_lt2_max(i8 %x, i8 %y) {388; CHECK-LABEL: @ssub_x_lt2_max(389; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])390; CHECK-NEXT: ret i8 [[R]]391;392 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)393 %o = extractvalue { i8, i1 } %ao, 1394 %a = extractvalue { i8, i1 } %ao, 0395 %c = icmp slt i8 %x, -1396 %s = select i1 %c, i8 -128, i8 127397 %r = select i1 %o, i8 %s, i8 %a398 ret i8 %r399}400 401define i8 @ssub_x_gt_min(i8 %x, i8 %y) {402; CHECK-LABEL: @ssub_x_gt_min(403; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])404; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1405; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0406; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0407; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128408; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]409; CHECK-NEXT: ret i8 [[R]]410;411 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)412 %o = extractvalue { i8, i1 } %ao, 1413 %a = extractvalue { i8, i1 } %ao, 0414 %c = icmp sgt i8 %x, 0415 %s = select i1 %c, i8 127, i8 -128416 %r = select i1 %o, i8 %s, i8 %a417 ret i8 %r418}419 420define i8 @ssub_x_gt_max(i8 %x, i8 %y) {421; CHECK-LABEL: @ssub_x_gt_max(422; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])423; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1424; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0425; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0426; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127427; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]428; CHECK-NEXT: ret i8 [[R]]429;430 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)431 %o = extractvalue { i8, i1 } %ao, 1432 %a = extractvalue { i8, i1 } %ao, 0433 %c = icmp sgt i8 %x, 0434 %s = select i1 %c, i8 -128, i8 127435 %r = select i1 %o, i8 %s, i8 %a436 ret i8 %r437}438 439define i8 @ssub_x_ge_min(i8 %x, i8 %y) {440; CHECK-LABEL: @ssub_x_ge_min(441; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])442; CHECK-NEXT: ret i8 [[R]]443;444 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)445 %o = extractvalue { i8, i1 } %ao, 1446 %a = extractvalue { i8, i1 } %ao, 0447 %c = icmp sge i8 %x, 0448 %s = select i1 %c, i8 127, i8 -128449 %r = select i1 %o, i8 %s, i8 %a450 ret i8 %r451}452 453define i8 @ssub_x_ge_max(i8 %x, i8 %y) {454; CHECK-LABEL: @ssub_x_ge_max(455; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])456; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1457; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0458; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1459; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127460; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]461; CHECK-NEXT: ret i8 [[R]]462;463 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)464 %o = extractvalue { i8, i1 } %ao, 1465 %a = extractvalue { i8, i1 } %ao, 0466 %c = icmp sge i8 %x, 0467 %s = select i1 %c, i8 -128, i8 127468 %r = select i1 %o, i8 %s, i8 %a469 ret i8 %r470}471 472define i8 @ssub_x_gt2_min(i8 %x, i8 %y) {473; CHECK-LABEL: @ssub_x_gt2_min(474; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])475; CHECK-NEXT: ret i8 [[R]]476;477 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)478 %o = extractvalue { i8, i1 } %ao, 1479 %a = extractvalue { i8, i1 } %ao, 0480 %c = icmp sgt i8 %x, -2481 %s = select i1 %c, i8 127, i8 -128482 %r = select i1 %o, i8 %s, i8 %a483 ret i8 %r484}485 486define i8 @ssub_x_gt2_max(i8 %x, i8 %y) {487; CHECK-LABEL: @ssub_x_gt2_max(488; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])489; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1490; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0491; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -2492; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127493; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]494; CHECK-NEXT: ret i8 [[R]]495;496 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)497 %o = extractvalue { i8, i1 } %ao, 1498 %a = extractvalue { i8, i1 } %ao, 0499 %c = icmp sgt i8 %x, -2500 %s = select i1 %c, i8 -128, i8 127501 %r = select i1 %o, i8 %s, i8 %a502 ret i8 %r503}504 505 506define i8 @ssub_y_lt_min(i8 %x, i8 %y) {507; CHECK-LABEL: @ssub_y_lt_min(508; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])509; CHECK-NEXT: ret i8 [[R]]510;511 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)512 %o = extractvalue { i8, i1 } %ao, 1513 %a = extractvalue { i8, i1 } %ao, 0514 %c = icmp slt i8 %y, 0515 %s = select i1 %c, i8 127, i8 -128516 %r = select i1 %o, i8 %s, i8 %a517 ret i8 %r518}519 520define i8 @ssub_y_lt_max(i8 %x, i8 %y) {521; CHECK-LABEL: @ssub_y_lt_max(522; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])523; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1524; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0525; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0526; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127527; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]528; CHECK-NEXT: ret i8 [[R]]529;530 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)531 %o = extractvalue { i8, i1 } %ao, 1532 %a = extractvalue { i8, i1 } %ao, 0533 %c = icmp slt i8 %y, 0534 %s = select i1 %c, i8 -128, i8 127535 %r = select i1 %o, i8 %s, i8 %a536 ret i8 %r537}538 539define i8 @ssub_y_le_min(i8 %x, i8 %y) {540; CHECK-LABEL: @ssub_y_le_min(541; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])542; CHECK-NEXT: ret i8 [[R]]543;544 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)545 %o = extractvalue { i8, i1 } %ao, 1546 %a = extractvalue { i8, i1 } %ao, 0547 %c = icmp sle i8 %y, 0548 %s = select i1 %c, i8 127, i8 -128549 %r = select i1 %o, i8 %s, i8 %a550 ret i8 %r551}552 553define i8 @ssub_y_le_max(i8 %x, i8 %y) {554; CHECK-LABEL: @ssub_y_le_max(555; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])556; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1557; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0558; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1559; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127560; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]561; CHECK-NEXT: ret i8 [[R]]562;563 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)564 %o = extractvalue { i8, i1 } %ao, 1565 %a = extractvalue { i8, i1 } %ao, 0566 %c = icmp sle i8 %y, 0567 %s = select i1 %c, i8 -128, i8 127568 %r = select i1 %o, i8 %s, i8 %a569 ret i8 %r570}571 572define i8 @ssub_y_gt_min(i8 %x, i8 %y) {573; CHECK-LABEL: @ssub_y_gt_min(574; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])575; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1576; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0577; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0578; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128579; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]580; CHECK-NEXT: ret i8 [[R]]581;582 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)583 %o = extractvalue { i8, i1 } %ao, 1584 %a = extractvalue { i8, i1 } %ao, 0585 %c = icmp sgt i8 %y, 0586 %s = select i1 %c, i8 127, i8 -128587 %r = select i1 %o, i8 %s, i8 %a588 ret i8 %r589}590 591define i8 @ssub_y_gt_max(i8 %x, i8 %y) {592; CHECK-LABEL: @ssub_y_gt_max(593; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])594; CHECK-NEXT: ret i8 [[R]]595;596 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)597 %o = extractvalue { i8, i1 } %ao, 1598 %a = extractvalue { i8, i1 } %ao, 0599 %c = icmp sgt i8 %y, 0600 %s = select i1 %c, i8 -128, i8 127601 %r = select i1 %o, i8 %s, i8 %a602 ret i8 %r603}604 605define i8 @ssub_y_ge_min(i8 %x, i8 %y) {606; CHECK-LABEL: @ssub_y_ge_min(607; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])608; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1609; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0610; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1611; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128612; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]]613; CHECK-NEXT: ret i8 [[R]]614;615 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)616 %o = extractvalue { i8, i1 } %ao, 1617 %a = extractvalue { i8, i1 } %ao, 0618 %c = icmp sge i8 %y, 0619 %s = select i1 %c, i8 127, i8 -128620 %r = select i1 %o, i8 %s, i8 %a621 ret i8 %r622}623 624define i8 @ssub_y_ge_max(i8 %x, i8 %y) {625; CHECK-LABEL: @ssub_y_ge_max(626; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])627; CHECK-NEXT: ret i8 [[R]]628;629 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)630 %o = extractvalue { i8, i1 } %ao, 1631 %a = extractvalue { i8, i1 } %ao, 0632 %c = icmp sge i8 %y, 0633 %s = select i1 %c, i8 -128, i8 127634 %r = select i1 %o, i8 %s, i8 %a635 ret i8 %r636}637 638 639define i32 @sadd_i32(i32 %x, i32 %y) {640; CHECK-LABEL: @sadd_i32(641; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])642; CHECK-NEXT: ret i32 [[R]]643;644 %ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)645 %o = extractvalue { i32, i1 } %ao, 1646 %a = extractvalue { i32, i1 } %ao, 0647 %c = icmp slt i32 %x, 0648 %s = select i1 %c, i32 -2147483648, i32 2147483647649 %r = select i1 %o, i32 %s, i32 %a650 ret i32 %r651}652 653define i32 @ssub_i32(i32 %x, i32 %y) {654; CHECK-LABEL: @ssub_i32(655; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])656; CHECK-NEXT: ret i32 [[R]]657;658 %ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)659 %o = extractvalue { i32, i1 } %ao, 1660 %a = extractvalue { i32, i1 } %ao, 0661 %c = icmp slt i32 %x, 0662 %s = select i1 %c, i32 -2147483648, i32 2147483647663 %r = select i1 %o, i32 %s, i32 %a664 ret i32 %r665}666 667define i32 @sadd_bounds(i32 %x, i32 %y) {668; CHECK-LABEL: @sadd_bounds(669; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])670; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1671; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0672; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0673; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -128, i32 127674; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]675; CHECK-NEXT: ret i32 [[R]]676;677 %ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)678 %o = extractvalue { i32, i1 } %ao, 1679 %a = extractvalue { i32, i1 } %ao, 0680 %c = icmp slt i32 %x, 0681 %s = select i1 %c, i32 -128, i32 127682 %r = select i1 %o, i32 %s, i32 %a683 ret i32 %r684}685 686define i32 @ssub_bounds(i32 %x, i32 %y) {687; CHECK-LABEL: @ssub_bounds(688; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])689; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1690; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0691; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0692; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -128, i32 127693; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]]694; CHECK-NEXT: ret i32 [[R]]695;696 %ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)697 %o = extractvalue { i32, i1 } %ao, 1698 %a = extractvalue { i32, i1 } %ao, 0699 %c = icmp slt i32 %x, 0700 %s = select i1 %c, i32 -128, i32 127701 %r = select i1 %o, i32 %s, i32 %a702 ret i32 %r703}704 705declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %0, i32 %1)706declare { i32, i1 } @llvm.usub.with.overflow.i32(i32 %0, i32 %1)707declare { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %0, i8 %1)708declare { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %0, i8 %1)709declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %0, i32 %1)710declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %0, i32 %1)711