Skip to content

Commit a3b73be

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 e8378a8 commit a3b73be

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;
@@ -4275,6 +4305,7 @@ BackwardPass::DumpBlockData(BasicBlock * block, IR::Instr* instr)
42754305
{ block->typesNeedingKnownObjectLayout, _u("Needs Known Object Layout") },
42764306
{ block->upwardExposedFields, _u("Exposed Fields") },
42774307
{ block->byteCodeUpwardExposedUsed, _u("Byte Code Use") },
4308+
{ block->auxSlotPtrUpwardExposedUses, _u("Aux Slot Use")},
42784309
{ byteCodeRegisterUpwardExposed, _u("Byte Code Reg Use") },
42794310
{ !this->IsCollectionPass() && !block->isDead && this->DoDeadStoreSlots() ? block->slotDeadStoreCandidates : nullptr, _u("Slot deadStore candidates") },
42804311
};
@@ -5611,12 +5642,12 @@ BackwardPass::TrackObjTypeSpecProperties(IR::PropertySymOpnd *opnd, BasicBlock *
56115642
{
56125643
// This is an upward-exposed use of the aux slot pointer.
56135644
Assert(auxSlotPtrSym);
5614-
auxSlotPtrUpwardExposed = this->currentBlock->upwardExposedUses->TestAndSet(auxSlotPtrSym->m_id);
5645+
auxSlotPtrUpwardExposed = this->currentBlock->auxSlotPtrUpwardExposedUses->TestAndSet(auxSlotPtrSym->m_id);
56155646
}
56165647
else if (auxSlotPtrSym != nullptr)
56175648
{
56185649
// The aux slot pointer is not upward-exposed at this point.
5619-
auxSlotPtrUpwardExposed = this->currentBlock->upwardExposedUses->TestAndClear(auxSlotPtrSym->m_id);
5650+
auxSlotPtrUpwardExposed = this->currentBlock->auxSlotPtrUpwardExposedUses->TestAndClear(auxSlotPtrSym->m_id);
56205651
}
56215652
if (!this->IsPrePass() && auxSlotPtrUpwardExposed)
56225653
{

lib/Backend/FlowGraph.h

+2
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ class BasicBlock
388388
BVSparse<JitArenaAllocator> * upwardExposedFields;
389389
BVSparse<JitArenaAllocator> * typesNeedingKnownObjectLayout;
390390
BVSparse<JitArenaAllocator> * slotDeadStoreCandidates;
391+
BVSparse<JitArenaAllocator> * auxSlotPtrUpwardExposedUses;
391392
TempNumberTracker * tempNumberTracker;
392393
TempObjectTracker * tempObjectTracker;
393394
#if DBG
@@ -434,6 +435,7 @@ class BasicBlock
434435
upwardExposedFields(nullptr),
435436
typesNeedingKnownObjectLayout(nullptr),
436437
slotDeadStoreCandidates(nullptr),
438+
auxSlotPtrUpwardExposedUses(nullptr),
437439
tempNumberTracker(nullptr),
438440
tempObjectTracker(nullptr),
439441
#if DBG

0 commit comments

Comments
 (0)