https://github.com/arsenm created 
https://github.com/llvm/llvm-project/pull/172490

None

>From 329426b566e8325a5b9093ffd2b66d7b8431c73f Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Tue, 16 Dec 2025 14:47:12 +0100
Subject: [PATCH] AMDGPU: Handle amdgcn_rcp in computeKnownFPClass

---
 llvm/lib/Analysis/ValueTracking.cpp           |  33 ++++
 .../Attributor/AMDGPU/nofpclass-amdgcn-rcp.ll | 156 +++++++++---------
 2 files changed, 111 insertions(+), 78 deletions(-)

diff --git a/llvm/lib/Analysis/ValueTracking.cpp 
b/llvm/lib/Analysis/ValueTracking.cpp
index 045cbab221ac3..ac11d337ac12b 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5553,6 +5553,39 @@ void computeKnownFPClass(const Value *V, const APInt 
&DemandedElts,
 
       // TODO: Copy inf handling from instructions
       break;
+    case Intrinsic::amdgcn_rcp: {
+      KnownFPClass KnownSrc;
+      computeKnownFPClass(II->getArgOperand(0), DemandedElts, 
InterestedClasses,
+                          KnownSrc, Q, Depth + 1);
+
+      Known.propagateNaN(KnownSrc);
+
+      Type *EltTy = II->getType()->getScalarType();
+
+      // f32 denormal always flushed.
+      if (EltTy->isFloatTy())
+        Known.knownNot(fcSubnormal);
+
+      if (KnownSrc.isKnownNever(fcNegative))
+        Known.knownNot(fcNegative);
+      if (KnownSrc.isKnownNever(fcPositive))
+        Known.knownNot(fcPositive);
+
+      if (KnownSrc.isKnownNeverNegInfinity())
+        Known.knownNot(fcNegZero);
+      if (KnownSrc.isKnownNeverPosInfinity())
+        Known.knownNot(fcPosZero);
+
+      if (const Function *F = II->getFunction()) {
+        DenormalMode Mode = F->getDenormalMode(EltTy->getFltSemantics());
+        if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
+          Known.knownNot(fcPosInf);
+        if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
+          Known.knownNot(fcNegInf);
+      }
+
+      break;
+    }
     case Intrinsic::amdgcn_rsq: {
       KnownFPClass KnownSrc;
       // The only negative value that can be returned is -inf for -0 inputs.
diff --git a/llvm/test/Transforms/Attributor/AMDGPU/nofpclass-amdgcn-rcp.ll 
b/llvm/test/Transforms/Attributor/AMDGPU/nofpclass-amdgcn-rcp.ll
index e048d76479752..bbb3e8057b790 100644
--- a/llvm/test/Transforms/Attributor/AMDGPU/nofpclass-amdgcn-rcp.ll
+++ b/llvm/test/Transforms/Attributor/AMDGPU/nofpclass-amdgcn-rcp.ll
@@ -16,9 +16,9 @@ define half @ret_rcp_f16(half %arg) {
 }
 
 define float @ret_rcp_f32(float %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32(
+; CHECK-LABEL: define nofpclass(sub) float @ret_rcp_f32(
 ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float [[ARG]]) 
#[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -36,9 +36,9 @@ define double @ret_rcp_f64(double %arg) {
 }
 
 define float @ret_rcp_f32_dynamic_denormal_input(float %arg) #1 {
-; CHECK-LABEL: define float @ret_rcp_f32_dynamic_denormal_input(
+; CHECK-LABEL: define nofpclass(sub) float @ret_rcp_f32_dynamic_denormal_input(
 ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR2:[0-9]+]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float [[ARG]]) 
#[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -46,9 +46,9 @@ define float @ret_rcp_f32_dynamic_denormal_input(float %arg) 
#1 {
 }
 
 define float @ret_rcp_f32_dynamic_denormal_input_known_nzero(float 
nofpclass(nzero) %arg) #1 {
-; CHECK-LABEL: define float @ret_rcp_f32_dynamic_denormal_input_known_nzero(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_dynamic_denormal_input_known_nzero(
 ; CHECK-SAME: float nofpclass(nzero) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -56,9 +56,9 @@ define float 
@ret_rcp_f32_dynamic_denormal_input_known_nzero(float nofpclass(nze
 }
 
 define float @ret_rcp_f32_dynamic_denormal_input_known_nzero_nsub(float 
nofpclass(nzero nsub) %arg) #1 {
-; CHECK-LABEL: define float 
@ret_rcp_f32_dynamic_denormal_input_known_nzero_nsub(
+; CHECK-LABEL: define nofpclass(ninf sub) float 
@ret_rcp_f32_dynamic_denormal_input_known_nzero_nsub(
 ; CHECK-SAME: float nofpclass(nzero nsub) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -76,9 +76,9 @@ define double @ret_rcp_f64_dynamic_denormal_input(double 
%arg) #2 {
 }
 
 define double @ret_rcp_f64_dynamic_denormal_input_known_nzero(double 
nofpclass(nzero) %arg) #1 {
-; CHECK-LABEL: define double @ret_rcp_f64_dynamic_denormal_input_known_nzero(
+; CHECK-LABEL: define nofpclass(ninf) double 
@ret_rcp_f64_dynamic_denormal_input_known_nzero(
 ; CHECK-SAME: double nofpclass(nzero) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call double @llvm.amdgcn.rcp.f64(double 
nofpclass(nzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf) double 
@llvm.amdgcn.rcp.f64(double nofpclass(nzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret double [[CALL]]
 ;
   %call = call double @llvm.amdgcn.rcp.f64(double %arg)
@@ -86,9 +86,9 @@ define double 
@ret_rcp_f64_dynamic_denormal_input_known_nzero(double nofpclass(n
 }
 
 define double @ret_rcp_f64_dynamic_denormal_input_known_nzero_nsub(double 
nofpclass(nzero nsub) %arg) #1 {
-; CHECK-LABEL: define double 
@ret_rcp_f64_dynamic_denormal_input_known_nzero_nsub(
+; CHECK-LABEL: define nofpclass(ninf) double 
@ret_rcp_f64_dynamic_denormal_input_known_nzero_nsub(
 ; CHECK-SAME: double nofpclass(nzero nsub) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call double @llvm.amdgcn.rcp.f64(double 
nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf) double 
@llvm.amdgcn.rcp.f64(double nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret double [[CALL]]
 ;
   %call = call double @llvm.amdgcn.rcp.f64(double %arg)
@@ -96,9 +96,9 @@ define double 
@ret_rcp_f64_dynamic_denormal_input_known_nzero_nsub(double nofpcl
 }
 
 define float @ret_rcp_f32__no_snan_input(float nofpclass(snan) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32__no_snan_input(
+; CHECK-LABEL: define nofpclass(snan sub) float @ret_rcp_f32__no_snan_input(
 ; CHECK-SAME: float nofpclass(snan) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(snan) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(snan sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(snan) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -106,9 +106,9 @@ define float @ret_rcp_f32__no_snan_input(float 
nofpclass(snan) %arg) {
 }
 
 define float @ret_rcp_f32_nsz(float %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_nsz(
+; CHECK-LABEL: define nofpclass(sub) float @ret_rcp_f32_nsz(
 ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call nsz float @llvm.amdgcn.rcp.f32(float 
[[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nsz nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call nsz float @llvm.amdgcn.rcp.f32(float %arg)
@@ -116,9 +116,9 @@ define float @ret_rcp_f32_nsz(float %arg) {
 }
 
 define float @ret_rcp_f32_nnan_flag(float %arg) {
-; CHECK-LABEL: define nofpclass(nan) float @ret_rcp_f32_nnan_flag(
+; CHECK-LABEL: define nofpclass(nan sub) float @ret_rcp_f32_nnan_flag(
 ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan sub) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call nnan float @llvm.amdgcn.rcp.f32(float %arg)
@@ -126,9 +126,9 @@ define float @ret_rcp_f32_nnan_flag(float %arg) {
 }
 
 define float @ret_rcp_f32_ninf_flag(float %arg) {
-; CHECK-LABEL: define nofpclass(inf) float @ret_rcp_f32_ninf_flag(
+; CHECK-LABEL: define nofpclass(inf sub) float @ret_rcp_f32_ninf_flag(
 ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call ninf nofpclass(inf sub) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call ninf float @llvm.amdgcn.rcp.f32(float %arg)
@@ -136,9 +136,9 @@ define float @ret_rcp_f32_ninf_flag(float %arg) {
 }
 
 define float @ret_rcp_f32_nnan_ninf_flag(float %arg) {
-; CHECK-LABEL: define nofpclass(nan inf) float @ret_rcp_f32_nnan_ninf_flag(
+; CHECK-LABEL: define nofpclass(nan inf sub) float @ret_rcp_f32_nnan_ninf_flag(
 ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nnan ninf nofpclass(nan inf sub) float 
@llvm.amdgcn.rcp.f32(float [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call nnan ninf float @llvm.amdgcn.rcp.f32(float %arg)
@@ -146,9 +146,9 @@ define float @ret_rcp_f32_nnan_ninf_flag(float %arg) {
 }
 
 define float @ret_rcp_f32_known_no_neg_zero(float nofpclass(nzero) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_no_neg_zero(
+; CHECK-LABEL: define nofpclass(ninf sub) float @ret_rcp_f32_known_no_neg_zero(
 ; CHECK-SAME: float nofpclass(nzero) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -156,9 +156,9 @@ define float @ret_rcp_f32_known_no_neg_zero(float 
nofpclass(nzero) %arg) {
 }
 
 define float @ret_rcp_f32_known_no_pos_zero(float nofpclass(pzero) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_no_pos_zero(
+; CHECK-LABEL: define nofpclass(pinf sub) float @ret_rcp_f32_known_no_pos_zero(
 ; CHECK-SAME: float nofpclass(pzero) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(pzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(pinf sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(pzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -166,9 +166,9 @@ define float @ret_rcp_f32_known_no_pos_zero(float 
nofpclass(pzero) %arg) {
 }
 
 define float @ret_rcp_f32_known_zero(float nofpclass(zero) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_zero(
+; CHECK-LABEL: define nofpclass(inf sub) float @ret_rcp_f32_known_zero(
 ; CHECK-SAME: float nofpclass(zero) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(zero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(zero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -176,9 +176,9 @@ define float @ret_rcp_f32_known_zero(float nofpclass(zero) 
%arg) {
 }
 
 define float @ret_rcp_f32_known_zero_dynamic_denorm(float nofpclass(zero) 
%arg) #2 {
-; CHECK-LABEL: define float @ret_rcp_f32_known_zero_dynamic_denorm(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_known_zero_dynamic_denorm(
 ; CHECK-SAME: float nofpclass(zero) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(zero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(zero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -186,9 +186,9 @@ define float @ret_rcp_f32_known_zero_dynamic_denorm(float 
nofpclass(zero) %arg)
 }
 
 define float @ret_rcp_f32_known_nzero_dynamic_denorm(float nofpclass(nzero) 
%arg) #2 {
-; CHECK-LABEL: define float @ret_rcp_f32_known_nzero_dynamic_denorm(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_known_nzero_dynamic_denorm(
 ; CHECK-SAME: float nofpclass(nzero) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -196,9 +196,9 @@ define float @ret_rcp_f32_known_nzero_dynamic_denorm(float 
nofpclass(nzero) %arg
 }
 
 define float @ret_rcp_f32_known_pzero_dynamic_denorm(float nofpclass(pzero) 
%arg) #2 {
-; CHECK-LABEL: define float @ret_rcp_f32_known_pzero_dynamic_denorm(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_known_pzero_dynamic_denorm(
 ; CHECK-SAME: float nofpclass(pzero) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(pzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(pzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -206,9 +206,9 @@ define float @ret_rcp_f32_known_pzero_dynamic_denorm(float 
nofpclass(pzero) %arg
 }
 
 define float @ret_rcp_f32_known_not_pzero_dynamic_denorm(float nofpclass(pzero 
psub) %arg) #2 {
-; CHECK-LABEL: define float @ret_rcp_f32_known_not_pzero_dynamic_denorm(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_known_not_pzero_dynamic_denorm(
 ; CHECK-SAME: float nofpclass(pzero psub) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(pzero psub) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(pzero psub) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -216,9 +216,9 @@ define float 
@ret_rcp_f32_known_not_pzero_dynamic_denorm(float nofpclass(pzero p
 }
 
 define float @ret_rcp_f32_known_not_nzero_dynamic_denorm(float nofpclass(nzero 
nsub) %arg) #2 {
-; CHECK-LABEL: define float @ret_rcp_f32_known_not_nzero_dynamic_denorm(
+; CHECK-LABEL: define nofpclass(ninf sub) float 
@ret_rcp_f32_known_not_nzero_dynamic_denorm(
 ; CHECK-SAME: float nofpclass(nzero nsub) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -226,9 +226,9 @@ define float 
@ret_rcp_f32_known_not_nzero_dynamic_denorm(float nofpclass(nzero n
 }
 
 define float @ret_rcp_f32_known_no_nan(float nofpclass(nan) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_no_nan(
+; CHECK-LABEL: define nofpclass(nan sub) float @ret_rcp_f32_known_no_nan(
 ; CHECK-SAME: float nofpclass(nan) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call nsz float @llvm.amdgcn.rcp.f32(float 
nofpclass(nan) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nsz nofpclass(nan sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nan) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call nsz float @llvm.amdgcn.rcp.f32(float %arg)
@@ -236,9 +236,9 @@ define float @ret_rcp_f32_known_no_nan(float nofpclass(nan) 
%arg) {
 }
 
 define float @ret_rcp_f32_known_no_inf(float nofpclass(inf) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_no_inf(
+; CHECK-LABEL: define nofpclass(zero sub) float @ret_rcp_f32_known_no_inf(
 ; CHECK-SAME: float nofpclass(inf) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(inf) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(zero sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(inf) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -246,9 +246,9 @@ define float @ret_rcp_f32_known_no_inf(float nofpclass(inf) 
%arg) {
 }
 
 define float @ret_rcp_f32_known_no_nan_no_inf(float nofpclass(nan inf) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_no_nan_no_inf(
+; CHECK-LABEL: define nofpclass(nan zero sub) float 
@ret_rcp_f32_known_no_nan_no_inf(
 ; CHECK-SAME: float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nan inf) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan zero sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nan inf) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -256,9 +256,9 @@ define float @ret_rcp_f32_known_no_nan_no_inf(float 
nofpclass(nan inf) %arg) {
 }
 
 define float @ret_rcp_f32_poison() {
-; CHECK-LABEL: define float @ret_rcp_f32_poison(
+; CHECK-LABEL: define nofpclass(all) float @ret_rcp_f32_poison(
 ; CHECK-SAME: ) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float poison) 
#[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(all) float 
@llvm.amdgcn.rcp.f32(float poison) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float poison)
@@ -266,9 +266,9 @@ define float @ret_rcp_f32_poison() {
 }
 
 define float @ret_rcp_f32_known_no_neg_normal_no_neg_subnormal(float 
nofpclass(nsub nnorm) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_no_neg_normal_no_neg_subnormal(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal(
 ; CHECK-SAME: float nofpclass(nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nsub nnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -276,9 +276,9 @@ define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal(float nofpclass(n
 }
 
 define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf(float 
nofpclass(ninf nsub nnorm) %arg) {
-; CHECK-LABEL: define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf(
+; CHECK-LABEL: define nofpclass(nzero sub) float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf(
 ; CHECK-SAME: float nofpclass(ninf nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nzero sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -286,9 +286,9 @@ define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf(float
 }
 
 define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_neg_zero(float 
nofpclass(ninf nzero nsub nnorm) %arg) {
-; CHECK-LABEL: define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_neg_zero(
+; CHECK-LABEL: define nofpclass(ninf nzero sub nnorm) float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_neg_zero(
 ; CHECK-SAME: float nofpclass(ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(ninf nzero nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf nzero sub nnorm) float 
@llvm.amdgcn.rcp.f32(float nofpclass(ninf nzero nsub nnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -296,9 +296,9 @@ define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_neg
 }
 
 define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_nan(float 
nofpclass(nan ninf nsub nnorm) %arg) {
-; CHECK-LABEL: define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_nan(
+; CHECK-LABEL: define nofpclass(nan nzero sub) float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_nan(
 ; CHECK-SAME: float nofpclass(nan ninf nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nan ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan nzero sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nan ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -306,9 +306,9 @@ define float 
@ret_rcp_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_nan
 }
 
 define float 
@ret_rcp_f32_nnan_known_no_neg_normal_no_neg_subnormal_no_neg_inf(float 
nofpclass(ninf nsub nnorm) %arg) {
-; CHECK-LABEL: define nofpclass(nan) float 
@ret_rcp_f32_nnan_known_no_neg_normal_no_neg_subnormal_no_neg_inf(
+; CHECK-LABEL: define nofpclass(nan nzero sub) float 
@ret_rcp_f32_nnan_known_no_neg_normal_no_neg_subnormal_no_neg_inf(
 ; CHECK-SAME: float nofpclass(ninf nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan) float 
@llvm.amdgcn.rcp.f32(float nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nnan nofpclass(nan nzero sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call nnan float @llvm.amdgcn.rcp.f32(float %arg)
@@ -316,9 +316,9 @@ define float 
@ret_rcp_f32_nnan_known_no_neg_normal_no_neg_subnormal_no_neg_inf(f
 }
 
 define float @ret_rcp_f32_dynamic_denormal_input_known_pzero(float 
nofpclass(pzero) %arg) #1 {
-; CHECK-LABEL: define float @ret_rcp_f32_dynamic_denormal_input_known_pzero(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_dynamic_denormal_input_known_pzero(
 ; CHECK-SAME: float nofpclass(pzero) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(pzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(pzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -326,9 +326,9 @@ define float 
@ret_rcp_f32_dynamic_denormal_input_known_pzero(float nofpclass(pze
 }
 
 define float @ret_rcp_f32_dynamic_denormal_input_known_pzero_psub(float 
nofpclass(pzero) %arg) #2 {
-; CHECK-LABEL: define float 
@ret_rcp_f32_dynamic_denormal_input_known_pzero_psub(
+; CHECK-LABEL: define nofpclass(sub) float 
@ret_rcp_f32_dynamic_denormal_input_known_pzero_psub(
 ; CHECK-SAME: float nofpclass(pzero) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(pzero) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(pzero) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -336,9 +336,9 @@ define float 
@ret_rcp_f32_dynamic_denormal_input_known_pzero_psub(float nofpclas
 }
 
 define double @ret_rcp_f64_known_not_pinf(double nofpclass(pinf) %arg) {
-; CHECK-LABEL: define double @ret_rcp_f64_known_not_pinf(
+; CHECK-LABEL: define nofpclass(pzero) double @ret_rcp_f64_known_not_pinf(
 ; CHECK-SAME: double nofpclass(pinf) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call double @llvm.amdgcn.rcp.f64(double 
nofpclass(pinf) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(pzero) double 
@llvm.amdgcn.rcp.f64(double nofpclass(pinf) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret double [[CALL]]
 ;
   %call = call double @llvm.amdgcn.rcp.f64(double %arg)
@@ -346,9 +346,9 @@ define double @ret_rcp_f64_known_not_pinf(double 
nofpclass(pinf) %arg) {
 }
 
 define double @ret_rcp_f64_known_not_ninf(double nofpclass(ninf) %arg) {
-; CHECK-LABEL: define double @ret_rcp_f64_known_not_ninf(
+; CHECK-LABEL: define nofpclass(nzero) double @ret_rcp_f64_known_not_ninf(
 ; CHECK-SAME: double nofpclass(ninf) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call double @llvm.amdgcn.rcp.f64(double 
nofpclass(ninf) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nzero) double 
@llvm.amdgcn.rcp.f64(double nofpclass(ninf) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret double [[CALL]]
 ;
   %call = call double @llvm.amdgcn.rcp.f64(double %arg)
@@ -356,9 +356,9 @@ define double @ret_rcp_f64_known_not_ninf(double 
nofpclass(ninf) %arg) {
 }
 
 define double @ret_rcp_f64_known_not_inf(double nofpclass(inf) %arg) {
-; CHECK-LABEL: define double @ret_rcp_f64_known_not_inf(
+; CHECK-LABEL: define nofpclass(zero) double @ret_rcp_f64_known_not_inf(
 ; CHECK-SAME: double nofpclass(inf) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call double @llvm.amdgcn.rcp.f64(double 
nofpclass(inf) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(zero) double 
@llvm.amdgcn.rcp.f64(double nofpclass(inf) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret double [[CALL]]
 ;
   %call = call double @llvm.amdgcn.rcp.f64(double %arg)
@@ -366,9 +366,9 @@ define double @ret_rcp_f64_known_not_inf(double 
nofpclass(inf) %arg) {
 }
 
 define float @ret_rcp_f32_known_positive(float nofpclass(ninf nzero nsub 
nnorm) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_positive(
+; CHECK-LABEL: define nofpclass(ninf nzero sub nnorm) float 
@ret_rcp_f32_known_positive(
 ; CHECK-SAME: float nofpclass(ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(ninf nzero nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf nzero sub nnorm) float 
@llvm.amdgcn.rcp.f32(float nofpclass(ninf nzero nsub nnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -376,9 +376,9 @@ define float @ret_rcp_f32_known_positive(float 
nofpclass(ninf nzero nsub nnorm)
 }
 
 define float @ret_rcp_f32_known_negative(float nofpclass(pinf pzero psub 
pnorm) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_negative(
+; CHECK-LABEL: define nofpclass(pinf pzero sub pnorm) float 
@ret_rcp_f32_known_negative(
 ; CHECK-SAME: float nofpclass(pinf pzero psub pnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(pinf pzero psub pnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(pinf pzero sub pnorm) float 
@llvm.amdgcn.rcp.f32(float nofpclass(pinf pzero psub pnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -386,9 +386,9 @@ define float @ret_rcp_f32_known_negative(float 
nofpclass(pinf pzero psub pnorm)
 }
 
 define float @ret_rcp_f32_known_positive_except_zero(float nofpclass(ninf nsub 
nnorm) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_positive_except_zero(
+; CHECK-LABEL: define nofpclass(nzero sub) float 
@ret_rcp_f32_known_positive_except_zero(
 ; CHECK-SAME: float nofpclass(ninf nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nzero sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -396,9 +396,9 @@ define float @ret_rcp_f32_known_positive_except_zero(float 
nofpclass(ninf nsub n
 }
 
 define float @ret_rcp_f32_known_negative_except_zero(float nofpclass(pinf psub 
pnorm) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_negative_except_zero(
+; CHECK-LABEL: define nofpclass(pzero sub) float 
@ret_rcp_f32_known_negative_except_zero(
 ; CHECK-SAME: float nofpclass(pinf psub pnorm) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(pinf psub pnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(pzero sub) float 
@llvm.amdgcn.rcp.f32(float nofpclass(pinf psub pnorm) [[ARG]]) #[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -406,9 +406,9 @@ define float @ret_rcp_f32_known_negative_except_zero(float 
nofpclass(pinf psub p
 }
 
 define float @ret_rcp_f32_known_positive_not_nan(float nofpclass(nan ninf 
nzero nsub nnorm) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_positive_not_nan(
+; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) float 
@ret_rcp_f32_known_positive_not_nan(
 ; CHECK-SAME: float nofpclass(nan ninf nzero nsub nnorm) [[ARG:%.*]]) 
#[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nan ninf nzero nsub nnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan ninf nzero sub nnorm) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nan ninf nzero nsub nnorm) [[ARG]]) 
#[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)
@@ -416,9 +416,9 @@ define float @ret_rcp_f32_known_positive_not_nan(float 
nofpclass(nan ninf nzero
 }
 
 define float @ret_rcp_f32_known_negative_not_nan(float nofpclass(nan pinf 
pzero psub pnorm) %arg) {
-; CHECK-LABEL: define float @ret_rcp_f32_known_negative_not_nan(
+; CHECK-LABEL: define nofpclass(nan pinf pzero sub pnorm) float 
@ret_rcp_f32_known_negative_not_nan(
 ; CHECK-SAME: float nofpclass(nan pinf pzero psub pnorm) [[ARG:%.*]]) 
#[[ATTR1]] {
-; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.amdgcn.rcp.f32(float 
nofpclass(nan pinf pzero psub pnorm) [[ARG]]) #[[ATTR4]]
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan pinf pzero sub pnorm) float 
@llvm.amdgcn.rcp.f32(float nofpclass(nan pinf pzero psub pnorm) [[ARG]]) 
#[[ATTR4]]
 ; CHECK-NEXT:    ret float [[CALL]]
 ;
   %call = call float @llvm.amdgcn.rcp.f32(float %arg)

_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to