[llvm-branch-commits] [llvm] 98863ae - Revert "[KnownFPClass] Refine positive zero result for sqrt (#214987)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Oct 9 22:57:59 PDT 2026
Author: Eric Ross
Date: 2026-10-09T23:57:52-06:00
New Revision: 98863aed6d4021febbe5c515ad844b155864706c
URL: https://github.com/llvm/llvm-project/commit/98863aed6d4021febbe5c515ad844b155864706c
DIFF: https://github.com/llvm/llvm-project/commit/98863aed6d4021febbe5c515ad844b155864706c.diff
LOG: Revert "[KnownFPClass] Refine positive zero result for sqrt (#214987)"
This reverts commit dfabf2df7d27cbaf96b849251c36b8228762ee87.
Added:
Modified:
llvm/lib/Support/KnownFPClass.cpp
llvm/test/Transforms/Attributor/nofpclass-sqrt.ll
Removed:
################################################################################
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index ffe2478724ea61..b491c82cd0a16c 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -815,20 +815,15 @@ KnownFPClass KnownFPClass::sqrt(const KnownFPClass &KnownSrc,
Known.propagateNonSNaN(KnownSrc);
- // Any negative value besides -0.0 returns a nan.
+ // Any negative value besides -0 returns a nan.
if (KnownSrc.isKnownNeverNaN() && KnownSrc.cannotBeOrderedLessThanZero())
Known.knownNot(fcNan);
- // The only negative value that can be returned is -0.0 for -0.0 inputs.
+ // The only negative value that can be returned is -0 for -0 inputs.
Known.knownNot(fcNegInf | fcNegSubnormal | fcNegNormal);
- // Only sqrt(+0.0) == +0.0. However, subnormals may also be treated as +0.0
- // depending on the input denormal mode.
- if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
- Known.knownNot(fcPosZero);
-
- // Only sqrt(-0.0) == -0.0. However, negative subnormals may also be treated
- // as -0.0 depending on the input denormal mode.
+ // If the input denormal mode could be PreserveSign, a negative
+ // subnormal input could produce a negative zero output.
if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
Known.knownNot(fcNegZero);
diff --git a/llvm/test/Transforms/Attributor/nofpclass-sqrt.ll b/llvm/test/Transforms/Attributor/nofpclass-sqrt.ll
index 166e4b0ddcb9d8..aa62e807cddb94 100644
--- a/llvm/test/Transforms/Attributor/nofpclass-sqrt.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass-sqrt.ll
@@ -66,9 +66,9 @@ define float @ret_sqrt_nonan_noinf(float nofpclass(nan inf) %arg0) #0 {
}
define float @ret_sqrt_nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0) #0 {
-; CHECK-LABEL: define nofpclass(snan inf zero sub nnorm) float @ret_sqrt_nonan_noinf_nozero
+; CHECK-LABEL: define nofpclass(snan inf nzero sub nnorm) float @ret_sqrt_nonan_noinf_nozero
; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf zero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR10]]
+; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf nzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR10]]
; CHECK-NEXT: ret float [[CALL]]
;
%call = call float @llvm.sqrt.f32(float %arg0)
@@ -76,9 +76,9 @@ define float @ret_sqrt_nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0) #
}
define float @ret_sqrt_noinf_nozero(float nofpclass(inf zero) %arg0) #0 {
-; CHECK-LABEL: define nofpclass(inf zero sub nnorm) float @ret_sqrt_noinf_nozero
+; CHECK-LABEL: define nofpclass(inf nzero sub nnorm) float @ret_sqrt_noinf_nozero
; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf zero sub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]]
+; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]]
; CHECK-NEXT: ret float [[CALL]]
;
%call = call float @llvm.sqrt.f32(float %arg0)
@@ -95,16 +95,6 @@ define float @ret_sqrt_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #0 {
ret float %call
}
-define float @ret_sqrt_noinf_noposzero(float nofpclass(inf pzero) %arg0) #0 {
-; CHECK-LABEL: define nofpclass(inf pzero sub nnorm) float @ret_sqrt_noinf_noposzero
-; CHECK-SAME: (float nofpclass(inf pzero) [[ARG0:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf pzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(inf pzero) [[ARG0]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[CALL]]
-;
- %call = call float @llvm.sqrt.f32(float %arg0)
- ret float %call
-}
-
define float @ret_sqrt_positive_source(i32 %arg) #0 {
; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) float @ret_sqrt_positive_source
; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] {
@@ -271,138 +261,15 @@ define float @constrained_sqrt_nonegzero(float nofpclass(nzero) %arg) strictfp {
}
define float @constrained_sqrt_nozero(float nofpclass(zero) %arg) strictfp {
-; CHECK-LABEL: define nofpclass(ninf zero sub nnorm) float @constrained_sqrt_nozero
+; CHECK-LABEL: define nofpclass(ninf nzero sub nnorm) float @constrained_sqrt_nozero
; CHECK-SAME: (float nofpclass(zero) [[ARG:%.*]]) #[[ATTR9]] {
-; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(ninf zero sub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(zero) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]]
+; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(ninf nzero sub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(zero) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]]
; CHECK-NEXT: ret float [[VAL]]
;
%val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")
ret float %val
}
-; sqrt cannot produce a subnormal result, so only the input denormal mode
-; affects the following tests.
-
-define float @ret_sqrt_ieee_psub(float nofpclass(nan inf zero nsub norm) %arg) #0 {
-; CHECK-LABEL: define nofpclass(nan inf zero sub nnorm) float @ret_sqrt_ieee_psub
-; CHECK-SAME: (float nofpclass(nan inf zero nsub norm) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(nan inf zero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero nsub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_ieee_nsub(float nofpclass(nan inf zero psub norm) %arg) #0 {
-; CHECK-LABEL: define nofpclass(snan inf zero sub nnorm) float @ret_sqrt_ieee_nsub
-; CHECK-SAME: (float nofpclass(nan inf zero psub norm) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf zero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero psub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_ieee_sub(float nofpclass(nan inf zero norm) %arg) #0 {
-; CHECK-LABEL: define nofpclass(snan inf zero sub nnorm) float @ret_sqrt_ieee_sub
-; CHECK-SAME: (float nofpclass(nan inf zero norm) [[ARG:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf zero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_daz_psub(float nofpclass(nan inf zero nsub norm) %arg) #1 {
-; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) float @ret_sqrt_daz_psub
-; CHECK-SAME: (float nofpclass(nan inf zero nsub norm) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(nan inf nzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero nsub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_daz_nsub(float nofpclass(nan inf zero psub norm) %arg) #1 {
-; CHECK-LABEL: define nofpclass(snan inf pzero sub nnorm) float @ret_sqrt_daz_nsub
-; CHECK-SAME: (float nofpclass(nan inf zero psub norm) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf pzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero psub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_daz_sub(float nofpclass(nan inf zero norm) %arg) #1 {
-; CHECK-LABEL: define nofpclass(snan inf sub nnorm) float @ret_sqrt_daz_sub
-; CHECK-SAME: (float nofpclass(nan inf zero norm) [[ARG:%.*]]) #[[ATTR3]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_dapz_psub(float nofpclass(nan inf zero nsub norm) %arg) #2 {
-; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) float @ret_sqrt_dapz_psub
-; CHECK-SAME: (float nofpclass(nan inf zero nsub norm) [[ARG:%.*]]) #[[ATTR4]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(nan inf nzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero nsub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_dapz_nsub(float nofpclass(nan inf zero psub norm) %arg) #2 {
-; CHECK-LABEL: define nofpclass(snan inf nzero sub nnorm) float @ret_sqrt_dapz_nsub
-; CHECK-SAME: (float nofpclass(nan inf zero psub norm) [[ARG:%.*]]) #[[ATTR4]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf nzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero psub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_dapz_sub(float nofpclass(nan inf zero norm) %arg) #2 {
-; CHECK-LABEL: define nofpclass(snan inf nzero sub nnorm) float @ret_sqrt_dapz_sub
-; CHECK-SAME: (float nofpclass(nan inf zero norm) [[ARG:%.*]]) #[[ATTR4]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf nzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_dynamic_psub(float nofpclass(nan inf zero nsub norm) %arg) #3 {
-; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) float @ret_sqrt_dynamic_psub
-; CHECK-SAME: (float nofpclass(nan inf zero nsub norm) [[ARG:%.*]]) #[[ATTR5]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(nan inf nzero sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero nsub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_dynamic_nsub(float nofpclass(nan inf zero psub norm) %arg) #3 {
-; CHECK-LABEL: define nofpclass(snan inf sub nnorm) float @ret_sqrt_dynamic_nsub
-; CHECK-SAME: (float nofpclass(nan inf zero psub norm) [[ARG:%.*]]) #[[ATTR5]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero psub norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
-define float @ret_sqrt_dynamic_sub(float nofpclass(nan inf zero norm) %arg) #3 {
-; CHECK-LABEL: define nofpclass(snan inf sub nnorm) float @ret_sqrt_dynamic_sub
-; CHECK-SAME: (float nofpclass(nan inf zero norm) [[ARG:%.*]]) #[[ATTR5]] {
-; CHECK-NEXT: [[SQRT:%.*]] = call nofpclass(snan inf sub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero norm) [[ARG]]) #[[ATTR10]]
-; CHECK-NEXT: ret float [[SQRT]]
-;
- %sqrt = call float @llvm.sqrt.f32(float %arg)
- ret float %sqrt
-}
-
attributes #0 = { denormal_fpenv(ieee|ieee) }
attributes #1 = { denormal_fpenv(ieee|preservesign) }
attributes #2 = { denormal_fpenv(ieee|positivezero) }
More information about the llvm-branch-commits
mailing list