Skip to content

Commit 0573290

Browse files
committed
[InstCombine] Resolve TODO: nnan nsz X / -0.0 -> copysign(inf, X)
1 parent 00c98e4 commit 0573290

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -1598,9 +1598,11 @@ Instruction *InstCombinerImpl::foldFDivConstantDivisor(BinaryOperator &I) {
15981598
return BinaryOperator::CreateFDivFMF(X, NegC, &I);
15991599

16001600
// nnan X / +0.0 -> copysign(inf, X)
1601-
if (I.hasNoNaNs() && match(I.getOperand(1), m_Zero())) {
1601+
// nnan nsz X / -0.0 -> copysign(inf, X)
1602+
if (I.hasNoNaNs() &&
1603+
(match(I.getOperand(1), m_PosZeroFP()) ||
1604+
(I.hasNoSignedZeros() && match(I.getOperand(1), m_AnyZeroFP())))) {
16021605
IRBuilder<> B(&I);
1603-
// TODO: nnan nsz X / -0.0 -> copysign(inf, X)
16041606
CallInst *CopySign = B.CreateIntrinsic(
16051607
Intrinsic::copysign, {C->getType()},
16061608
{ConstantFP::getInfinity(I.getType()), I.getOperand(0)}, &I);

llvm/test/Transforms/InstCombine/fdiv.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -1004,7 +1004,7 @@ define double @test_positive_zero_nsz(double %X) {
10041004

10051005
define double @test_negative_zero_nsz(double %X) {
10061006
; CHECK-LABEL: @test_negative_zero_nsz(
1007-
; CHECK-NEXT: [[TMP1:%.*]] = fdiv nnan nsz double [[X:%.*]], -0.000000e+00
1007+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.copysign.f64(double 0x7FF0000000000000, double [[X:%.*]])
10081008
; CHECK-NEXT: ret double [[TMP1]]
10091009
;
10101010
%1 = fdiv nnan nsz double %X, -0.0
@@ -1040,7 +1040,7 @@ define <2 x double> @test_positive_zero_vector_nsz(<2 x double> %X) {
10401040

10411041
define <2 x double> @test_negative_zero_vector_nsz(<2 x double> %X) {
10421042
; CHECK-LABEL: @test_negative_zero_vector_nsz(
1043-
; CHECK-NEXT: [[TMP1:%.*]] = fdiv nnan nsz <2 x double> [[X:%.*]], <double -0.000000e+00, double 0.000000e+00>
1043+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz <2 x double> @llvm.copysign.v2f64(<2 x double> <double 0x7FF0000000000000, double 0x7FF0000000000000>, <2 x double> [[X:%.*]])
10441044
; CHECK-NEXT: ret <2 x double> [[TMP1]]
10451045
;
10461046
%1 = fdiv nnan nsz <2 x double> %X, <double -0.0, double 0.0>

0 commit comments

Comments
 (0)