@@ -1454,6 +1454,226 @@ define i1 @test_fabs_used_is_fpclass_zero_or_pinf(float %x) {
14541454 ret i1 %is_fpclass
14551455}
14561456
1457+ define float @test_fabs_nsz_used_by_fadd (float %x ) {
1458+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fadd(
1459+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1460+ ; CHECK-NEXT: [[OP:%.*]] = fadd float [[SEL]], 1.000000e+00
1461+ ; CHECK-NEXT: ret float [[OP]]
1462+ ;
1463+ %cmp = fcmp oge float %x , 0 .000000e+00
1464+ %neg = fneg float %x
1465+ %sel = select nsz i1 %cmp , float %x , float %neg
1466+ %op = fadd float %sel , 1 .000000e+00
1467+ ret float %op
1468+ }
1469+
1470+ define float @test_fabs_nsz_used_by_fsub (float %x ) {
1471+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fsub(
1472+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1473+ ; CHECK-NEXT: [[OP:%.*]] = fsub float 1.000000e+00, [[SEL]]
1474+ ; CHECK-NEXT: ret float [[OP]]
1475+ ;
1476+ %cmp = fcmp oge float %x , 0 .000000e+00
1477+ %neg = fneg float %x
1478+ %sel = select nsz i1 %cmp , float %x , float %neg
1479+ %op = fsub float 1 .000000e+00 , %sel
1480+ ret float %op
1481+ }
1482+
1483+ define float @test_fabs_nsz_used_by_fmul (float %x ) {
1484+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fmul(
1485+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1486+ ; CHECK-NEXT: [[OP:%.*]] = fmul float [[SEL]], 3.000000e+00
1487+ ; CHECK-NEXT: ret float [[OP]]
1488+ ;
1489+ %cmp = fcmp oge float %x , 0 .000000e+00
1490+ %neg = fneg float %x
1491+ %sel = select nsz i1 %cmp , float %x , float %neg
1492+ %op = fmul float %sel , 3 .000000e+00
1493+ ret float %op
1494+ }
1495+
1496+ define float @test_fabs_nsz_used_by_fdiv (float %x ) {
1497+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fdiv(
1498+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1499+ ; CHECK-NEXT: [[OP:%.*]] = fdiv float [[SEL]], 3.000000e+00
1500+ ; CHECK-NEXT: ret float [[OP]]
1501+ ;
1502+ %cmp = fcmp oge float %x , 0 .000000e+00
1503+ %neg = fneg float %x
1504+ %sel = select nsz i1 %cmp , float %x , float %neg
1505+ %op = fdiv float %sel , 3 .000000e+00
1506+ ret float %op
1507+ }
1508+
1509+ define float @test_fabs_nsz_used_by_frem (float %x ) {
1510+ ; CHECK-LABEL: @test_fabs_nsz_used_by_frem(
1511+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1512+ ; CHECK-NEXT: [[OP:%.*]] = fdiv float [[SEL]], 3.000000e+00
1513+ ; CHECK-NEXT: ret float [[OP]]
1514+ ;
1515+ %cmp = fcmp oge float %x , 0 .000000e+00
1516+ %neg = fneg float %x
1517+ %sel = select nsz i1 %cmp , float %x , float %neg
1518+ %op = fdiv float %sel , 3 .000000e+00
1519+ ret float %op
1520+ }
1521+
1522+ define half @test_fabs_nsz_used_by_fptrunc (float %x ) {
1523+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fptrunc(
1524+ ; CHECK-NEXT: [[TMP1:%.*]] = fptrunc float [[X:%.*]] to half
1525+ ; CHECK-NEXT: [[OP:%.*]] = call nsz half @llvm.fabs.f16(half [[TMP1]])
1526+ ; CHECK-NEXT: ret half [[OP]]
1527+ ;
1528+ %cmp = fcmp oge float %x , 0 .000000e+00
1529+ %neg = fneg float %x
1530+ %sel = select nsz i1 %cmp , float %x , float %neg
1531+ %op = fptrunc float %sel to half
1532+ ret half %op
1533+ }
1534+
1535+ define float @test_fabs_nsz_used_by_fpext (half %x ) {
1536+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fpext(
1537+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz half @llvm.fabs.f16(half [[X:%.*]])
1538+ ; CHECK-NEXT: [[OP:%.*]] = fpext half [[SEL]] to float
1539+ ; CHECK-NEXT: ret float [[OP]]
1540+ ;
1541+ %cmp = fcmp oge half %x , 0 .000000e+00
1542+ %neg = fneg half %x
1543+ %sel = select nsz i1 %cmp , half %x , half %neg
1544+ %op = fpext half %sel to float
1545+ ret float %op
1546+ }
1547+
1548+ define float @test_fabs_nsz_used_by_maximum (float %x , float %y ) {
1549+ ; CHECK-LABEL: @test_fabs_nsz_used_by_maximum(
1550+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1551+ ; CHECK-NEXT: [[MAX:%.*]] = call float @llvm.maximum.f32(float [[Y:%.*]], float [[SEL]])
1552+ ; CHECK-NEXT: ret float [[MAX]]
1553+ ;
1554+ %cmp = fcmp oge float %x , 0 .000000e+00
1555+ %neg = fneg float %x
1556+ %sel = select nsz i1 %cmp , float %x , float %neg
1557+ %max = call float @llvm.maximum.f32 (float %y , float %sel )
1558+ ret float %max
1559+ }
1560+
1561+ define float @test_fabs_nsz_used_by_maximumnum (float %x , float %y ) {
1562+ ; CHECK-LABEL: @test_fabs_nsz_used_by_maximumnum(
1563+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1564+ ; CHECK-NEXT: [[MAX:%.*]] = call float @llvm.maximumnum.f32(float [[Y:%.*]], float [[SEL]])
1565+ ; CHECK-NEXT: ret float [[MAX]]
1566+ ;
1567+ %cmp = fcmp oge float %x , 0 .000000e+00
1568+ %neg = fneg float %x
1569+ %sel = select nsz i1 %cmp , float %x , float %neg
1570+ %max = call float @llvm.maximumnum.f32 (float %y , float %sel )
1571+ ret float %max
1572+ }
1573+
1574+ define float @test_fabs_nsz_used_by_fma (float %x , float %y , float %z ) {
1575+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fma(
1576+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1577+ ; CHECK-NEXT: [[MAX:%.*]] = call float @llvm.fma.f32(float [[SEL]], float [[Z:%.*]], float [[Z]])
1578+ ; CHECK-NEXT: ret float [[MAX]]
1579+ ;
1580+ %cmp = fcmp oge float %x , 0 .000000e+00
1581+ %neg = fneg float %x
1582+ %sel = select nsz i1 %cmp , float %x , float %neg
1583+ %max = call float @llvm.fma.f32 (float %sel , float %z , float %z )
1584+ ret float %max
1585+ }
1586+
1587+ define float @test_fabs_nsz_used_by_sqrt (float %x ) {
1588+ ; CHECK-LABEL: @test_fabs_nsz_used_by_sqrt(
1589+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1590+ ; CHECK-NEXT: [[OP:%.*]] = call float @llvm.sqrt.f32(float [[SEL]])
1591+ ; CHECK-NEXT: ret float [[OP]]
1592+ ;
1593+ %cmp = fcmp oge float %x , 0 .000000e+00
1594+ %neg = fneg float %x
1595+ %sel = select nsz i1 %cmp , float %x , float %neg
1596+ %op = call float @llvm.sqrt.f32 (float %sel )
1597+ ret float %op
1598+ }
1599+
1600+ define float @test_fabs_nsz_used_by_pow (float %x , float %y ) {
1601+ ; CHECK-LABEL: @test_fabs_nsz_used_by_pow(
1602+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1603+ ; CHECK-NEXT: [[OP:%.*]] = call float @llvm.pow.f32(float [[SEL]], float [[Y:%.*]])
1604+ ; CHECK-NEXT: ret float [[OP]]
1605+ ;
1606+ %cmp = fcmp oge float %x , 0 .000000e+00
1607+ %neg = fneg float %x
1608+ %sel = select nsz i1 %cmp , float %x , float %neg
1609+ %op = call float @llvm.pow.f32 (float %sel , float %y )
1610+ ret float %op
1611+ }
1612+
1613+ define float @test_fabs_nsz_used_by_powi (float %x , i32 %y ) {
1614+ ; CHECK-LABEL: @test_fabs_nsz_used_by_powi(
1615+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1616+ ; CHECK-NEXT: [[OP:%.*]] = call float @llvm.powi.f32.i32(float [[SEL]], i32 [[Y:%.*]])
1617+ ; CHECK-NEXT: ret float [[OP]]
1618+ ;
1619+ %cmp = fcmp oge float %x , 0 .000000e+00
1620+ %neg = fneg float %x
1621+ %sel = select nsz i1 %cmp , float %x , float %neg
1622+ %op = call float @llvm.powi.f32 (float %sel , i32 %y )
1623+ ret float %op
1624+ }
1625+
1626+ define i32 @test_fabs_nsz_used_by_fptoui_sat (float %x ) {
1627+ ; CHECK-LABEL: @test_fabs_nsz_used_by_fptoui_sat(
1628+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1629+ ; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.fptoui.sat.i32.f32(float [[SEL]])
1630+ ; CHECK-NEXT: ret i32 [[OP]]
1631+ ;
1632+ %cmp = fcmp oge float %x , 0 .000000e+00
1633+ %neg = fneg float %x
1634+ %sel = select nsz i1 %cmp , float %x , float %neg
1635+ %op = call i32 @llvm.fptoui.sat.i32.f32 (float %sel )
1636+ ret i32 %op
1637+ }
1638+
1639+ define <2 x i1 > @test_fabs_used_vp_is_fpclass_zero_or_pinf (<2 x float > %x , <2 x i1 > %mask , i32 %evl ) {
1640+ ; CHECK-LABEL: @test_fabs_used_vp_is_fpclass_zero_or_pinf(
1641+ ; CHECK-NEXT: [[SEL:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
1642+ ; CHECK-NEXT: [[IS_FPCLASS:%.*]] = call <2 x i1> @llvm.vp.is.fpclass.v2f32(<2 x float> [[SEL]], i32 608, <2 x i1> [[MASK:%.*]], i32 [[EVL:%.*]])
1643+ ; CHECK-NEXT: ret <2 x i1> [[IS_FPCLASS]]
1644+ ;
1645+ %cmp = fcmp oge <2 x float > %x , zeroinitializer
1646+ %neg = fneg <2 x float > %x
1647+ %sel = select <2 x i1 > %cmp , <2 x float > %x , <2 x float > %neg
1648+ %is_fpclass = call <2 x i1 > @llvm.vp.is.fpclass.v2f32 (<2 x float > %sel , i32 608 , <2 x i1 > %mask , i32 %evl )
1649+ ret <2 x i1 > %is_fpclass
1650+ }
1651+
1652+ define void @test_fabs_nsz_used_by_invoke (float %x ) personality ptr null {
1653+ ; CHECK-LABEL: @test_fabs_nsz_used_by_invoke(
1654+ ; CHECK-NEXT: [[SEL:%.*]] = call nsz float @llvm.fabs.f32(float [[X:%.*]])
1655+ ; CHECK-NEXT: invoke void @use(float nofpclass(nan) [[SEL]])
1656+ ; CHECK-NEXT: to label [[NORMAL:%.*]] unwind label [[UNWIND:%.*]]
1657+ ; CHECK: normal:
1658+ ; CHECK-NEXT: ret void
1659+ ; CHECK: unwind:
1660+ ; CHECK-NEXT: [[TMP1:%.*]] = landingpad ptr
1661+ ; CHECK-NEXT: cleanup
1662+ ; CHECK-NEXT: resume ptr null
1663+ ;
1664+ %cmp = fcmp oge float %x , 0 .000000e+00
1665+ %neg = fneg float %x
1666+ %sel = select nsz i1 %cmp , float %x , float %neg
1667+ invoke void @use (float nofpclass(nan) %sel ) to label %normal unwind label %unwind
1668+
1669+ normal:
1670+ ret void
1671+
1672+ unwind:
1673+ landingpad ptr cleanup
1674+ resume ptr null
1675+ }
1676+
14571677; Negative tests
14581678
14591679define float @test_fabs_used_by_fpop_nnan (float %x , float %y ) {
0 commit comments