@@ -316,8 +316,7 @@ define i32 @test73(i32 %x) {
316316; SMAX(SMAX(X, 36), 75) -> SMAX(X, 75)
317317define i32 @test74 (i32 %x ) {
318318; CHECK-LABEL: @test74(
319- ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 36)
320- ; CHECK-NEXT: [[RETVAL:%.*]] = call i32 @llvm.umax.i32(i32 [[COND]], i32 75)
319+ ; CHECK-NEXT: [[RETVAL:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 75)
321320; CHECK-NEXT: ret i32 [[RETVAL]]
322321;
323322 %cmp = icmp slt i32 %x , 36
@@ -1419,3 +1418,127 @@ entry:
14191418 %r = select i1 %cmp2 , i32 %s1 , i32 %k1
14201419 ret i32 %r
14211420}
1421+
1422+ define i32 @test_umax_smax1 (i32 %x ) {
1423+ ; CHECK-LABEL: @test_umax_smax1(
1424+ ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 1)
1425+ ; CHECK-NEXT: ret i32 [[UMAX]]
1426+ ;
1427+ %smax = call i32 @llvm.smax.i32 (i32 %x , i32 0 )
1428+ %umax = call i32 @llvm.umax.i32 (i32 %smax , i32 1 )
1429+ ret i32 %umax
1430+ }
1431+
1432+ define i32 @test_umax_smax2 (i32 %x ) {
1433+ ; CHECK-LABEL: @test_umax_smax2(
1434+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 20)
1435+ ; CHECK-NEXT: ret i32 [[SMAX]]
1436+ ;
1437+ %smax = call i32 @llvm.smax.i32 (i32 %x , i32 20 )
1438+ %umax = call i32 @llvm.umax.i32 (i32 %smax , i32 10 )
1439+ ret i32 %umax
1440+ }
1441+
1442+ define <2 x i32 > @test_umax_smax_vec (<2 x i32 > %x ) {
1443+ ; CHECK-LABEL: @test_umax_smax_vec(
1444+ ; CHECK-NEXT: [[UMAX:%.*]] = call <2 x i32> @llvm.smax.v2i32(<2 x i32> [[X:%.*]], <2 x i32> <i32 1, i32 20>)
1445+ ; CHECK-NEXT: ret <2 x i32> [[UMAX]]
1446+ ;
1447+ %smax = call <2 x i32 > @llvm.smax.v2i32 (<2 x i32 > %x , <2 x i32 > <i32 0 , i32 20 >)
1448+ %umax = call <2 x i32 > @llvm.umax.v2i32 (<2 x i32 > %smax , <2 x i32 > <i32 1 , i32 10 >)
1449+ ret <2 x i32 > %umax
1450+ }
1451+
1452+ define i32 @test_smin_umin1 (i32 %x ) {
1453+ ; CHECK-LABEL: @test_smin_umin1(
1454+ ; CHECK-NEXT: [[SMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 10)
1455+ ; CHECK-NEXT: ret i32 [[SMIN]]
1456+ ;
1457+ %smin = call i32 @llvm.umin.i32 (i32 %x , i32 10 )
1458+ %umin = call i32 @llvm.smin.i32 (i32 %smin , i32 20 )
1459+ ret i32 %umin
1460+ }
1461+
1462+ define i32 @test_smin_umin2 (i32 %x ) {
1463+ ; CHECK-LABEL: @test_smin_umin2(
1464+ ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 10)
1465+ ; CHECK-NEXT: ret i32 [[UMIN]]
1466+ ;
1467+ %smin = call i32 @llvm.umin.i32 (i32 %x , i32 20 )
1468+ %umin = call i32 @llvm.smin.i32 (i32 %smin , i32 10 )
1469+ ret i32 %umin
1470+ }
1471+
1472+ define <2 x i32 > @test_smin_umin_vec (<2 x i32 > %x ) {
1473+ ; CHECK-LABEL: @test_smin_umin_vec(
1474+ ; CHECK-NEXT: [[UMIN:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[X:%.*]], <2 x i32> <i32 10, i32 10>)
1475+ ; CHECK-NEXT: ret <2 x i32> [[UMIN]]
1476+ ;
1477+ %smin = call <2 x i32 > @llvm.umin.v2i32 (<2 x i32 > %x , <2 x i32 > <i32 10 , i32 20 >)
1478+ %umin = call <2 x i32 > @llvm.smin.v2i32 (<2 x i32 > %smin , <2 x i32 > <i32 20 , i32 10 >)
1479+ ret <2 x i32 > %umin
1480+ }
1481+
1482+ ; Negative tests
1483+
1484+ define i32 @test_umax_smax3 (i32 %x ) {
1485+ ; CHECK-LABEL: @test_umax_smax3(
1486+ ; CHECK-NEXT: ret i32 -1
1487+ ;
1488+ %smax = call i32 @llvm.smax.i32 (i32 %x , i32 0 )
1489+ %umax = call i32 @llvm.umax.i32 (i32 %smax , i32 -1 )
1490+ ret i32 %umax
1491+ }
1492+
1493+ define i32 @test_umax_smax4 (i32 %x ) {
1494+ ; CHECK-LABEL: @test_umax_smax4(
1495+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 -20)
1496+ ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[SMAX]], i32 10)
1497+ ; CHECK-NEXT: ret i32 [[UMAX]]
1498+ ;
1499+ %smax = call i32 @llvm.smax.i32 (i32 %x , i32 -20 )
1500+ %umax = call i32 @llvm.umax.i32 (i32 %smax , i32 10 )
1501+ ret i32 %umax
1502+ }
1503+
1504+ define i32 @test_smin_umin3 (i32 %x ) {
1505+ ; CHECK-LABEL: @test_smin_umin3(
1506+ ; CHECK-NEXT: ret i32 -20
1507+ ;
1508+ %smin = call i32 @llvm.umin.i32 (i32 %x , i32 10 )
1509+ %umin = call i32 @llvm.smin.i32 (i32 %smin , i32 -20 )
1510+ ret i32 %umin
1511+ }
1512+
1513+ define i32 @test_smin_umin4 (i32 %x ) {
1514+ ; CHECK-LABEL: @test_smin_umin4(
1515+ ; CHECK-NEXT: [[SMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 -20)
1516+ ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.smin.i32(i32 [[SMIN]], i32 10)
1517+ ; CHECK-NEXT: ret i32 [[UMIN]]
1518+ ;
1519+ %smin = call i32 @llvm.umin.i32 (i32 %x , i32 -20 )
1520+ %umin = call i32 @llvm.smin.i32 (i32 %smin , i32 10 )
1521+ ret i32 %umin
1522+ }
1523+
1524+ define i32 @test_umax_nonminmax (i32 %x ) {
1525+ ; CHECK-LABEL: @test_umax_nonminmax(
1526+ ; CHECK-NEXT: [[Y:%.*]] = call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0:![0-9]+]]
1527+ ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[Y]], i32 1)
1528+ ; CHECK-NEXT: ret i32 [[UMAX]]
1529+ ;
1530+ %y = call i32 @llvm.ctpop.i32 (i32 %x )
1531+ %umax = call i32 @llvm.umax.i32 (i32 %y , i32 1 )
1532+ ret i32 %umax
1533+ }
1534+
1535+ define <2 x i32 > @test_umax_smax_vec_neg (<2 x i32 > %x ) {
1536+ ; CHECK-LABEL: @test_umax_smax_vec_neg(
1537+ ; CHECK-NEXT: [[SMAX:%.*]] = call <2 x i32> @llvm.smax.v2i32(<2 x i32> [[X:%.*]], <2 x i32> <i32 0, i32 -20>)
1538+ ; CHECK-NEXT: [[UMAX:%.*]] = call <2 x i32> @llvm.umax.v2i32(<2 x i32> [[SMAX]], <2 x i32> <i32 1, i32 10>)
1539+ ; CHECK-NEXT: ret <2 x i32> [[UMAX]]
1540+ ;
1541+ %smax = call <2 x i32 > @llvm.smax.v2i32 (<2 x i32 > %x , <2 x i32 > <i32 0 , i32 -20 >)
1542+ %umax = call <2 x i32 > @llvm.umax.v2i32 (<2 x i32 > %smax , <2 x i32 > <i32 1 , i32 10 >)
1543+ ret <2 x i32 > %umax
1544+ }
0 commit comments