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
