https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/174652
>From c00fe1d82a2590b175777510607dbe5007d6d627 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Mon, 5 Jan 2026 23:49:37 +0100 Subject: [PATCH 1/2] ValueTracking: Improve sign bit handling for fdiv This is the fdiv version of 5020e0ff1494137ff12b4ed7c8fa896f8088b17b for fmul. --- llvm/lib/Analysis/ValueTracking.cpp | 17 ++++++++++++++--- .../Transforms/Attributor/nofpclass-fdiv.ll | 6 +++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index f55dcc99618d9..ba832aee4dd7c 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -5669,8 +5669,9 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts, fcNan | fcInf | fcZero | fcNegative, KnownRHS, Q, Depth + 1); - bool KnowSomethingUseful = - KnownRHS.isKnownNeverNaN() || KnownRHS.isKnownNever(fcNegative); + bool KnowSomethingUseful = KnownRHS.isKnownNeverNaN() || + KnownRHS.isKnownNever(fcNegative) || + KnownRHS.isKnownNever(fcPositive); if (KnowSomethingUseful || WantPositive) { const FPClassTest InterestedLHS = @@ -5698,10 +5699,20 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts, Known.knownNot(fcNan); } + // xor sign bit. // X / -0.0 is -Inf (or NaN). // +X / +X is +X - if (KnownLHS.isKnownNever(fcNegative) && KnownRHS.isKnownNever(fcNegative)) + if ((KnownLHS.isKnownNever(fcNegative) && + KnownRHS.isKnownNever(fcNegative)) || + (KnownLHS.isKnownNever(fcPositive) && + KnownRHS.isKnownNever(fcPositive))) Known.knownNot(fcNegative); + + if ((KnownLHS.isKnownNever(fcPositive) && + KnownRHS.isKnownNever(fcNegative)) || + (KnownLHS.isKnownNever(fcNegative) && + KnownRHS.isKnownNever(fcPositive))) + Known.knownNot(fcPositive); } else { // Inf REM x and x REM 0 produce NaN. if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() && diff --git a/llvm/test/Transforms/Attributor/nofpclass-fdiv.ll b/llvm/test/Transforms/Attributor/nofpclass-fdiv.ll index 228be4ae748fa..8efed69d9d7c4 100644 --- a/llvm/test/Transforms/Attributor/nofpclass-fdiv.ll +++ b/llvm/test/Transforms/Attributor/nofpclass-fdiv.ll @@ -909,7 +909,7 @@ define float @ret_fdiv_both_signs_positive_or_nan(float %lhs, float %rhs) { ; Result must be positive or nan define float @ret_fdiv_both_signs_negative_or_nan(float %lhs, float %rhs) { -; CHECK-LABEL: define float @ret_fdiv_both_signs_negative_or_nan +; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_fdiv_both_signs_negative_or_nan ; CHECK-SAME: (float [[LHS:%.*]], float [[RHS:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: [[LHS_FABS:%.*]] = call float @llvm.fabs.f32(float [[LHS]]) #[[ATTR6]] ; CHECK-NEXT: [[RHS_FABS:%.*]] = call float @llvm.fabs.f32(float [[RHS]]) #[[ATTR6]] @@ -928,7 +928,7 @@ define float @ret_fdiv_both_signs_negative_or_nan(float %lhs, float %rhs) { ; Result must be negative or nan define float @ret_fdiv_lhs_negative_rhs_positive(float %lhs, float %rhs) { -; CHECK-LABEL: define float @ret_fdiv_lhs_negative_rhs_positive +; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_fdiv_lhs_negative_rhs_positive ; CHECK-SAME: (float [[LHS:%.*]], float [[RHS:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: [[LHS_FABS:%.*]] = call float @llvm.fabs.f32(float [[LHS]]) #[[ATTR6]] ; CHECK-NEXT: [[RHS_FABS:%.*]] = call float @llvm.fabs.f32(float [[RHS]]) #[[ATTR6]] @@ -945,7 +945,7 @@ define float @ret_fdiv_lhs_negative_rhs_positive(float %lhs, float %rhs) { ; Result must be negative or nan define float @ret_fdiv_rhs_negative_lhs_positive(float %lhs, float %rhs) { -; CHECK-LABEL: define float @ret_fdiv_rhs_negative_lhs_positive +; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_fdiv_rhs_negative_lhs_positive ; CHECK-SAME: (float [[LHS:%.*]], float [[RHS:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: [[LHS_FABS:%.*]] = call float @llvm.fabs.f32(float [[LHS]]) #[[ATTR6]] ; CHECK-NEXT: [[RHS_FABS:%.*]] = call float @llvm.fabs.f32(float [[RHS]]) #[[ATTR6]] >From 0a09140701603ce07a715e26e672020395b068e7 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Thu, 8 Jan 2026 18:10:46 +0100 Subject: [PATCH 2/2] fcAllFlags --- llvm/lib/Analysis/ValueTracking.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index ba832aee4dd7c..4776020df0bc5 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -5674,13 +5674,8 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts, KnownRHS.isKnownNever(fcPositive); if (KnowSomethingUseful || WantPositive) { - const FPClassTest InterestedLHS = - WantPositive ? fcAllFlags - : fcNan | fcInf | fcZero | fcSubnormal | fcNegative; - - computeKnownFPClass(Op->getOperand(0), DemandedElts, - InterestedClasses & InterestedLHS, KnownLHS, Q, - Depth + 1); + computeKnownFPClass(Op->getOperand(0), DemandedElts, fcAllFlags, KnownLHS, + Q, Depth + 1); } const Function *F = cast<Instruction>(Op)->getFunction(); _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
