xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-sat-addsub.ll (revision 877cb9a2edc9057d70321e436e5ea8ccc1a87140)
11e963b40SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
21e963b40SNoah Goldstein; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
31e963b40SNoah Goldstein
41e963b40SNoah Goldsteindeclare i8 @llvm.sadd.sat.i8(i8, i8)
51e963b40SNoah Goldsteindeclare i8 @llvm.ssub.sat.i8(i8, i8)
61e963b40SNoah Goldsteindeclare i8 @llvm.uadd.sat.i8(i8, i8)
71e963b40SNoah Goldsteindeclare i8 @llvm.usub.sat.i8(i8, i8)
81e963b40SNoah Goldstein
91e963b40SNoah Goldsteindefine i1 @uadd_sat_overflow(i8 %x, i8 %y) {
101e963b40SNoah Goldstein; CHECK-LABEL: @uadd_sat_overflow(
118a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
121e963b40SNoah Goldstein;
131e963b40SNoah Goldstein  %lhs = or i8 %x, 128
141e963b40SNoah Goldstein  %rhs = or i8 %y, 128
151e963b40SNoah Goldstein  %exp = call i8 @llvm.uadd.sat.i8(i8 %lhs, i8 %rhs)
161e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 254
171e963b40SNoah Goldstein  ret i1 %r
181e963b40SNoah Goldstein}
191e963b40SNoah Goldstein
201e963b40SNoah Goldsteindefine i1 @uadd_sat_overflow_fail(i8 %x, i8 %y) {
211e963b40SNoah Goldstein; CHECK-LABEL: @uadd_sat_overflow_fail(
221e963b40SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = or i8 [[X:%.*]], -128
231e963b40SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = or i8 [[Y:%.*]], 126
241e963b40SNoah Goldstein; CHECK-NEXT:    [[EXP:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[LHS]], i8 [[RHS]])
251e963b40SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[EXP]], -2
261e963b40SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
271e963b40SNoah Goldstein;
281e963b40SNoah Goldstein  %lhs = or i8 %x, 128
291e963b40SNoah Goldstein  %rhs = or i8 %y, 126
301e963b40SNoah Goldstein  %exp = call i8 @llvm.uadd.sat.i8(i8 %lhs, i8 %rhs)
311e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 254
321e963b40SNoah Goldstein  ret i1 %r
331e963b40SNoah Goldstein}
341e963b40SNoah Goldstein
351e963b40SNoah Goldsteindefine i1 @usub_sat_overflow(i8 %x, i8 %y) {
361e963b40SNoah Goldstein; CHECK-LABEL: @usub_sat_overflow(
378a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
381e963b40SNoah Goldstein;
391e963b40SNoah Goldstein  %lhs = and i8 %x, 127
401e963b40SNoah Goldstein  %rhs = or i8 %y, 128
411e963b40SNoah Goldstein  %exp = call i8 @llvm.usub.sat.i8(i8 %lhs, i8 %rhs)
421e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 1
431e963b40SNoah Goldstein  ret i1 %r
441e963b40SNoah Goldstein}
451e963b40SNoah Goldstein
461e963b40SNoah Goldsteindefine i1 @usub_sat_overflow_fail(i8 %x, i8 %y) {
471e963b40SNoah Goldstein; CHECK-LABEL: @usub_sat_overflow_fail(
481e963b40SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = and i8 [[X:%.*]], 127
491e963b40SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = or i8 [[Y:%.*]], 126
501e963b40SNoah Goldstein; CHECK-NEXT:    [[EXP:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[LHS]], i8 [[RHS]])
511e963b40SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[EXP]], 1
521e963b40SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
531e963b40SNoah Goldstein;
541e963b40SNoah Goldstein  %lhs = and i8 %x, 127
551e963b40SNoah Goldstein  %rhs = or i8 %y, 126
561e963b40SNoah Goldstein  %exp = call i8 @llvm.usub.sat.i8(i8 %lhs, i8 %rhs)
571e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 1
581e963b40SNoah Goldstein  ret i1 %r
591e963b40SNoah Goldstein}
601e963b40SNoah Goldstein
611e963b40SNoah Goldsteindefine i1 @sadd_sat_overflow_pos(i8 %x, i8 %y) {
621e963b40SNoah Goldstein; CHECK-LABEL: @sadd_sat_overflow_pos(
638a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
641e963b40SNoah Goldstein;
651e963b40SNoah Goldstein  %xx = and i8 %x, 127
661e963b40SNoah Goldstein  %yy = and i8 %y, 127
671e963b40SNoah Goldstein  %lhs = or i8 %xx, 64
681e963b40SNoah Goldstein  %rhs = or i8 %yy, 65
691e963b40SNoah Goldstein  %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
701e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 128
711e963b40SNoah Goldstein  ret i1 %r
721e963b40SNoah Goldstein}
731e963b40SNoah Goldstein
741e963b40SNoah Goldsteindefine i1 @sadd_sat_low_bits(i8 %x, i8 %y) {
751e963b40SNoah Goldstein; CHECK-LABEL: @sadd_sat_low_bits(
768a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
771e963b40SNoah Goldstein;
781e963b40SNoah Goldstein  %xx = and i8 %x, 15
791e963b40SNoah Goldstein  %yy = and i8 %y, 15
801e963b40SNoah Goldstein  %lhs = or i8 %xx, 1
811e963b40SNoah Goldstein  %rhs = and i8 %yy, -2
821e963b40SNoah Goldstein  %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
831e963b40SNoah Goldstein  %and = and i8 %exp, 1
841e963b40SNoah Goldstein  %r = icmp eq i8 %and, 0
851e963b40SNoah Goldstein  ret i1 %r
861e963b40SNoah Goldstein}
871e963b40SNoah Goldstein
881e963b40SNoah Goldsteindefine i1 @sadd_sat_fail_may_overflow(i8 %x, i8 %y) {
891e963b40SNoah Goldstein; CHECK-LABEL: @sadd_sat_fail_may_overflow(
901e963b40SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = or i8 [[X:%.*]], 1
911e963b40SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = and i8 [[Y:%.*]], -2
921e963b40SNoah Goldstein; CHECK-NEXT:    [[EXP:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[LHS]], i8 [[RHS]])
931e963b40SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[EXP]], 1
941e963b40SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
951e963b40SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
961e963b40SNoah Goldstein;
971e963b40SNoah Goldstein  %lhs = or i8 %x, 1
981e963b40SNoah Goldstein  %rhs = and i8 %y, -2
991e963b40SNoah Goldstein  %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
1001e963b40SNoah Goldstein  %and = and i8 %exp, 1
1011e963b40SNoah Goldstein  %r = icmp eq i8 %and, 0
1021e963b40SNoah Goldstein  ret i1 %r
1031e963b40SNoah Goldstein}
1041e963b40SNoah Goldstein
1051e963b40SNoah Goldsteindefine i1 @sadd_sat_overflow_neg(i8 %x, i8 %y) {
1061e963b40SNoah Goldstein; CHECK-LABEL: @sadd_sat_overflow_neg(
1078a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
1081e963b40SNoah Goldstein;
1091e963b40SNoah Goldstein  %lhs = or i8 %x, 192
1101e963b40SNoah Goldstein  %rhs = or i8 %y, 191
1111e963b40SNoah Goldstein  %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
1121e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 127
1131e963b40SNoah Goldstein  ret i1 %r
1141e963b40SNoah Goldstein}
1151e963b40SNoah Goldstein
1161e963b40SNoah Goldsteindefine i1 @ssub_sat_overflow_neg(i8 %x, i8 %y) {
1171e963b40SNoah Goldstein; CHECK-LABEL: @ssub_sat_overflow_neg(
1188a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
1191e963b40SNoah Goldstein;
1201e963b40SNoah Goldstein  %xx = and i8 %x, 112
1211e963b40SNoah Goldstein  %yy = and i8 %y, 127
1221e963b40SNoah Goldstein  %lhs = or i8 %xx, 128
1231e963b40SNoah Goldstein  %rhs = or i8 %yy, 126
1241e963b40SNoah Goldstein  %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
1251e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 32
1261e963b40SNoah Goldstein  ret i1 %r
1271e963b40SNoah Goldstein}
1281e963b40SNoah Goldstein
1291e963b40SNoah Goldsteindefine i1 @ssub_sat_low_bits(i8 %x, i8 %y) {
1301e963b40SNoah Goldstein; CHECK-LABEL: @ssub_sat_low_bits(
1318a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
1321e963b40SNoah Goldstein;
1331e963b40SNoah Goldstein  %xx = and i8 %x, 15
1341e963b40SNoah Goldstein  %yy = and i8 %y, 15
1351e963b40SNoah Goldstein  %lhs = or i8 %xx, 17
1361e963b40SNoah Goldstein  %rhs = and i8 %yy, -2
1371e963b40SNoah Goldstein  %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
1381e963b40SNoah Goldstein  %and = and i8 %exp, 1
1391e963b40SNoah Goldstein  %r = icmp eq i8 %and, 0
1401e963b40SNoah Goldstein  ret i1 %r
1411e963b40SNoah Goldstein}
1421e963b40SNoah Goldstein
1431e963b40SNoah Goldsteindefine i1 @ssub_sat_fail_may_overflow(i8 %x, i8 %y) {
1441e963b40SNoah Goldstein; CHECK-LABEL: @ssub_sat_fail_may_overflow(
145*877cb9a2Sgoldsteinn; CHECK-NEXT:    ret i1 false
1461e963b40SNoah Goldstein;
1471e963b40SNoah Goldstein  %xx = and i8 %x, 15
1481e963b40SNoah Goldstein  %yy = and i8 %y, 15
1491e963b40SNoah Goldstein  %lhs = or i8 %xx, 1
1501e963b40SNoah Goldstein  %rhs = and i8 %yy, -2
1511e963b40SNoah Goldstein  %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
1521e963b40SNoah Goldstein  %and = and i8 %exp, 1
1531e963b40SNoah Goldstein  %r = icmp eq i8 %and, 0
1541e963b40SNoah Goldstein  ret i1 %r
1551e963b40SNoah Goldstein}
1561e963b40SNoah Goldstein
1571e963b40SNoah Goldsteindefine i1 @ssub_sat_overflow_pos(i8 %x, i8 %y) {
1581e963b40SNoah Goldstein; CHECK-LABEL: @ssub_sat_overflow_pos(
1598a60814eSNoah Goldstein; CHECK-NEXT:    ret i1 false
1601e963b40SNoah Goldstein;
1611e963b40SNoah Goldstein  %xx = and i8 %x, 24
1621e963b40SNoah Goldstein  %yy = and i8 %y, 3
1631e963b40SNoah Goldstein  %lhs = or i8 %xx, 8
1641e963b40SNoah Goldstein  %rhs = or i8 %yy, 128
1651e963b40SNoah Goldstein  %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
1661e963b40SNoah Goldstein  %r = icmp eq i8 %exp, 128
1671e963b40SNoah Goldstein  ret i1 %r
1681e963b40SNoah Goldstein}
169