Skip to content

Commit

Permalink
Add cache
Browse files Browse the repository at this point in the history
  • Loading branch information
jakobbotsch committed Aug 20, 2024
1 parent 115291e commit 91f2352
Showing 1 changed file with 31 additions and 14 deletions.
45 changes: 31 additions & 14 deletions src/coreclr/jit/ssabuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1349,6 +1349,8 @@ void Compiler::JitTestCheckSSA()
}
#endif // DEBUG

typedef JitHashTable<BasicBlock*, JitPtrKeyFuncs<BasicBlock>, unsigned> BlockToReachingDefMap;

class IncrementalSsaBuilder
{
Compiler* m_comp;
Expand All @@ -1358,8 +1360,9 @@ class IncrementalSsaBuilder
BitVecTraits m_poTraits;
BitVec m_defBlocks;
BitVec m_iteratedDominanceFrontiers;
BlockToReachingDefMap m_reachingDefCache;

UseDefLocation FindOrCreateReachingDef(const UseDefLocation& use);
unsigned FindOrCreateReachingDef(const UseDefLocation& use);
bool FindReachingDefInBlock(const UseDefLocation& use, BasicBlock* block, UseDefLocation* def);
bool FindReachingDefInSameStatement(const UseDefLocation& use, UseDefLocation* def);
Statement* LatestStatement(Statement* stmt1, Statement* stmt2);
Expand All @@ -1375,6 +1378,7 @@ class IncrementalSsaBuilder
, m_poTraits(comp->m_dfsTree->PostOrderTraits())
, m_defBlocks(BitVecOps::MakeEmpty(&m_poTraits))
, m_iteratedDominanceFrontiers(BitVecOps::MakeEmpty(&m_poTraits))
, m_reachingDefCache(comp->getAllocator(CMK_SSA))
{
}

Expand All @@ -1393,17 +1397,23 @@ class IncrementalSsaBuilder
// block.
//
// Returns:
// Location of a definition node that is the reaching def.
// SSA number of reaching def.
//
UseDefLocation IncrementalSsaBuilder::FindOrCreateReachingDef(const UseDefLocation& use)
unsigned IncrementalSsaBuilder::FindOrCreateReachingDef(const UseDefLocation& use)
{
unsigned cachedSsaNum = SsaConfig::RESERVED_SSA_NUM;
if ((use.Stmt == nullptr) && (use.Tree == nullptr) && m_reachingDefCache.Lookup(use.Block, &cachedSsaNum))
{
return cachedSsaNum;
}

UseDefLocation reachingDef;
for (BasicBlock* dom = use.Block; dom != nullptr; dom = dom->bbIDom)
{
UseDefLocation reachingDef;
if (BitVecOps::IsMember(&m_poTraits, m_defBlocks, dom->bbPostorderNum) &&
FindReachingDefInBlock(use, dom, &reachingDef))
{
return reachingDef;
break;
}

if (BitVecOps::IsMember(&m_poTraits, m_iteratedDominanceFrontiers, dom->bbPostorderNum))
Expand All @@ -1430,8 +1440,8 @@ UseDefLocation IncrementalSsaBuilder::FindOrCreateReachingDef(const UseDefLocati
}

// TODO: This cannot be recursive
UseDefLocation phiArgDef = FindOrCreateReachingDef(UseDefLocation(pred, nullptr, nullptr));
SsaBuilder::AddNewPhiArg(m_comp, dom, phiDef, phi, m_lclNum, phiArgDef.Tree->GetSsaNum(), pred);
unsigned phiArgSsaNum = FindOrCreateReachingDef(UseDefLocation(pred, nullptr, nullptr));
SsaBuilder::AddNewPhiArg(m_comp, dom, phiDef, phi, m_lclNum, phiArgSsaNum, pred);
}

m_comp->fgValueNumberPhiDef(phiDef->GetRootNode()->AsLclVar(), dom);
Expand All @@ -1440,12 +1450,19 @@ UseDefLocation IncrementalSsaBuilder::FindOrCreateReachingDef(const UseDefLocati
DISPSTMT(phiDef);
}

return UseDefLocation(dom, phiDef, phiDef->GetRootNode()->AsLclVar());
reachingDef = UseDefLocation(dom, phiDef, phiDef->GetRootNode()->AsLclVar());
break;
}
}

assert(!"Found use without any def");
unreached();
assert((reachingDef.Tree != nullptr) && !"Found use without any def");

if ((reachingDef.Block != use.Block) || ((use.Stmt == nullptr) && (use.Tree == nullptr)))
{
m_reachingDefCache.Set(use.Block, reachingDef.Tree->GetSsaNum());
}

return reachingDef.Tree->GetSsaNum();
}

//------------------------------------------------------------------------
Expand Down Expand Up @@ -1645,10 +1662,10 @@ void IncrementalSsaBuilder::Insert()
continue;
}

UseDefLocation def = FindOrCreateReachingDef(use);
use.Tree->SetSsaNum(def.Tree->GetSsaNum());
dsc->GetPerSsaData(def.Tree->GetSsaNum())->AddUse(use.Block);
JITDUMP(" [%06u] u:%u\n", Compiler::dspTreeID(use.Tree), def.Tree->GetSsaNum());
unsigned ssaNum = FindOrCreateReachingDef(use);
use.Tree->SetSsaNum(ssaNum);
dsc->GetPerSsaData(ssaNum)->AddUse(use.Block);
JITDUMP(" [%06u] u:%u\n", Compiler::dspTreeID(use.Tree), ssaNum);
}
}

Expand Down

0 comments on commit 91f2352

Please sign in to comment.