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) } _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
