@@ -145,6 +145,7 @@ void Compiler::fgResetForSsa()
145145SsaBuilder::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 " 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 " 
0 commit comments