@@ -316,8 +316,7 @@ define i32 @test73(i32 %x) {
316
316
; SMAX(SMAX(X, 36), 75) -> SMAX(X, 75)
317
317
define i32 @test74 (i32 %x ) {
318
318
; 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)
321
320
; CHECK-NEXT: ret i32 [[RETVAL]]
322
321
;
323
322
%cmp = icmp slt i32 %x , 36
@@ -1419,3 +1418,127 @@ entry:
1419
1418
%r = select i1 %cmp2 , i32 %s1 , i32 %k1
1420
1419
ret i32 %r
1421
1420
}
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