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