brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.8 KiB · 568ac77 Raw
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