[llvm] [InstCombine] Resolve TODO: nnan nsz X / -0.0 -> copysign(inf, X) (PR #79766)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 6 09:58:42 PST 2024
https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/79766
>From 07de8a65273e75cb06abbecbea0dfe64d8bfea9d Mon Sep 17 00:00:00 2001
From: Rose <83477269+AtariDreams at users.noreply.github.com>
Date: Sun, 28 Jan 2024 15:04:34 -0500
Subject: [PATCH 1/2] [InstCombine] pre-commit tests (NFC)
---
llvm/test/Transforms/InstCombine/fdiv.ll | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/fdiv.ll b/llvm/test/Transforms/InstCombine/fdiv.ll
index c81a9ba6d4215..59984ce427f87 100644
--- a/llvm/test/Transforms/InstCombine/fdiv.ll
+++ b/llvm/test/Transforms/InstCombine/fdiv.ll
@@ -992,3 +992,22 @@ define float @fdiv_nnan_neg_zero_f32(float %x) {
%fdiv = fdiv nnan float %x, -0.0
ret float %fdiv
}
+
+define double @test_positive_zero(double %X) {
+; CHECK-LABEL: @test_positive_zero(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.copysign.f64(double 0x7FF0000000000000, double [[X:%.*]])
+; CHECK-NEXT: ret double [[TMP1]]
+;
+ %1 = fdiv nnan nsz double %X, 0.0
+ ret double %1
+}
+
+define double @test_negative_zero(double %X) {
+; CHECK-LABEL: @test_negative_zero(
+; CHECK-NEXT: [[TMP1:%.*]] = fdiv nnan nsz double [[X:%.*]], -0.000000e+00
+; CHECK-NEXT: ret double [[TMP1]]
+;
+ %1 = fdiv nnan nsz double %X, -0.0
+ ret double %1
+}
+
>From 8f81d98cd5f2102c6aab4db53d440be614270533 Mon Sep 17 00:00:00 2001
From: Rose <83477269+AtariDreams at users.noreply.github.com>
Date: Sun, 28 Jan 2024 13:30:29 -0500
Subject: [PATCH 2/2] [InstCombine] Resolve TODO: nnan nsz X / -0.0 ->
copysign(inf, X)
---
llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 6 ++++--
llvm/test/Transforms/InstCombine/fdiv.ll | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 6c3adf00c189a..f9cee9dfcfada 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -1598,9 +1598,11 @@ Instruction *InstCombinerImpl::foldFDivConstantDivisor(BinaryOperator &I) {
return BinaryOperator::CreateFDivFMF(X, NegC, &I);
// nnan X / +0.0 -> copysign(inf, X)
- if (I.hasNoNaNs() && match(I.getOperand(1), m_Zero())) {
+ // nnan nsz X / -0.0 -> copysign(inf, X)
+ if (I.hasNoNaNs() &&
+ (match(I.getOperand(1), m_PosZeroFP()) ||
+ (I.hasNoSignedZeros() && match(I.getOperand(1), m_AnyZeroFP())))) {
IRBuilder<> B(&I);
- // TODO: nnan nsz X / -0.0 -> copysign(inf, X)
CallInst *CopySign = B.CreateIntrinsic(
Intrinsic::copysign, {C->getType()},
{ConstantFP::getInfinity(I.getType()), I.getOperand(0)}, &I);
diff --git a/llvm/test/Transforms/InstCombine/fdiv.ll b/llvm/test/Transforms/InstCombine/fdiv.ll
index 59984ce427f87..e0aeb68402233 100644
--- a/llvm/test/Transforms/InstCombine/fdiv.ll
+++ b/llvm/test/Transforms/InstCombine/fdiv.ll
@@ -1004,7 +1004,7 @@ define double @test_positive_zero(double %X) {
define double @test_negative_zero(double %X) {
; CHECK-LABEL: @test_negative_zero(
-; CHECK-NEXT: [[TMP1:%.*]] = fdiv nnan nsz double [[X:%.*]], -0.000000e+00
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.copysign.f64(double 0x7FF0000000000000, double [[X:%.*]])
; CHECK-NEXT: ret double [[TMP1]]
;
%1 = fdiv nnan nsz double %X, -0.0
More information about the llvm-commits
mailing list