Skip to content

Commit d1c34bb

Browse files
committed
PRE for multi-level field loads in a loop.
1 parent 10acdfa commit d1c34bb

File tree

15 files changed

+756
-103
lines changed

15 files changed

+756
-103
lines changed

lib/Backend/FlowGraph.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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
36993717
uint
37003718
Loop::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
}

lib/Backend/FlowGraph.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,7 @@ class Loop
756756
void SetLoopTopInstr(IR::LabelInstr * loopTop);
757757
Func * GetFunc() const { return GetLoopTopInstr()->m_func; }
758758
bool IsSymAssignedToInSelfOrParents(StackSym * const sym) const;
759+
BasicBlock * GetTailBlock() const;
759760
#if DBG_DUMP
760761
bool GetHasCall() const { return hasCall; }
761762
uint GetLoopNumber() const;

0 commit comments

Comments
 (0)