[llvm] [InstSimply] Add tests for simplify `(fmul -x, +/-0)` -> `-/+0` (PR #85345)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 14 18:08:01 PDT 2024
https://github.com/goldsteinn updated https://github.com/llvm/llvm-project/pull/85345
>From b7244bccd0d03c3280b95d91a2f5bec55ad14612 Mon Sep 17 00:00:00 2001
From: Noah Goldstein <goldstein.w.n at gmail.com>
Date: Thu, 14 Mar 2024 20:03:01 -0500
Subject: [PATCH 1/2] [InstSimply] Add tests for simplify `(fmul -x, +/-0)`;
NFC
---
.../InstSimplify/floating-point-arithmetic.ll | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
index b8244b1d508c62..9db62d7e5efc0f 100644
--- a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
+++ b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
@@ -211,6 +211,24 @@ define double @fmul_nnan_ninf_nneg_n0.0_commute(i127 %x) {
ret double %r
}
+define float @src_mul_nzero_neg(float nofpclass(inf nan pzero psub pnorm) %f) {
+; CHECK-LABEL: @src_mul_nzero_neg(
+; CHECK-NEXT: [[R:%.*]] = fmul float [[F:%.*]], -0.000000e+00
+; CHECK-NEXT: ret float [[R]]
+;
+ %r = fmul float %f, -0.0
+ ret float %r
+}
+
+define float @src_mul_zero_neg(float nofpclass(inf nan pzero psub pnorm) %f) {
+; CHECK-LABEL: @src_mul_zero_neg(
+; CHECK-NEXT: [[R:%.*]] = fmul float [[F:%.*]], 0.000000e+00
+; CHECK-NEXT: ret float [[R]]
+;
+ %r = fmul float %f, 0.0
+ ret float %r
+}
+
; Make sure we can infer %x can't be 0 based on assumes.
define { float, float } @test_fmul_0_assumed_finite(float %x) {
; CHECK-LABEL: @test_fmul_0_assumed_finite(
>From 6f53eaac2d4bae9cb5b0f597ee975a727c2617ee Mon Sep 17 00:00:00 2001
From: Noah Goldstein <goldstein.w.n at gmail.com>
Date: Thu, 14 Mar 2024 20:03:05 -0500
Subject: [PATCH 2/2] [InstSimply] Simplify `(fmul -x, +/-0)` -> `-/+0`
We already handle the `+x` case, and noticed it was missing in the bug
affecting #82555
Proofs: https://alive2.llvm.org/ce/z/WUSvmV
---
llvm/lib/Analysis/InstructionSimplify.cpp | 13 ++++++++++---
.../InstSimplify/floating-point-arithmetic.ll | 6 ++----
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index ce651783caf16b..434ee26ef01aa5 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -5767,11 +5767,18 @@ static Value *simplifyFMAFMul(Value *Op0, Value *Op1, FastMathFlags FMF,
if (FMF.noNaNs() && FMF.noSignedZeros())
return ConstantFP::getZero(Op0->getType());
- // +normal number * (-)0.0 --> (-)0.0
KnownFPClass Known =
computeKnownFPClass(Op0, FMF, fcInf | fcNan, /*Depth=*/0, Q);
- if (Known.SignBit == false && Known.isKnownNever(fcInf | fcNan))
- return Op1;
+ if (Known.isKnownNever(fcInf | fcNan)) {
+ // +normal number * (-)0.0 --> (-)0.0
+ if (Known.SignBit == false)
+ return Op1;
+ // -normal number * (-)0.0 --> -(-)0.0
+ if (Known.SignBit == true)
+ return match(Op1, m_PosZeroFP())
+ ? ConstantFP::getNegativeZero(Op0->getType())
+ : ConstantFP::getZero(Op0->getType());
+ }
}
// sqrt(X) * sqrt(X) --> X, if we can:
diff --git a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
index 9db62d7e5efc0f..9b913d68f4004e 100644
--- a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
+++ b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
@@ -213,8 +213,7 @@ define double @fmul_nnan_ninf_nneg_n0.0_commute(i127 %x) {
define float @src_mul_nzero_neg(float nofpclass(inf nan pzero psub pnorm) %f) {
; CHECK-LABEL: @src_mul_nzero_neg(
-; CHECK-NEXT: [[R:%.*]] = fmul float [[F:%.*]], -0.000000e+00
-; CHECK-NEXT: ret float [[R]]
+; CHECK-NEXT: ret float 0.000000e+00
;
%r = fmul float %f, -0.0
ret float %r
@@ -222,8 +221,7 @@ define float @src_mul_nzero_neg(float nofpclass(inf nan pzero psub pnorm) %f) {
define float @src_mul_zero_neg(float nofpclass(inf nan pzero psub pnorm) %f) {
; CHECK-LABEL: @src_mul_zero_neg(
-; CHECK-NEXT: [[R:%.*]] = fmul float [[F:%.*]], 0.000000e+00
-; CHECK-NEXT: ret float [[R]]
+; CHECK-NEXT: ret float -0.000000e+00
;
%r = fmul float %f, 0.0
ret float %r
More information about the llvm-commits
mailing list