@@ -1406,25 +1406,17 @@ static std::optional<Instruction *> instCombineSVEAllActive(IntrinsicInst &II,
1406
1406
return &II;
1407
1407
}
1408
1408
1409
- // Optimize operations that take an all false predicate or send them for
1410
- // canonicalization.
1409
+ // Simplify operations where predicate has all inactive lanes or try to replace
1410
+ // with _u form when all lanes are active
1411
1411
static std::optional<Instruction *>
1412
1412
instCombineSVEAllOrNoActive (InstCombiner &IC, IntrinsicInst &II,
1413
1413
Intrinsic::ID IID) {
1414
1414
if (match (II.getOperand (0 ), m_ZeroInt ())) {
1415
- if (II.getIntrinsicID () != IID) {
1416
- // llvm_ir, pred(0), op1, op2 - Spec says to return op1 when all lanes are
1417
- // inactive for sv[func]_m or sv[func]_z
1418
- return IC.replaceInstUsesWith (II, II.getOperand (1 ));
1419
- } else {
1420
- // llvm_ir_u, pred(0), op1, op2 - Spec says to return undef when all lanes
1421
- // are inactive for sv[func]_x
1422
- return IC.replaceInstUsesWith (II, UndefValue::get (II.getType ()));
1423
- }
1415
+ // llvm_ir, pred(0), op1, op2 - Spec says to return op1 when all lanes are
1416
+ // inactive for sv[func]_m or sv[func]_z
1417
+ return IC.replaceInstUsesWith (II, II.getOperand (1 ));
1424
1418
}
1425
- if (II.getIntrinsicID () != IID)
1426
- return instCombineSVEAllActive (II, IID);
1427
- return std::nullopt;
1419
+ return instCombineSVEAllActive (II, IID);
1428
1420
}
1429
1421
1430
1422
static std::optional<Instruction *> instCombineSVEVectorAdd (InstCombiner &IC,
@@ -1443,18 +1435,6 @@ static std::optional<Instruction *> instCombineSVEVectorAdd(InstCombiner &IC,
1443
1435
return std::nullopt;
1444
1436
}
1445
1437
1446
- static std::optional<Instruction *>
1447
- instCombineSVEVectorAddU (InstCombiner &IC, IntrinsicInst &II) {
1448
- if (auto II_U =
1449
- instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_add_u))
1450
- return II_U;
1451
- else {
1452
- return instCombineSVEVectorFuseMulAddSub<Intrinsic::aarch64_sve_mul_u,
1453
- Intrinsic::aarch64_sve_mla_u>(
1454
- IC, II, true );
1455
- }
1456
- }
1457
-
1458
1438
static std::optional<Instruction *>
1459
1439
instCombineSVEVectorFAdd (InstCombiner &IC, IntrinsicInst &II) {
1460
1440
if (auto II_U =
@@ -1480,9 +1460,6 @@ instCombineSVEVectorFAdd(InstCombiner &IC, IntrinsicInst &II) {
1480
1460
1481
1461
static std::optional<Instruction *>
1482
1462
instCombineSVEVectorFAddU (InstCombiner &IC, IntrinsicInst &II) {
1483
- if (auto II_U =
1484
- instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fadd_u))
1485
- return II_U;
1486
1463
if (auto FMLA =
1487
1464
instCombineSVEVectorFuseMulAddSub<Intrinsic::aarch64_sve_fmul,
1488
1465
Intrinsic::aarch64_sve_fmla>(IC, II,
@@ -1526,9 +1503,6 @@ instCombineSVEVectorFSub(InstCombiner &IC, IntrinsicInst &II) {
1526
1503
1527
1504
static std::optional<Instruction *>
1528
1505
instCombineSVEVectorFSubU (InstCombiner &IC, IntrinsicInst &II) {
1529
- if (auto II_U =
1530
- instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fsub_u))
1531
- return II_U;
1532
1506
if (auto FMLS =
1533
1507
instCombineSVEVectorFuseMulAddSub<Intrinsic::aarch64_sve_fmul,
1534
1508
Intrinsic::aarch64_sve_fmls>(IC, II,
@@ -1559,27 +1533,16 @@ static std::optional<Instruction *> instCombineSVEVectorSub(InstCombiner &IC,
1559
1533
return std::nullopt;
1560
1534
}
1561
1535
1562
- static std::optional<Instruction *>
1563
- instCombineSVEVectorSubU (InstCombiner &IC, IntrinsicInst &II) {
1564
- if (auto II_U =
1565
- instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_sub_u))
1566
- return II_U;
1567
- else {
1568
- return instCombineSVEVectorFuseMulAddSub<Intrinsic::aarch64_sve_mul_u,
1569
- Intrinsic::aarch64_sve_mls_u>(
1570
- IC, II, true );
1571
- }
1572
- }
1573
-
1574
1536
static std::optional<Instruction *> instCombineSVEVectorMul (InstCombiner &IC,
1575
1537
IntrinsicInst &II,
1576
1538
Intrinsic::ID IID) {
1577
1539
auto *OpPredicate = II.getOperand (0 );
1578
1540
auto *OpMultiplicand = II.getOperand (1 );
1579
1541
auto *OpMultiplier = II.getOperand (2 );
1580
1542
1581
- if (auto II_U = instCombineSVEAllOrNoActive (IC, II, IID))
1582
- return II_U;
1543
+ if (II.getIntrinsicID () != IID)
1544
+ if (auto II_U = instCombineSVEAllOrNoActive (IC, II, IID))
1545
+ return II_U;
1583
1546
1584
1547
// Return true if a given instruction is a unit splat value, false otherwise.
1585
1548
auto IsUnitSplat = [](auto *I) {
@@ -1944,44 +1907,33 @@ AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC,
1944
1907
case Intrinsic::aarch64_sve_ptest_last:
1945
1908
return instCombineSVEPTest (IC, II);
1946
1909
case Intrinsic::aarch64_sve_fabd:
1947
- case Intrinsic::aarch64_sve_fabd_u:
1948
1910
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fabd_u);
1949
1911
case Intrinsic::aarch64_sve_fadd:
1950
1912
return instCombineSVEVectorFAdd (IC, II);
1951
1913
case Intrinsic::aarch64_sve_fadd_u:
1952
1914
return instCombineSVEVectorFAddU (IC, II);
1953
1915
case Intrinsic::aarch64_sve_fdiv:
1954
- case Intrinsic::aarch64_sve_fdiv_u:
1955
1916
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fdiv_u);
1956
1917
case Intrinsic::aarch64_sve_fmax:
1957
- case Intrinsic::aarch64_sve_fmax_u:
1958
1918
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fmax_u);
1959
1919
case Intrinsic::aarch64_sve_fmaxnm:
1960
- case Intrinsic::aarch64_sve_fmaxnm_u:
1961
1920
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fmaxnm_u);
1962
1921
case Intrinsic::aarch64_sve_fmin:
1963
- case Intrinsic::aarch64_sve_fmin_u:
1964
1922
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fmin_u);
1965
1923
case Intrinsic::aarch64_sve_fminnm:
1966
- case Intrinsic::aarch64_sve_fminnm_u:
1967
1924
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fminnm_u);
1968
1925
case Intrinsic::aarch64_sve_fmla:
1969
- case Intrinsic::aarch64_sve_fmla_u:
1970
1926
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fmla_u);
1971
1927
case Intrinsic::aarch64_sve_fmls:
1972
- case Intrinsic::aarch64_sve_fmls_u:
1973
1928
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fmls_u);
1974
1929
case Intrinsic::aarch64_sve_fmul:
1975
1930
case Intrinsic::aarch64_sve_fmul_u:
1976
1931
return instCombineSVEVectorMul (IC, II, Intrinsic::aarch64_sve_fmul_u);
1977
1932
case Intrinsic::aarch64_sve_fmulx:
1978
- case Intrinsic::aarch64_sve_fmulx_u:
1979
1933
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fmulx_u);
1980
1934
case Intrinsic::aarch64_sve_fnmla:
1981
- case Intrinsic::aarch64_sve_fnmla_u:
1982
1935
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fnmla_u);
1983
1936
case Intrinsic::aarch64_sve_fnmls:
1984
- case Intrinsic::aarch64_sve_fnmls_u:
1985
1937
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_fnmls_u);
1986
1938
case Intrinsic::aarch64_sve_fsub:
1987
1939
return instCombineSVEVectorFSub (IC, II);
@@ -1990,70 +1942,55 @@ AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC,
1990
1942
case Intrinsic::aarch64_sve_add:
1991
1943
return instCombineSVEVectorAdd (IC, II);
1992
1944
case Intrinsic::aarch64_sve_add_u:
1993
- return instCombineSVEVectorAddU (IC, II);
1945
+ return instCombineSVEVectorFuseMulAddSub<Intrinsic::aarch64_sve_mul_u,
1946
+ Intrinsic::aarch64_sve_mla_u>(
1947
+ IC, II, true );
1994
1948
case Intrinsic::aarch64_sve_mla:
1995
- case Intrinsic::aarch64_sve_mla_u:
1996
1949
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_mla_u);
1997
1950
case Intrinsic::aarch64_sve_mls:
1998
- case Intrinsic::aarch64_sve_mls_u:
1999
1951
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_mls_u);
2000
1952
case Intrinsic::aarch64_sve_mul:
2001
1953
case Intrinsic::aarch64_sve_mul_u:
2002
1954
return instCombineSVEVectorMul (IC, II, Intrinsic::aarch64_sve_mul_u);
2003
1955
case Intrinsic::aarch64_sve_sabd:
2004
- case Intrinsic::aarch64_sve_sabd_u:
2005
1956
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_sabd_u);
2006
1957
case Intrinsic::aarch64_sve_smax:
2007
- case Intrinsic::aarch64_sve_smax_u:
2008
1958
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_smax_u);
2009
1959
case Intrinsic::aarch64_sve_smin:
2010
- case Intrinsic::aarch64_sve_smin_u:
2011
1960
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_smin_u);
2012
1961
case Intrinsic::aarch64_sve_smulh:
2013
- case Intrinsic::aarch64_sve_smulh_u:
2014
1962
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_smulh_u);
2015
1963
case Intrinsic::aarch64_sve_sub:
2016
1964
return instCombineSVEVectorSub (IC, II);
2017
1965
case Intrinsic::aarch64_sve_sub_u:
2018
- return instCombineSVEVectorSubU (IC, II);
1966
+ return instCombineSVEVectorFuseMulAddSub<Intrinsic::aarch64_sve_mul_u,
1967
+ Intrinsic::aarch64_sve_mls_u>(
1968
+ IC, II, true );
2019
1969
case Intrinsic::aarch64_sve_uabd:
2020
- case Intrinsic::aarch64_sve_uabd_u:
2021
1970
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_uabd_u);
2022
1971
case Intrinsic::aarch64_sve_umax:
2023
- case Intrinsic::aarch64_sve_umax_u:
2024
1972
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_umax_u);
2025
1973
case Intrinsic::aarch64_sve_umin:
2026
- case Intrinsic::aarch64_sve_umin_u:
2027
1974
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_umin_u);
2028
1975
case Intrinsic::aarch64_sve_umulh:
2029
- case Intrinsic::aarch64_sve_umulh_u:
2030
1976
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_umulh_u);
2031
1977
case Intrinsic::aarch64_sve_asr:
2032
- case Intrinsic::aarch64_sve_asr_u:
2033
1978
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_asr_u);
2034
1979
case Intrinsic::aarch64_sve_lsl:
2035
- case Intrinsic::aarch64_sve_lsl_u:
2036
1980
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_lsl_u);
2037
1981
case Intrinsic::aarch64_sve_lsr:
2038
- case Intrinsic::aarch64_sve_lsr_u:
2039
1982
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_lsr_u);
2040
1983
case Intrinsic::aarch64_sve_and:
2041
- case Intrinsic::aarch64_sve_and_u:
2042
1984
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_and_u);
2043
1985
case Intrinsic::aarch64_sve_bic:
2044
- case Intrinsic::aarch64_sve_bic_u:
2045
1986
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_bic_u);
2046
1987
case Intrinsic::aarch64_sve_eor:
2047
- case Intrinsic::aarch64_sve_eor_u:
2048
1988
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_eor_u);
2049
1989
case Intrinsic::aarch64_sve_orr:
2050
- case Intrinsic::aarch64_sve_orr_u:
2051
1990
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_orr_u);
2052
1991
case Intrinsic::aarch64_sve_sqsub:
2053
- case Intrinsic::aarch64_sve_sqsub_u:
2054
1992
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_sqsub_u);
2055
1993
case Intrinsic::aarch64_sve_uqsub:
2056
- case Intrinsic::aarch64_sve_uqsub_u:
2057
1994
return instCombineSVEAllOrNoActive (IC, II, Intrinsic::aarch64_sve_uqsub_u);
2058
1995
case Intrinsic::aarch64_sve_tbl:
2059
1996
return instCombineSVETBL (IC, II);
0 commit comments