[llvm] 0823f4f - [ConstantFolding] Fix nvvm_round folding on PPC (#149837)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 21 09:48:48 PDT 2025


Author: Lewis Crawford
Date: 2025-07-21T17:48:45+01:00
New Revision: 0823f4ff086e5352f7543b68ce6e7823498cf44b

URL: https://github.com/llvm/llvm-project/commit/0823f4ff086e5352f7543b68ce6e7823498cf44b
DIFF: https://github.com/llvm/llvm-project/commit/0823f4ff086e5352f7543b68ce6e7823498cf44b.diff

LOG: [ConstantFolding] Fix nvvm_round folding on PPC (#149837)

Fix a failing test for constant-folding the nvvm_round intrinsic. The
original implementation added in #141233 used a native libm call to the
"round" function, but on PPC this produces +0.0 if the input is -0.0,
which caused a test failure.

This patch updates it to use APFloat functions instead of native libm
calls to ensure cross-platform consistency.

Added: 
    

Modified: 
    llvm/lib/Analysis/ConstantFolding.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index f5a88b6e0368e..e71ba5ea5521e 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2677,11 +2677,14 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
 
       case Intrinsic::nvvm_round_ftz_f:
       case Intrinsic::nvvm_round_f:
-      case Intrinsic::nvvm_round_d:
-        return ConstantFoldFP(
-            round, APF, Ty,
-            nvvm::GetNVVMDenromMode(
-                nvvm::UnaryMathIntrinsicShouldFTZ(IntrinsicID)));
+      case Intrinsic::nvvm_round_d: {
+        // Use APFloat implementation instead of native libm call, as some
+        // implementations (e.g. on PPC) do not preserve the sign of negative 0.
+        bool IsFTZ = nvvm::UnaryMathIntrinsicShouldFTZ(IntrinsicID);
+        auto V = IsFTZ ? FTZPreserveSign(APF) : APF;
+        V.roundToIntegral(APFloat::rmNearestTiesToAway);
+        return ConstantFP::get(Ty->getContext(), V);
+      }
 
       case Intrinsic::nvvm_saturate_ftz_f:
       case Intrinsic::nvvm_saturate_d:


        


More information about the llvm-commits mailing list