@@ -751,6 +751,12 @@ void GISelValueTracking::computeKnownFPClass(Register R,
751
751
return ;
752
752
}
753
753
754
+ auto CacheEntry = ComputeKnownFPClassCache.find (R);
755
+ if (CacheEntry != ComputeKnownFPClassCache.end ()) {
756
+ Known = CacheEntry->second ;
757
+ return ;
758
+ }
759
+
754
760
if (auto Cst = GFConstant::getConstant (R, MRI)) {
755
761
switch (Cst->getKind ()) {
756
762
case GFConstant::GFConstantKind::Scalar: {
@@ -1816,25 +1822,38 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1816
1822
break ;
1817
1823
}
1818
1824
}
1825
+
1826
+ // Update the cache.
1827
+ ComputeKnownFPClassCache[R] = Known;
1819
1828
}
1820
1829
1821
1830
KnownFPClass
1822
- GISelValueTracking::computeKnownFPClass (Register R, const APInt &DemandedElts,
1831
+ GISelValueTracking::getKnownFPClass (Register R, const APInt &DemandedElts,
1823
1832
FPClassTest InterestedClasses,
1824
1833
unsigned Depth) {
1834
+ // For now, we only maintain the cache during one request.
1835
+ assert (ComputeKnownFPClassCache.empty () && " Cache should have been cleared" );
1836
+
1825
1837
KnownFPClass KnownClasses;
1826
1838
computeKnownFPClass (R, DemandedElts, InterestedClasses, KnownClasses, Depth);
1839
+ ComputeKnownFPClassCache.clear ();
1840
+
1827
1841
return KnownClasses;
1828
1842
}
1829
1843
1830
- KnownFPClass GISelValueTracking::computeKnownFPClass (
1844
+ KnownFPClass GISelValueTracking::getKnownFPClass (
1831
1845
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
+
1832
1849
KnownFPClass Known;
1833
1850
computeKnownFPClass (R, Known, InterestedClasses, Depth);
1851
+ ComputeKnownFPClassCache.clear ();
1852
+
1834
1853
return Known;
1835
1854
}
1836
1855
1837
- KnownFPClass GISelValueTracking::computeKnownFPClass (
1856
+ KnownFPClass GISelValueTracking::getKnownFPClass (
1838
1857
Register R, const APInt &DemandedElts, uint32_t Flags,
1839
1858
FPClassTest InterestedClasses, unsigned Depth) {
1840
1859
if (Flags & MachineInstr::MIFlag::FmNoNans)
@@ -1843,7 +1862,7 @@ KnownFPClass GISelValueTracking::computeKnownFPClass(
1843
1862
InterestedClasses &= ~fcInf;
1844
1863
1845
1864
KnownFPClass Result =
1846
- computeKnownFPClass (R, DemandedElts, InterestedClasses, Depth);
1865
+ getKnownFPClass (R, DemandedElts, InterestedClasses, Depth);
1847
1866
1848
1867
if (Flags & MachineInstr::MIFlag::FmNoNans)
1849
1868
Result.KnownFPClasses &= ~fcNan;
@@ -1852,12 +1871,12 @@ KnownFPClass GISelValueTracking::computeKnownFPClass(
1852
1871
return Result;
1853
1872
}
1854
1873
1855
- KnownFPClass GISelValueTracking::computeKnownFPClass (
1874
+ KnownFPClass GISelValueTracking::getKnownFPClass (
1856
1875
Register R, uint32_t Flags, FPClassTest InterestedClasses, unsigned Depth) {
1857
1876
LLT Ty = MRI.getType (R);
1858
1877
APInt DemandedElts =
1859
1878
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);
1861
1880
}
1862
1881
1863
1882
// / Compute number of sign bits for the intersection of \p Src0 and \p Src1
0 commit comments