Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit e290108

Browse files
committed
Use a shared bit vector for dominance computation
1 parent 48bf908 commit e290108

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

src/jit/ssabuilder.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ void Compiler::fgResetForSsa()
145145
SsaBuilder::SsaBuilder(Compiler* pCompiler)
146146
: m_pCompiler(pCompiler)
147147
, m_allocator(pCompiler, CMK_SSA)
148+
, m_visitedTraits(0, pCompiler) // at this point we do not know the size, SetupBBRoot can add a block
148149
#ifdef SSA_FEATURE_DOMARR
149150
, m_pDomPreOrder(nullptr)
150151
, m_pDomPostOrder(nullptr)
@@ -170,17 +171,17 @@ int SsaBuilder::TopologicalSort(BasicBlock** postOrder, int count)
170171
{
171172
Compiler* comp = m_pCompiler;
172173

173-
BitVecTraits traits(comp->fgBBNumMax + 1, comp);
174-
BitVec visited(BitVecOps::MakeEmpty(&traits));
175-
176174
// Display basic blocks.
177175
DBEXEC(VERBOSE, comp->fgDispBasicBlocks());
178176
DBEXEC(VERBOSE, comp->fgDispHandlerTab());
179177

178+
// TopologicalSort is called first so m_visited should already be empty
179+
assert(BitVecOps::IsEmpty(&m_visitedTraits, m_visited));
180+
180181
// Compute order.
181182
int postIndex = 0;
182183
BasicBlock* block = comp->fgFirstBB;
183-
BitVecOps::AddElemD(&traits, visited, block->bbNum);
184+
BitVecOps::AddElemD(&m_visitedTraits, m_visited, block->bbNum);
184185

185186
ArrayStack<BasicBlock*> blocks(comp);
186187
ArrayStack<AllSuccessorIter> iterators(comp);
@@ -225,12 +226,12 @@ int SsaBuilder::TopologicalSort(BasicBlock** postOrder, int count)
225226
++iter;
226227

227228
// push the children
228-
if (!BitVecOps::IsMember(&traits, visited, succ->bbNum))
229+
if (!BitVecOps::IsMember(&m_visitedTraits, m_visited, succ->bbNum))
229230
{
230231
blocks.Push(succ);
231232
iterators.Push(succ->GetAllSuccs(comp).begin());
232233
ends.Push(succ->GetAllSuccs(comp).end());
233-
BitVecOps::AddElemD(&traits, visited, succ->bbNum);
234+
BitVecOps::AddElemD(&m_visitedTraits, m_visited, succ->bbNum);
234235
}
235236
}
236237
else
@@ -274,10 +275,9 @@ void SsaBuilder::ComputeImmediateDom(BasicBlock** postOrder, int count)
274275
}
275276

276277
// Add entry point to processed as its IDom is NULL.
277-
BitVecTraits traits(m_pCompiler->fgBBNumMax + 1, m_pCompiler);
278-
BitVec processed(BitVecOps::MakeEmpty(&traits));
279278

280-
BitVecOps::AddElemD(&traits, processed, m_pCompiler->fgFirstBB->bbNum);
279+
BitVecOps::ClearD(&m_visitedTraits, m_visited);
280+
BitVecOps::AddElemD(&m_visitedTraits, m_visited, m_pCompiler->fgFirstBB->bbNum);
281281
assert(postOrder[count - 1] == m_pCompiler->fgFirstBB);
282282

