Skip to content

Commit 84e7a20

Browse files
author
Meghana Gupta
committed
OS#19979778 : Merge uses of auxSlotPtrSym on dead edges as well
This is a fix for use-before-def of an auxSlotPtrSym. When there is a LdFld which is a candidate of ReuseAuxSlotSymPtr optimization inside the loop which has no backedge (all are dead), the DeadStore phase never marks SetProducesAuxSlotPtr on the opnd. This is because we don't merge upwardExposedUses on dead edges, and so the optimization never sees a set bit of the auxSlotPtrSym in upwardExposedUses in the 2nd pass. Ideally, if GlobOpt reset block->loopbfor such loops after GlobOpt::RemoveCodeAfterNoFallThroughInstr we wouldn't be seeing this. With this change we have a new bit vector called auxSlotPtrUpwardExposedUses which we merge on even dead successor edges to fix this issue.
1 parent 4a18b8a commit 84e7a20

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

lib/Backend/BackwardPass.cpp

+33-2
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ BackwardPass::MergeSuccBlocksInfo(BasicBlock * block)
486486
BVSparse<JitArenaAllocator> * typesNeedingKnownObjectLayout = nullptr;
487487
BVSparse<JitArenaAllocator> * slotDeadStoreCandidates = nullptr;
488488
BVSparse<JitArenaAllocator> * byteCodeUpwardExposedUsed = nullptr;
489+
BVSparse<JitArenaAllocator> * auxSlotPtrUpwardExposedUses = nullptr;
489490
BVSparse<JitArenaAllocator> * couldRemoveNegZeroBailoutForDef = nullptr;
490491
BVSparse<JitArenaAllocator> * liveFixedFields = nullptr;
491492
#if DBG
@@ -505,6 +506,11 @@ BackwardPass::MergeSuccBlocksInfo(BasicBlock * block)
505506
#endif
506507
}
507508

509+
if ((this->tag == Js::DeadStorePhase) && !PHASE_OFF(Js::ReuseAuxSlotPtrPhase, this->func))
510+
{
511+
auxSlotPtrUpwardExposedUses = JitAnew(this->tempAlloc, BVSparse<JitArenaAllocator>, this->tempAlloc);
512+
}
513+
508514
#if DBG
509515
if (!IsCollectionPass() && this->DoMarkTempObjectVerify())
510516
{
@@ -1124,6 +1130,29 @@ BackwardPass::MergeSuccBlocksInfo(BasicBlock * block)
11241130
NEXT_DEAD_SUCCESSOR_BLOCK;
11251131
}
11261132

1133+
if (auxSlotPtrUpwardExposedUses)
1134+
{
1135+
FOREACH_SUCCESSOR_BLOCK(blockSucc, block)
1136+
{
1137+
Assert(blockSucc->auxSlotPtrUpwardExposedUses || blockSucc->isLoopHeader);
1138+
if (blockSucc->auxSlotPtrUpwardExposedUses)
1139+
{
1140+
auxSlotPtrUpwardExposedUses->Or(blockSucc->auxSlotPtrUpwardExposedUses);
1141+
}
1142+
}
1143+
NEXT_SUCCESSOR_BLOCK;
1144+
1145+
FOREACH_DEAD_SUCCESSOR_BLOCK(deadBlockSucc, block)
1146+
{
1147+
Assert(deadBlockSucc->auxSlotPtrUpwardExposedUses || deadBlockSucc->isLoopHeader);
1148+
if (deadBlockSucc->auxSlotPtrUpwardExposedUses)
1149+
{
1150+
auxSlotPtrUpwardExposedUses->Or(deadBlockSucc->auxSlotPtrUpwardExposedUses);
1151+
}
1152+
}
1153+
NEXT_DEAD_SUCCESSOR_BLOCK;
1154+
}
1155+
11271156
if (block->isLoopHeader)
11281157
{
11291158
this->DeleteBlockData(block);
@@ -1187,6 +1216,7 @@ BackwardPass::MergeSuccBlocksInfo(BasicBlock * block)
11871216
block->upwardExposedFields = upwardExposedFields;
11881217
block->typesNeedingKnownObjectLayout = typesNeedingKnownObjectLayout;
11891218
block->byteCodeUpwardExposedUsed = byteCodeUpwardExposedUsed;
1219+
block->auxSlotPtrUpwardExposedUses = auxSlotPtrUpwardExposedUses;
11901220
#if DBG
11911221
block->byteCodeRestoreSyms = byteCodeRestoreSyms;
11921222
block->excludeByteCodeUpwardExposedTracking = excludeByteCodeUpwardExposedTracking;
@@ -4267,6 +4297,7 @@ BackwardPass::DumpBlockData(BasicBlock * block, IR::Instr* instr)
42674297
{ block->typesNeedingKnownObjectLayout, _u("Needs Known Object Layout") },
42684298
{ block->upwardExposedFields, _u("Exposed Fields") },
42694299
{ block->byteCodeUpwardExposedUsed, _u("Byte Code Use") },
4300+
{ block->auxSlotPtrUpwardExposedUses, _u("Aux Slot Use")},
42704301
{ byteCodeRegisterUpwardExposed, _u("Byte Code Reg Use") },
42714302
{ !this->IsCollectionPass() && !block->isDead && this->DoDeadStoreSlots() ? block->slotDeadStoreCandidates : nullptr, _u("Slot deadStore candidates") },
42724303
};
@@ -5603,12 +5634,12 @@ BackwardPass::TrackObjTypeSpecProperties(IR::PropertySymOpnd *opnd, BasicBlock *
56035634
{
56045635
// This is an upward-exposed use of the aux slot pointer.
56055636
Assert(auxSlotPtrSym);
5606-
auxSlotPtrUpwardExposed = this->currentBlock->upwardExposedUses->TestAndSet(auxSlotPtrSym->m_id);
5637+
auxSlotPtrUpwardExposed = this->currentBlock->auxSlotPtrUpwardExposedUses->TestAndSet(auxSlotPtrSym->m_id);
56075638
}
56085639
else if (auxSlotPtrSym != nullptr)
56095640
{
56105641
// The aux slot pointer is not upward-exposed at this point.
5611-
auxSlotPtrUpwardExposed = this->currentBlock->upwardExposedUses->TestAndClear(auxSlotPtrSym->m_id);
5642+
auxSlotPtrUpwardExposed = this->currentBlock->auxSlotPtrUpwardExposedUses->TestAndClear(auxSlotPtrSym->m_id);
56125643
}
56135644
if (!this->IsPrePass() && auxSlotPtrUpwardExposed)
56145645
{

lib/Backend/FlowGraph.h

+2
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ class BasicBlock
391391
BVSparse<JitArenaAllocator> * upwardExposedFields;
392392
BVSparse<JitArenaAllocator> * typesNeedingKnownObjectLayout;
393393
BVSparse<JitArenaAllocator> * slotDeadStoreCandidates;
394+
BVSparse<JitArenaAllocator> * auxSlotPtrUpwardExposedUses;
394395
TempNumberTracker * tempNumberTracker;
395396
TempObjectTracker * tempObjectTracker;
396397
#if DBG
@@ -437,6 +438,7 @@ class BasicBlock
437438
upwardExposedFields(nullptr),
438439
typesNeedingKnownObjectLayout(nullptr),
439440
slotDeadStoreCandidates(nullptr),
441+
auxSlotPtrUpwardExposedUses(nullptr),
440442
tempNumberTracker(nullptr),
441443
tempObjectTracker(nullptr),
442444
#if DBG

0 commit comments

Comments
 (0)