-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[SelectionDAG] Fix NaN regression in fma dag-combine. #146592
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
After 901e139 (llvm#127770), the DAG combine would transform `fma(x, 0.0, 1.0)` into `1.0` if `-fp-contract=fast` was enabled, in addition to when 'x' is marked nnan/ninf. It's only valid in the latter case, not the former, so delete the extra condition.
@llvm/pr-subscribers-llvm-selectiondag @llvm/pr-subscribers-backend-x86 Author: James Y Knight (jyknight) ChangesAfter 901e139 (#127770), the DAG combine would transform It's only valid in the latter case, not the former, so delete the extra condition. Full diff: https://github.com/llvm/llvm-project/pull/146592.diff 2 Files Affected:
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index c43677f8b925c..bfc061b404560 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -18087,8 +18087,7 @@ template <class MatchContextClass> SDValue DAGCombiner::visitFMA(SDNode *N) {
// FIXME: use fast math flags instead of Options.UnsafeFPMath
// TODO: Finally migrate away from global TargetOptions.
- if (Options.AllowFPOpFusion == FPOpFusion::Fast ||
- (Options.NoNaNsFPMath && Options.NoInfsFPMath) ||
+ if ((Options.NoNaNsFPMath && Options.NoInfsFPMath) ||
(N->getFlags().hasNoNaNs() && N->getFlags().hasNoInfs())) {
if (Options.NoSignedZerosFPMath || N->getFlags().hasNoSignedZeros() ||
(N2CFP && !N2CFP->isExactlyValue(-0.0))) {
diff --git a/llvm/test/CodeGen/X86/dag-combiner-fma-folding.ll b/llvm/test/CodeGen/X86/dag-combiner-fma-folding.ll
index 2bd7dc445a02b..6291100f42c3d 100644
--- a/llvm/test/CodeGen/X86/dag-combiner-fma-folding.ll
+++ b/llvm/test/CodeGen/X86/dag-combiner-fma-folding.ll
@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=x86_64-- --start-before=x86-isel -mattr=+avx,+fma %s -o - | FileCheck %s
+; RUN: llc -mtriple=x86_64-- --start-before=x86-isel -mattr=+avx,+fma %s -o - -fp-contract=fast | FileCheck %s
define double @fma_folding(double %x) {
; CHECK-LABEL: fma_folding:
@@ -20,3 +21,14 @@ define double @fma_no_folding(double %x) {
%fused = call contract nnan ninf double @llvm.fma.f64(double %x, double 0.0, double -0.0)
ret double %fused
}
+
+define double @fma_no_fold_potential_nan(double %x) {
+; CHECK-LABEL: fma_no_fold_potential_nan:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1
+; CHECK-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + mem
+; CHECK-NEXT: retq
+ %fused = call contract double @llvm.fma.f64(double %x, double 0.0, double 1.0)
+ ret double %fused
+}
+
|
I have verified and it fixes the bug in jax-ml/jax#4780 |
we are also blocked on it internally. So would appreciate if we can get a quick a review here sooner. |
I mean...do you want to review the change? |
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.
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/153/builds/36665 Here is the relevant piece of the build log for the reference
|
; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1 | ||
; CHECK-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + mem | ||
; CHECK-NEXT: retq | ||
%fused = call contract double @llvm.fma.f64(double %x, double 0.0, double 1.0) |
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.
Doesn't need contract flag?
After 901e139 (#127770), the DAG combine would transform
fma(x, 0.0, 1.0)
into1.0
if-fp-contract=fast
was enabled, in addition to when 'x' is marked nnan/ninf.It's only valid in the latter case, not the former, so delete the extra condition.