Skip to content

Commit bc2784f

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

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1600,7 +1600,18 @@ Instruction *InstCombinerImpl::foldFDivConstantDivisor(BinaryOperator &I) {
16001600
// nnan X / +0.0 -> copysign(inf, X)
16011601
if (I.hasNoNaNs() && match(I.getOperand(1), m_Zero())) {
16021602
IRBuilder<> B(&I);
1603-
// TODO: nnan nsz X / -0.0 -> copysign(inf, X)
1603+
CallInst *CopySign = B.CreateIntrinsic(
1604+
Intrinsic::copysign, {C->getType()},
1605+
{ConstantFP::getInfinity(I.getType()), I.getOperand(0)}, &I);
1606+
CopySign->takeName(&I);
1607+
return replaceInstUsesWith(I, CopySign);
1608+
}
1609+
1610+
// nnan nsz X / -0.0 -> copysign(inf, X)
1611+
if (I.hasNoNaNs() && I.hasNoSignedZeros() &&
1612+
match(I.getOperand(1), m_Specific(ConstantFP::get(
1613+
Type::getDoubleTy(I.getContext()), -0.0)))) {
1614+
IRBuilder<> B(&I);
16041615
CallInst *CopySign = B.CreateIntrinsic(
16051616
Intrinsic::copysign, {C->getType()},
16061617
{ConstantFP::getInfinity(I.getType()), I.getOperand(0)}, &I);

llvm/test/Transforms/InstCombine/fdiv.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1004,7 +1004,7 @@ define double @test_positive_zero(double %X) {
10041004

10051005
define double @test_negative_zero(double %X) {
10061006
; CHECK-LABEL: @test_negative_zero(
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

0 commit comments

Comments
 (0)