Skip to content

Commit 3749625

Browse files
committed
implement cache
1 parent b075896 commit 3749625

File tree

3 files changed

+38
-21
lines changed

3 files changed

+38
-21
lines changed

llvm/include/llvm/CodeGen/GlobalISel/GISelValueTracking.h

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class GISelValueTracking : public GISelChangeObserver {
3838
unsigned MaxDepth;
3939
/// Cache maintained during a computeKnownBits request.
4040
SmallDenseMap<Register, KnownBits, 16> ComputeKnownBitsCache;
41+
SmallDenseMap<Register, KnownFPClass, 16> ComputeKnownFPClassCache;
4142

4243
void computeKnownBitsMin(Register Src0, Register Src1, KnownBits &Known,
4344
const APInt &DemandedElts, unsigned Depth = 0);
@@ -112,23 +113,20 @@ class GISelValueTracking : public GISelChangeObserver {
112113
/// floating point classes should be queried. Queries not specified in \p
113114
/// InterestedClasses should be reliable if they are determined during the
114115
/// query.
115-
KnownFPClass computeKnownFPClass(Register R, const APInt &DemandedElts,
116-
FPClassTest InterestedClasses,
117-
unsigned Depth);
116+
KnownFPClass getKnownFPClass(Register R, const APInt &DemandedElts,
117+
FPClassTest InterestedClasses, unsigned Depth);
118118

119-
KnownFPClass computeKnownFPClass(Register R,
120-
FPClassTest InterestedClasses = fcAllFlags,
121-
unsigned Depth = 0);
119+
KnownFPClass getKnownFPClass(Register R,
120+
FPClassTest InterestedClasses = fcAllFlags,
121+
unsigned Depth = 0);
122122

123123
/// Wrapper to account for known fast math flags at the use instruction.
124-
KnownFPClass computeKnownFPClass(Register R, const APInt &DemandedElts,
125-
uint32_t Flags,
126-
FPClassTest InterestedClasses,
127-
unsigned Depth);
128-
129-
KnownFPClass computeKnownFPClass(Register R, uint32_t Flags,
130-
FPClassTest InterestedClasses,
131-
unsigned Depth);
124+
KnownFPClass getKnownFPClass(Register R, const APInt &DemandedElts,
125+
uint32_t Flags, FPClassTest InterestedClasses,
126+
unsigned Depth);
127+
128+
KnownFPClass getKnownFPClass(Register R, uint32_t Flags,
129+
FPClassTest InterestedClasses, unsigned Depth);
132130

133131
// Observer API. No-op for non-caching implementation.
134132
void erasingInstr(MachineInstr &MI) override {}

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,12 @@ void GISelValueTracking::computeKnownFPClass(Register R,
751751
return;
752752
}
753753

754+
auto CacheEntry = ComputeKnownFPClassCache.find(R);
755+
if (CacheEntry != ComputeKnownFPClassCache.end()) {
756+
Known = CacheEntry->second;
757+
return;
758+
}
759+
754760
if (auto Cst = GFConstant::getConstant(R, MRI)) {
755761
switch (Cst->getKind()) {
756762
case GFConstant::GFConstantKind::Scalar: {
@@ -1816,25 +1822,38 @@ void GISelValueTracking::computeKnownFPClass(Register R,
18161822
break;
18171823
}
18181824
}
1825+
1826+
// Update the cache.
1827+
ComputeKnownFPClassCache[R] = Known;
18191828
}
18201829

18211830
KnownFPClass
1822-
GISelValueTracking::computeKnownFPClass(Register R, const APInt &DemandedElts,
1831+
GISelValueTracking::getKnownFPClass(Register R, const APInt &DemandedElts,
18231832
FPClassTest InterestedClasses,
18241833
unsigned Depth) {
1834+
// For now, we only maintain the cache during one request.
1835+
assert(ComputeKnownFPClassCache.empty() && "Cache should have been cleared");
1836+
18251837
KnownFPClass KnownClasses;
18261838
computeKnownFPClass(R, DemandedElts, InterestedClasses, KnownClasses, Depth);
1839+
ComputeKnownFPClassCache.clear();
1840+
18271841
return KnownClasses;
18281842
}
18291843

1830-
KnownFPClass GISelValueTracking::computeKnownFPClass(
1844+
KnownFPClass GISelValueTracking::getKnownFPClass(
18311845
Register R, FPClassTest InterestedClasses, unsigned Depth) {
1846+
// For now, we only maintain the cache during one request.
1847+
assert(ComputeKnownFPClassCache.empty() && "Cache should have been cleared");
1848+
18321849
KnownFPClass Known;
18331850
computeKnownFPClass(R, Known, InterestedClasses, Depth);
1851+
ComputeKnownFPClassCache.clear();
1852+
18341853
return Known;
18351854
}
18361855

1837-
KnownFPClass GISelValueTracking::computeKnownFPClass(
1856+
KnownFPClass GISelValueTracking::getKnownFPClass(
18381857
Register R, const APInt &DemandedElts, uint32_t Flags,
18391858
FPClassTest InterestedClasses, unsigned Depth) {
18401859
if (Flags & MachineInstr::MIFlag::FmNoNans)
@@ -1843,7 +1862,7 @@ KnownFPClass GISelValueTracking::computeKnownFPClass(
18431862
InterestedClasses &= ~fcInf;
18441863

18451864
KnownFPClass Result =
1846-
computeKnownFPClass(R, DemandedElts, InterestedClasses, Depth);
1865+
getKnownFPClass(R, DemandedElts, InterestedClasses, Depth);
18471866

18481867
if (Flags & MachineInstr::MIFlag::FmNoNans)
18491868
Result.KnownFPClasses &= ~fcNan;
@@ -1852,12 +1871,12 @@ KnownFPClass GISelValueTracking::computeKnownFPClass(
18521871
return Result;
18531872
}
18541873

1855-
KnownFPClass GISelValueTracking::computeKnownFPClass(
1874+
KnownFPClass GISelValueTracking::getKnownFPClass(
18561875
Register R, uint32_t Flags, FPClassTest InterestedClasses, unsigned Depth) {
18571876
LLT Ty = MRI.getType(R);
18581877
APInt DemandedElts =
18591878
Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
1860-
return computeKnownFPClass(R, DemandedElts, Flags, InterestedClasses, Depth);
1879+
return getKnownFPClass(R, DemandedElts, Flags, InterestedClasses, Depth);
18611880
}
18621881

18631882
/// Compute number of sign bits for the intersection of \p Src0 and \p Src1

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI,
817817
if (DefMI->getFlag(MachineInstr::FmNoNans) || TM.Options.NoNaNsFPMath)
818818
return true;
819819

820-
KnownFPClass FPClass = VT->computeKnownFPClass(Val, fcNan);
820+
KnownFPClass FPClass = VT->getKnownFPClass(Val, fcNan);
821821
if (SNaN)
822822
return FPClass.isKnownNever(fcSNan);
823823

0 commit comments

Comments
 (0)