Skip to content

Commit 966f78b

Browse files
authored
[InstCombine] Resolve TODO: nnan nsz X / -0.0 -> copysign(inf, X) (#79766)
1 parent b0785cd commit 966f78b

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp

Lines changed: 4 additions & 2 deletions
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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,3 +992,75 @@ define float @fdiv_nnan_neg_zero_f32(float %x) {
992992
%fdiv = fdiv nnan float %x, -0.0
993993
ret float %fdiv
994994
}
995+
996+
define double @test_positive_zero_nsz(double %X) {
997+
; CHECK-LABEL: @test_positive_zero_nsz(
998+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.copysign.f64(double 0x7FF0000000000000, double [[X:%.*]])
999+
; CHECK-NEXT: ret double [[TMP1]]
1000+
;
1001+
%1 = fdiv nnan nsz double %X, 0.0
1002+
ret double %1
1003+
}
1004+
1005+
define double @test_negative_zero_nsz(double %X) {
1006+
; CHECK-LABEL: @test_negative_zero_nsz(
1007+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.copysign.f64(double 0x7FF0000000000000, double [[X:%.*]])
1008+
; CHECK-NEXT: ret double [[TMP1]]
1009+
;
1010+
%1 = fdiv nnan nsz double %X, -0.0
1011+
ret double %1
1012+
}
1013+
1014+
define double @test_positive_zero(double %X) {
1015+
; CHECK-LABEL: @test_positive_zero(
1016+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan double @llvm.copysign.f64(double 0x7FF0000000000000, double [[X:%.*]])
1017+
; CHECK-NEXT: ret double [[TMP1]]
1018+
;
1019+
%1 = fdiv nnan double %X, 0.0
1020+
ret double %1
1021+
}
1022+
1023+
define double @test_negative_zero(double %X) {
1024+
; CHECK-LABEL: @test_negative_zero(
1025+
; CHECK-NEXT: [[TMP1:%.*]] = fdiv nnan double [[X:%.*]], -0.000000e+00
1026+
; CHECK-NEXT: ret double [[TMP1]]
1027+
;
1028+
%1 = fdiv nnan double %X, -0.0
1029+
ret double %1
1030+
}
1031+
1032+
define <2 x double> @test_positive_zero_vector_nsz(<2 x double> %X) {
1033+
; CHECK-LABEL: @test_positive_zero_vector_nsz(
1034+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz <2 x double> @llvm.copysign.v2f64(<2 x double> <double 0x7FF0000000000000, double 0x7FF0000000000000>, <2 x double> [[X:%.*]])
1035+
; CHECK-NEXT: ret <2 x double> [[TMP1]]
1036+
;
1037+
%1 = fdiv nnan nsz <2 x double> %X, <double 0.0, double 0.0>
1038+
ret <2 x double> %1
1039+
}
1040+
1041+
define <2 x double> @test_negative_zero_vector_nsz(<2 x double> %X) {
1042+
; CHECK-LABEL: @test_negative_zero_vector_nsz(
1043+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz <2 x double> @llvm.copysign.v2f64(<2 x double> <double 0x7FF0000000000000, double 0x7FF0000000000000>, <2 x double> [[X:%.*]])
1044+
; CHECK-NEXT: ret <2 x double> [[TMP1]]
1045+
;
1046+
%1 = fdiv nnan nsz <2 x double> %X, <double -0.0, double 0.0>
1047+
ret <2 x double> %1
1048+
}
1049+
1050+
define <2 x double> @test_positive_zero_vector(<2 x double> %X) {
1051+
; CHECK-LABEL: @test_positive_zero_vector(
1052+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan <2 x double> @llvm.copysign.v2f64(<2 x double> <double 0x7FF0000000000000, double 0x7FF0000000000000>, <2 x double> [[X:%.*]])
1053+
; CHECK-NEXT: ret <2 x double> [[TMP1]]
1054+
;
1055+
%1 = fdiv nnan <2 x double> %X, <double 0.0, double 0.0>
1056+
ret <2 x double> %1
1057+
}
1058+
1059+
define <2 x double> @test_negative_zero_vector(<2 x double> %X) {
1060+
; CHECK-LABEL: @test_negative_zero_vector(
1061+
; CHECK-NEXT: [[TMP1:%.*]] = fdiv nnan <2 x double> [[X:%.*]], <double -0.000000e+00, double 0.000000e+00>
1062+
; CHECK-NEXT: ret <2 x double> [[TMP1]]
1063+
;
1064+
%1 = fdiv nnan <2 x double> %X, <double -0.0, double 0.0>
1065+
ret <2 x double> %1
1066+
}

0 commit comments

Comments
 (0)