[llvm] 5265be1 - [InstSimply] Simplify `(fmul -x, +/-0)` -> `-/+0`
Noah Goldstein via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 18 13:12:14 PDT 2024
Author: Noah Goldstein
Date: 2024-03-18T15:11:55-05:00
New Revision: 5265be11b1bbf5d744cf564dce91e789e2ab4c9e
URL: https://github.com/llvm/llvm-project/commit/5265be11b1bbf5d744cf564dce91e789e2ab4c9e
DIFF: https://github.com/llvm/llvm-project/commit/5265be11b1bbf5d744cf564dce91e789e2ab4c9e.diff
LOG: [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
Closes #85345
Added:
Modified:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index d14897a86314e1..06283cb4bb934b 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -5767,11 +5767,16 @@ 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 foldConstant(Instruction::FNeg, Op1, Q);
+ }
}
// 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 ffdca34b529b43..5d17504c09df67 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 <2 x float> @src_mul_zero_neg(<2 x float> nofpclass(inf nan pzero psub pnorm) %f) {
; CHECK-LABEL: @src_mul_zero_neg(
-; CHECK-NEXT: [[R:%.*]] = fmul <2 x float> zeroinitializer, [[F:%.*]]
-; CHECK-NEXT: ret <2 x float> [[R]]
+; CHECK-NEXT: ret <2 x float> <float -0.000000e+00, float -0.000000e+00>
;
%r = fmul <2 x float> <float 0.0, float 0.0>, %f
ret <2 x float> %r
@@ -231,8 +229,7 @@ define <2 x float> @src_mul_zero_neg(<2 x float> nofpclass(inf nan pzero psub pn
define <2 x float> @src_mul_zero_and_nzero_neg(<2 x float> nofpclass(inf nan pzero psub pnorm) %f) {
; CHECK-LABEL: @src_mul_zero_and_nzero_neg(
-; CHECK-NEXT: [[R:%.*]] = fmul <2 x float> <float -0.000000e+00, float 0.000000e+00>, [[F:%.*]]
-; CHECK-NEXT: ret <2 x float> [[R]]
+; CHECK-NEXT: ret <2 x float> <float 0.000000e+00, float -0.000000e+00>
;
%r = fmul <2 x float> <float -0.0, float 0.0>, %f
ret <2 x float> %r
More information about the llvm-commits
mailing list