-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[ConstantFolding] Fix nvvm_round folding on PPC #149837
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-analysis Author: Lewis Crawford (LewisCrawford) ChangesFix 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. Full diff: https://github.com/llvm/llvm-project/pull/149837.diff 1 Files Affected:
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index f5a88b6e0368e..eb7369fcc7513 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2677,11 +2677,15 @@ 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.
+ APFloat Res = nvvm::UnaryMathIntrinsicShouldFTZ(IntrinsicID)
+ ? FTZPreserveSign(APF)
+ : APF;
+ Res.roundToIntegral(APFloat::rmNearestTiesToAway);
+ return ConstantFP::get(Ty->getContext(), U);
+ }
case Intrinsic::nvvm_saturate_ftz_f:
case Intrinsic::nvvm_saturate_d:
|
This should fix the test failure here: https://lab.llvm.org/buildbot/#/builders/64/builds/4929
|
Fix a failing test for constant-folding the nvvm_round intrinsic. The original implementation added in llvm#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.
310d89d
to
01e0309
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Thanks for jumping on this!
Fix a failing test for constant-folding the nvvm_round intrinsic. The original implementation added in llvm#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.
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.