Skip to content

Commit c3ea251

Browse files
tgymnichtomtor
authored andcommitted
[GISel] KnownFPClass ValueTracking fix handling of vectors (llvm#143372)
1 parent f1e6bf8 commit c3ea251

File tree

2 files changed

+129
-26
lines changed

2 files changed

+129
-26
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
10461046
//
10471047
if ((Known.KnownFPClasses & fcZero) != fcNone &&
10481048
!Known.isKnownNeverSubnormal()) {
1049-
DenormalMode Mode = MF->getDenormalMode(getFltSemanticForLLT(DstTy));
1049+
DenormalMode Mode =
1050+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
10501051
if (Mode != DenormalMode::getIEEE())
10511052
Known.KnownFPClasses |= fcZero;
10521053
}
@@ -1108,8 +1109,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
11081109

11091110
// If the parent function flushes denormals, the canonical output cannot
11101111
// be a denormal.
1111-
LLT Ty = MRI.getType(Val);
1112-
const fltSemantics &FPType = getFltSemanticForLLT(Ty.getScalarType());
1112+
LLT Ty = MRI.getType(Val).getScalarType();
1113+
const fltSemantics &FPType = getFltSemanticForLLT(Ty);
11131114
DenormalMode DenormMode = MF->getDenormalMode(FPType);
11141115
if (DenormMode == DenormalMode::getIEEE()) {
11151116
if (KnownSrc.isKnownNever(fcPosZero))
@@ -1219,8 +1220,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
12191220
if (KnownSrc.isKnownNeverNaN() && KnownSrc.cannotBeOrderedLessThanZero())
12201221
Known.knownNot(fcNan);
12211222

1222-
LLT Ty = MRI.getType(Val);
1223-
const fltSemantics &FltSem = getFltSemanticForLLT(Ty.getScalarType());
1223+
LLT Ty = MRI.getType(Val).getScalarType();
1224+
const fltSemantics &FltSem = getFltSemanticForLLT(Ty);
12241225
DenormalMode Mode = MF->getDenormalMode(FltSem);
12251226

12261227
if (KnownSrc.isKnownNeverLogicalZero(Mode))
@@ -1338,19 +1339,19 @@ void GISelValueTracking::computeKnownFPClass(Register R,
13381339
Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
13391340

13401341
// (fadd x, 0.0) is guaranteed to return +0.0, not -0.0.
1341-
if ((KnownLHS.isKnownNeverLogicalNegZero(
1342-
MF->getDenormalMode(getFltSemanticForLLT(DstTy))) ||
1343-
KnownRHS.isKnownNeverLogicalNegZero(
1344-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) &&
1342+
if ((KnownLHS.isKnownNeverLogicalNegZero(MF->getDenormalMode(
1343+
getFltSemanticForLLT(DstTy.getScalarType()))) ||
1344+
KnownRHS.isKnownNeverLogicalNegZero(MF->getDenormalMode(
1345+
getFltSemanticForLLT(DstTy.getScalarType())))) &&
13451346
// Make sure output negative denormal can't flush to -0
13461347
outputDenormalIsIEEEOrPosZero(*MF, DstTy))
13471348
Known.knownNot(fcNegZero);
13481349
} else {
13491350
// Only fsub -0, +0 can return -0
1350-
if ((KnownLHS.isKnownNeverLogicalNegZero(
1351-
MF->getDenormalMode(getFltSemanticForLLT(DstTy))) ||
1352-
KnownRHS.isKnownNeverLogicalPosZero(
1353-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) &&
1351+
if ((KnownLHS.isKnownNeverLogicalNegZero(MF->getDenormalMode(
1352+
getFltSemanticForLLT(DstTy.getScalarType()))) ||
1353+
KnownRHS.isKnownNeverLogicalPosZero(MF->getDenormalMode(
1354+
getFltSemanticForLLT(DstTy.getScalarType())))) &&
13541355
// Make sure output negative denormal can't flush to -0
13551356
outputDenormalIsIEEEOrPosZero(*MF, DstTy))
13561357
Known.knownNot(fcNegZero);
@@ -1396,11 +1397,11 @@ void GISelValueTracking::computeKnownFPClass(Register R,
13961397
}
13971398

13981399
if ((KnownRHS.isKnownNeverInfinity() ||
1399-
KnownLHS.isKnownNeverLogicalZero(
1400-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) &&
1400+
KnownLHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1401+
getFltSemanticForLLT(DstTy.getScalarType())))) &&
14011402
(KnownLHS.isKnownNeverInfinity() ||
14021403
KnownRHS.isKnownNeverLogicalZero(
1403-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))))
1404+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))))
14041405
Known.knownNot(fcNan);
14051406