283283
bool changed = true;
@@ -296,7 +296,7 @@ void SsaBuilder::ComputeImmediateDom(BasicBlock** postOrder, int count)
296296
BasicBlock* predBlock = nullptr;
297297
for (flowList* pred = m_pCompiler->BlockPredsWithEH(block); pred; pred = pred->flNext)
298298
{
299-
if (BitVecOps::IsMember(&traits, processed, pred->flBlock->bbNum))
299+
if (BitVecOps::IsMember(&m_visitedTraits, m_visited, pred->flBlock->bbNum))
300300
{
301301
predBlock = pred->flBlock;
302302
break;
@@ -340,7 +340,7 @@ void SsaBuilder::ComputeImmediateDom(BasicBlock** postOrder, int count)
340340
}
341341

342342
// Mark the current block as processed.
343-
BitVecOps::AddElemD(&traits, processed, block->bbNum);
343+
BitVecOps::AddElemD(&m_visitedTraits, m_visited, block->bbNum);
344344

345345
DBG_SSA_JITDUMP("Marking block BB%02u as processed.\n", block->bbNum);
346346
}
@@ -598,8 +598,6 @@ BlkToBlkVectorMap* SsaBuilder::ComputeIteratedDominanceFrontier(BasicBlock** pos
598598

599599
// Now do the closure operation to make the dominance frontier into an IDF.
600600
BlkToBlkVectorMap* mapIDF = new (&m_allocator) BlkToBlkVectorMap(&m_allocator);
601-
// We need to keep track of the blocks added to an IDF to avoid duplicates.
602-
hashBv* added = hashBv::Create(m_pCompiler);
603601

604602
for (BlkToBlkVectorMap::KeyIterator ki = mapDF.Begin(); !ki.Equal(mapDF.End()); ki++)
605603
{
@@ -608,10 +606,11 @@ BlkToBlkVectorMap* SsaBuilder::ComputeIteratedDominanceFrontier(BasicBlock** pos
608606
BlkVector& bDF = ki.GetValue();
609607
BlkVector& bIDF = *mapIDF->Emplace(b, &m_allocator);
610608
bIDF.reserve(bDF.size());
609+
BitVecOps::ClearD(&m_visitedTraits, m_visited);
611610

612611
for (BasicBlock* f : bDF)
613612
{
614-
added->setBit(f->bbNum);
613+
BitVecOps::AddElemD(&m_visitedTraits, m_visited, f->bbNum);
615614
bIDF.push_back(f);
616615
}
617616

@@ -629,16 +628,14 @@ BlkToBlkVectorMap* SsaBuilder::ComputeIteratedDominanceFrontier(BasicBlock** pos
629628
{
630629
for (BasicBlock* ff : *fDF)
631630
{
632-
if (!added->testBit(ff->bbNum))
631+
if (!BitVecOps::IsMember(&m_visitedTraits, m_visited, ff->bbNum))
633632
{
634-
added->setBit(ff->bbNum);
633+
BitVecOps::AddElemD(&m_visitedTraits, m_visited, ff->bbNum);
635634
bIDF.push_back(ff);
636635
}
637636
}
638637
}
639638
}
640-
641-
added->ZeroAll();
642639
}
643640

644641
#ifdef DEBUG
@@ -1857,6 +1854,9 @@ void SsaBuilder::Build()
18571854
postOrder = (BasicBlock**)alloca(blockCount * sizeof(BasicBlock*));
18581855
}
18591856

1857+
m_visitedTraits = BitVecTraits(m_pCompiler->fgBBNumMax + 1, m_pCompiler);
1858+
m_visited = BitVecOps::MakeEmpty(&m_visitedTraits);
1859+
18601860
// Topologically sort the graph.
18611861
int count = TopologicalSort(postOrder, blockCount);
18621862
JITDUMP("[SsaBuilder] Topologically sorted the graph.\n");

src/jit/ssabuilder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ class SsaBuilder
176176
Compiler* m_pCompiler;
177177
CompAllocator m_allocator;
178178

179+
// Bit vector used by TopologicalSort, ComputeImmediateDom and ComputeIteratedDominanceFrontier
180+
// to track already visited/added blocks.
181+
BitVecTraits m_visitedTraits;
182+
BitVec m_visited;
183+
179184
#ifdef SSA_FEATURE_DOMARR
180185
// To answer queries of type a DOM b.
181186
// Do not move these outside of this class, use accessors/interface methods.

0 commit comments

Comments
 (0)