Skip to content

Commit 0e0763e

Browse files
committed
Deep copy CapturedValues to GlobOptBlockData when an instruction with a bailout gets hoisted
1 parent 706d812 commit 0e0763e

5 files changed

Lines changed: 32 additions & 8 deletions

File tree

lib/Backend/GlobOpt.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16733,7 +16733,7 @@ GlobOpt::OptHoistInvariant(
1673316733
EnsureBailTarget(loop);
1673416734

1673516735
// Copy bailout info of loop top.
16736-
instr->ReplaceBailOutInfo(loop->bailOutInfo);
16736+
instr->ReplaceBailOutInfo(loop->bailOutInfo, this->currentBlock);
1673716737
}
1673816738

1673916739
if(!dst)

lib/Backend/GlobOptBlockData.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1940,6 +1940,12 @@ GlobOptBlockData::KillStateForGeneratorYield()
19401940
this->hasCSECandidates = false;
19411941
}
19421942

1943+
JitArenaAllocator *
1944+
GlobOptBlockData::GetGlobOptAllocator()
1945+
{
1946+
return this->globOpt->alloc;
1947+
}
1948+
19431949
#if DBG_DUMP
19441950
void
19451951
GlobOptBlockData::DumpSymToValueMap() const

lib/Backend/GlobOptBlockData.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ class GlobOptBlockData
349349
// Other
350350
public:
351351
void KillStateForGeneratorYield();
352+
JitArenaAllocator * GetGlobOptAllocator();
352353

353354
// Debug
354355
public:

lib/Backend/IR.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,11 +1153,10 @@ Instr::UnlinkBailOutInfo()
11531153
return bailOutInfo;
11541154
}
11551155

1156-
bool
1157-
Instr::ReplaceBailOutInfo(BailOutInfo *newBailOutInfo)
1156+
void
1157+
Instr::ReplaceBailOutInfo(BailOutInfo *newBailOutInfo, BasicBlock * block)
11581158
{
11591159
BailOutInfo *oldBailOutInfo = nullptr;
1160-
bool deleteOld = false;
11611160

11621161
#if DBG
11631162
newBailOutInfo->wasCopied = true;
@@ -1187,12 +1186,17 @@ Instr::ReplaceBailOutInfo(BailOutInfo *newBailOutInfo)
11871186
if (oldBailOutInfo->bailOutInstr == this)
11881187
{
11891188
JitArenaAllocator * alloc = this->m_func->m_alloc;
1189+
// If the oldBailOutInfo's captured values were cached on the globopt-block-data,
1190+
// make a deep copy of the lists in the captured values on the block data.
1191+
if (block && block->globOptData.capturedValuesCandidate == &oldBailOutInfo->capturedValues)
1192+
{
1193+
block->globOptData.capturedValuesCandidate = oldBailOutInfo->capturedValues.Clone(block->globOptData.GetGlobOptAllocator());
1194+
}
11901195
oldBailOutInfo->Clear(alloc);
11911196
JitAdelete(alloc, oldBailOutInfo);
1192-
deleteOld = true;
11931197
}
11941198

1195-
return deleteOld;
1199+
return;
11961200
}
11971201

11981202
IR::Instr *Instr::ShareBailOut()
@@ -3145,7 +3149,7 @@ Instr::ConvertToBailOutInstr(BailOutInfo * bailOutInfo, IR::BailOutKind kind, bo
31453149
this->SetBailOutKind_NoAssert(kind);
31463150

31473151
// Clear old (aux) info and set to the new bailOutInfo.
3148-
this->ReplaceBailOutInfo(bailOutInfo);
3152+
this->ReplaceBailOutInfo(bailOutInfo, nullptr);
31493153
bailOutInfo->bailOutInstr = this;
31503154
this->hasBailOutInfo = true;
31513155

lib/Backend/IR.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ struct CapturedValues
3636
constantValues.Reset();
3737
copyPropSyms.Reset();
3838
}
39+
40+
CapturedValues * Clone(JitArenaAllocator * alloc)
41+
{
42+
CapturedValues * clonedCV = JitAnew(alloc, CapturedValues);
43+
this->constantValues.CopyTo(alloc, clonedCV->constantValues);
44+
this->copyPropSyms.CopyTo(alloc, clonedCV->copyPropSyms);
45+
if (this->argObjSyms)
46+
{
47+
clonedCV->argObjSyms = JitAnew(alloc, BVSparse<JitArenaAllocator>, alloc);
48+
clonedCV->argObjSyms->Copy(this->argObjSyms);
49+
}
50+
return clonedCV;
51+
}
3952
};
4053

4154
class LoweredBasicBlock;
@@ -317,7 +330,7 @@ class Instr
317330

318331
BailOutInfo * GetBailOutInfo() const;
319332
BailOutInfo * UnlinkBailOutInfo();
320-
bool ReplaceBailOutInfo(BailOutInfo *newBailOutInfo);
333+
void ReplaceBailOutInfo(BailOutInfo *newBailOutInfo, BasicBlock * block);
321334
IR::Instr * ShareBailOut();
322335
BailOutKind GetBailOutKind() const;
323336
BailOutKind GetBailOutKindNoBits() const;

0 commit comments

Comments
 (0)