@@ -3695,6 +3695,24 @@ Loop::IsSymAssignedToInSelfOrParents(StackSym * const sym) const
36953695 return false ;
36963696}
36973697
3698+ BasicBlock *
3699+ Loop::GetTailBlock () const
3700+ {
3701+ BasicBlock * tail = nullptr ;
3702+
3703+ BasicBlock * loopHeader = this ->GetHeadBlock ();
3704+ FOREACH_PREDECESSOR_BLOCK (pred, loopHeader)
3705+ {
3706+ if (this ->IsDescendentOrSelf (pred->loop ))
3707+ {
3708+ tail = pred;
3709+ }
3710+ } NEXT_PREDECESSOR_BLOCK;
3711+
3712+ Assert (tail);
3713+ return tail;
3714+ }
3715+
36983716#if DBG_DUMP
36993717uint
37003718Loop::GetLoopNumber () const
@@ -5216,14 +5234,14 @@ GlobOpt::CloneValues(BasicBlock *const toBlock, GlobOptBlockData *toData, GlobOp
52165234 ProcessValueKills (toBlock, toData);
52175235}
52185236
5219- PRECandidatesList * GlobOpt::FindBackEdgePRECandidates (BasicBlock *block, JitArenaAllocator *alloc)
5237+ PRECandidates * GlobOpt::FindBackEdgePRECandidates (BasicBlock *block, JitArenaAllocator *alloc)
52205238{
52215239 // Iterate over the value table looking for propertySyms which are candidates to
52225240 // pre-load in the landing pad for field PRE
52235241
52245242 GlobHashTable *valueTable = block->globOptData .symToValueMap ;
52255243 Loop *loop = block->loop ;
5226- PRECandidatesList *candidates = nullptr ;
5244+ PRECandidates *candidates = JitAnew ( this -> tempAlloc , PRECandidates) ;
52275245
52285246 for (uint i = 0 ; i < valueTable->tableSize ; i++)
52295247 {
@@ -5284,7 +5302,7 @@ PRECandidatesList * GlobOpt::FindBackEdgePRECandidates(BasicBlock *block, JitAre
52845302 if (!landingPadValue)
52855303 {
52865304 // Value should be added as initial value or already be there.
5287- return nullptr ;
5305+ continue ;
52885306 }
52895307
52905308 IR::Instr * ldInstr = this ->prePassInstrMap ->Lookup (propertySym->m_id , nullptr );
@@ -5294,12 +5312,16 @@ PRECandidatesList * GlobOpt::FindBackEdgePRECandidates(BasicBlock *block, JitAre
52945312 continue ;
52955313 }
52965314
5297- if (!candidates)
5315+ if (!candidates-> candidatesList )
52985316 {
5299- candidates = Anew (alloc, PRECandidatesList, alloc);
5317+ candidates->candidatesList = JitAnew (alloc, PRECandidatesList, alloc);
5318+ candidates->candidatesToProcess = JitAnew (alloc, BVSparse<JitArenaAllocator>, alloc);
5319+ candidates->candidatesBv = JitAnew (alloc, BVSparse<JitArenaAllocator>, alloc);
53005320 }
53015321
5302- candidates->Prepend (&bucket);
5322+ candidates->candidatesList ->Prepend (&bucket);
5323+ candidates->candidatesToProcess ->Set (propertySym->m_id );
5324+ candidates->candidatesBv ->Set (propertySym->m_id );
53035325
53045326 } NEXT_SLISTBASE_ENTRY;
53055327 }
0 commit comments