14061407
break;
@@ -1452,10 +1453,10 @@ void GISelValueTracking::computeKnownFPClass(Register R,
14521453
if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
14531454
(KnownLHS.isKnownNeverInfinity() ||
14541455
KnownRHS.isKnownNeverInfinity()) &&
1455-
((KnownLHS.isKnownNeverLogicalZero(
1456-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) ||
1457-
(KnownRHS.isKnownNeverLogicalZero(
1458-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))))) {
1456+
((KnownLHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1457+
getFltSemanticForLLT(DstTy.getScalarType())))) ||
1458+
(KnownRHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1459+
getFltSemanticForLLT(DstTy.getScalarType())))))) {
14591460
Known.knownNot(fcNan);
14601461
}
14611462

@@ -1468,8 +1469,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
14681469
// Inf REM x and x REM 0 produce NaN.
14691470
if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
14701471
KnownLHS.isKnownNeverInfinity() &&
1471-
KnownRHS.isKnownNeverLogicalZero(
1472-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) {
1472+
KnownRHS.isKnownNeverLogicalZero(MF->getDenormalMode(
1473+
getFltSemanticForLLT(DstTy.getScalarType())))) {
14731474
Known.knownNot(fcNan);
14741475
}
14751476

@@ -1494,10 +1495,10 @@ void GISelValueTracking::computeKnownFPClass(Register R,
14941495
// Infinity, nan and zero propagate from source.
14951496
computeKnownFPClass(R, DemandedElts, InterestedClasses, Known, Depth + 1);
14961497

1497-
LLT DstTy = MRI.getType(Dst);
1498-
const fltSemantics &DstSem = getFltSemanticForLLT(DstTy.getScalarType());
1499-
LLT SrcTy = MRI.getType(Src);
1500-
const fltSemantics &SrcSem = getFltSemanticForLLT(SrcTy.getScalarType());
1498+
LLT DstTy = MRI.getType(Dst).getScalarType();
1499+
const fltSemantics &DstSem = getFltSemanticForLLT(DstTy);
1500+
LLT SrcTy = MRI.getType(Src).getScalarType();
1501+
const fltSemantics &SrcSem = getFltSemanticForLLT(SrcTy);
15011502

15021503
// All subnormal inputs should be in the normal range in the result type.
15031504
if (APFloat::isRepresentableAsNormalIn(SrcSem, DstSem)) {
@@ -1690,6 +1691,10 @@ void GISelValueTracking::computeKnownFPClass(Register R,
16901691
}
16911692
case TargetOpcode::COPY: {
16921693
Register Src = MI.getOperand(1).getReg();
1694+
1695+
if (!Src.isVirtual())
1696+
return;
1697+
16931698
computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known, Depth + 1);
16941699
break;
16951700
}

llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,104 @@ TEST_F(AArch64GISelMITest, TestFPClassCstVecNegZero) {
9696
EXPECT_EQ(true, Known.SignBit);
9797
}
9898

99+
TEST_F(AArch64GISelMITest, TestFPClassCstZeroFPExt) {
100+
StringRef MIRString = R"(
101+
%c0:_(s32) = G_FCONSTANT float 0.0
102+
%ext:_(s64) = nnan ninf G_FPEXT %c0
103+
%copy_vector:_(s64) = COPY %ext
104+
)";
105+
106+
setUp(MIRString);
107+
if (!TM)
108+
GTEST_SKIP();
109+
110+
Register CopyReg = Copies[Copies.size() - 1];
111+
MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
112+
Register SrcReg = FinalCopy->getOperand(1).getReg();
113+
114+
GISelValueTracking Info(*MF);
115+
116+
KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
117+
118+
EXPECT_EQ(fcZero | fcNormal, Known.KnownFPClasses);
119+
EXPECT_EQ(std::nullopt, Known.SignBit);
120+
}
121+
122+
TEST_F(AArch64GISelMITest, TestFPClassCstVecZeroFPExt) {
123+
StringRef MIRString = R"(
124+
%c0:_(s32) = G_FCONSTANT float 0.0
125+
%c1:_(s32) = G_FCONSTANT float 0.0
126+
%c2:_(s32) = G_FCONSTANT float 0.0
127+
%vector:_(<3 x s32>) = G_BUILD_VECTOR %c0, %c1, %c2
128+
%ext:_(<3 x s64>) = nnan ninf G_FPEXT %vector
129+
%copy_vector:_(<3 x s64>) = COPY %ext
130+
)";
131+
132+
setUp(MIRString);
133+
if (!TM)
134+
GTEST_SKIP();
135+
136+
Register CopyReg = Copies[Copies.size() - 1];
137+
MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
138+
Register SrcReg = FinalCopy->getOperand(1).getReg();
139+
140+
GISelValueTracking Info(*MF);
141+
142+
KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
143+
144+
EXPECT_EQ(fcZero | fcNormal, Known.KnownFPClasses);
145+
EXPECT_EQ(std::nullopt, Known.SignBit);
146+
}
147+
148+
TEST_F(AArch64GISelMITest, TestFPClassCstZeroFPTrunc) {
149+
StringRef MIRString = R"(
150+
%c0:_(s64) = G_FCONSTANT double 0.0
151+
%trunc:_(s32) = nnan ninf G_FPTRUNC %c0
152+
%copy_vector:_(s32) = COPY %trunc
153+
)";
154+
155+
setUp(MIRString);
156+
if (!TM)
157+
GTEST_SKIP();
158+
159+
Register CopyReg = Copies[Copies.size() - 1];
160+
MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
161+
Register SrcReg = FinalCopy->getOperand(1).getReg();
162+
163+
GISelValueTracking Info(*MF);
164+
165+
KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
166+
167+
EXPECT_EQ(fcZero | fcPosSubnormal | fcPosNormal, Known.KnownFPClasses);
168+
EXPECT_EQ(false, Known.SignBit);
169+
}
170+
171+
TEST_F(AArch64GISelMITest, TestFPClassCstVecZeroFPTrunc) {
172+
StringRef MIRString = R"(
173+
%c0:_(s64) = G_FCONSTANT double 0.0
174+
%c1:_(s64) = G_FCONSTANT double 0.0
175+
%c2:_(s64) = G_FCONSTANT double 0.0
176+
%vector:_(<3 x s64>) = G_BUILD_VECTOR %c0, %c1, %c2
177+
%trunc:_(<3 x s32>) = nnan ninf G_FPTRUNC %vector
178+
%copy_vector:_(<3 x s32>) = COPY %trunc
179+
)";
180+
181+
setUp(MIRString);
182+
if (!TM)
183+
GTEST_SKIP();
184+
185+
Register CopyReg = Copies[Copies.size() - 1];
186+
MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
187+
Register SrcReg = FinalCopy->getOperand(1).getReg();
188+
189+
GISelValueTracking Info(*MF);
190+
191+
KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
192+
193+
EXPECT_EQ(fcZero | fcPosSubnormal | fcPosNormal, Known.KnownFPClasses);
194+
EXPECT_EQ(false, Known.SignBit);
195+
}
196+
99197
TEST_F(AArch64GISelMITest, TestFPClassSelectPos0) {
100198
StringRef MIRString = R"(
101199
%ptr:_(p0) = G_IMPLICIT_DEF

0 commit comments

Comments
 (0)