Skip to content

Commit 57f5935

Browse files
committed
guard against non-virtual registers
1 parent 6b25f44 commit 57f5935

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,9 @@ static bool outputDenormalIsIEEEOrPosZero(const MachineFunction &MF, LLT Ty) {
715715
void GISelValueTracking::computeKnownFPClass(Register R, KnownFPClass &Known,
716716
FPClassTest InterestedClasses,
717717
unsigned Depth) {
718+
if (!R.isVirtual())
719+
return;
720+
718721
LLT Ty = MRI.getType(R);
719722
APInt DemandedElts =
720723
Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
@@ -758,6 +761,9 @@ void GISelValueTracking::computeKnownFPClass(Register R,
758761

759762
assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
760763

764+
if (!R.isVirtual())
765+
return;
766+
761767
MachineInstr &MI = *MRI.getVRegDef(R);
762768
unsigned Opcode = MI.getOpcode();
763769
LLT DstTy = MRI.getType(R);
@@ -1046,7 +1052,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
10461052
//
10471053
if ((Known.KnownFPClasses & fcZero) != fcNone &&
10481054
!Known.isKnownNeverSubnormal()) {
1049-
DenormalMode Mode = MF->getDenormalMode(getFltSemanticForLLT(DstTy));
1055+
DenormalMode Mode = MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()));
10501056
if (Mode != DenormalMode::getIEEE())
10511057
Known.KnownFPClasses |= fcZero;
10521058
}
@@ -1108,8 +1114,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
11081114

11091115
// If the parent function flushes denormals, the canonical output cannot
11101116
// be a denormal.
1111-
LLT Ty = MRI.getType(Val);
1112-
const fltSemantics &FPType = getFltSemanticForLLT(Ty.getScalarType());
1117+
LLT Ty = MRI.getType(Val).getScalarType();
1118+
const fltSemantics &FPType = getFltSemanticForLLT(Ty);
11131119
DenormalMode DenormMode = MF->getDenormalMode(FPType);
11141120
if (DenormMode == DenormalMode::getIEEE()) {
11151121
if (KnownSrc.isKnownNever(fcPosZero))
@@ -1219,8 +1225,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
12191225
if (KnownSrc.isKnownNeverNaN() && KnownSrc.cannotBeOrderedLessThanZero())
12201226
Known.knownNot(fcNan);
12211227

1222-
LLT Ty = MRI.getType(Val);
1223-
const fltSemantics &FltSem = getFltSemanticForLLT(Ty.getScalarType());
1228+
LLT Ty = MRI.getType(Val).getScalarType();
1229+
const fltSemantics &FltSem = getFltSemanticForLLT(Ty);
12241230
DenormalMode Mode = MF->getDenormalMode(FltSem);
12251231

12261232
if (KnownSrc.isKnownNeverLogicalZero(Mode))
@@ -1339,18 +1345,18 @@ void GISelValueTracking::computeKnownFPClass(Register R,
13391345

13401346
// (fadd x, 0.0) is guaranteed to return +0.0, not -0.0.
13411347
if ((KnownLHS.isKnownNeverLogicalNegZero(
1342-
MF->getDenormalMode(getFltSemanticForLLT(DstTy))) ||
1348+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()))) ||
13431349
KnownRHS.isKnownNeverLogicalNegZero(
1344-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) &&
1350+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))) &&
13451351
// Make sure output negative denormal can't flush to -0
13461352
outputDenormalIsIEEEOrPosZero(*MF, DstTy))
13471353
Known.knownNot(fcNegZero);
13481354
} else {
13491355
// Only fsub -0, +0 can return -0
13501356
if ((KnownLHS.isKnownNeverLogicalNegZero(
1351-
MF->getDenormalMode(getFltSemanticForLLT(DstTy))) ||
1357+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType()))) ||
13521358
KnownRHS.isKnownNeverLogicalPosZero(
1353-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) &&
1359+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))) &&
13541360
// Make sure output negative denormal can't flush to -0
13551361
outputDenormalIsIEEEOrPosZero(*MF, DstTy))
13561362
Known.knownNot(fcNegZero);
@@ -1397,10 +1403,10 @@ void GISelValueTracking::computeKnownFPClass(Register R,
13971403

13981404
if ((KnownRHS.isKnownNeverInfinity() ||
13991405
KnownLHS.isKnownNeverLogicalZero(
1400-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) &&
1406+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))) &&
14011407
(KnownLHS.isKnownNeverInfinity() ||
14021408
KnownRHS.isKnownNeverLogicalZero(
1403-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))))
1409+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))))
14041410
Known.knownNot(fcNan);
14051411

14061412
break;
@@ -1453,9 +1459,9 @@ void GISelValueTracking::computeKnownFPClass(Register R,
14531459
(KnownLHS.isKnownNeverInfinity() ||
14541460
KnownRHS.isKnownNeverInfinity()) &&
14551461
((KnownLHS.isKnownNeverLogicalZero(
1456-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) ||
1462+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))) ||
14571463
(KnownRHS.isKnownNeverLogicalZero(
1458-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))))) {
1464+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))))) {
14591465
Known.knownNot(fcNan);
14601466
}
14611467

@@ -1469,7 +1475,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
14691475
if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
14701476
KnownLHS.isKnownNeverInfinity() &&
14711477
KnownRHS.isKnownNeverLogicalZero(
1472-
MF->getDenormalMode(getFltSemanticForLLT(DstTy)))) {
1478+
MF->getDenormalMode(getFltSemanticForLLT(DstTy.getScalarType())))) {
14731479
Known.knownNot(fcNan);
14741480
}
14751481

@@ -1494,10 +1500,10 @@ void GISelValueTracking::computeKnownFPClass(Register R,
14941500
// Infinity, nan and zero propagate from source.
14951501
computeKnownFPClass(R, DemandedElts, InterestedClasses, Known, Depth + 1);
14961502

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());
1503+
LLT DstTy = MRI.getType(Dst).getScalarType();
1504+
const fltSemantics &DstSem = getFltSemanticForLLT(DstTy);
1505+
LLT SrcTy = MRI.getType(Src).getScalarType();
1506+
const fltSemantics &SrcSem = getFltSemanticForLLT(SrcTy);
15011507

15021508
// All subnormal inputs should be in the normal range in the result type.
15031509
if (APFloat::isRepresentableAsNormalIn(SrcSem, DstSem)) {

0 commit comments

Comments
 (0)