@@ -22,7 +22,8 @@ GlobOpt::CaptureCopyPropValue(BasicBlock * block, Sym * sym, Value * val, SListB
22
22
void
23
23
GlobOpt::CaptureValuesFromScratch (BasicBlock * block,
24
24
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
25
- SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter)
25
+ SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter,
26
+ BVSparse<JitArenaAllocator>* argsToCapture)
26
27
{
27
28
Sym * sym = nullptr ;
28
29
Value * value = nullptr ;
@@ -49,6 +50,11 @@ GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
49
50
}
50
51
NEXT_GLOBHASHTABLE_ENTRY;
51
52
53
+ if (argsToCapture)
54
+ {
55
+ block->globOptData .changedSyms ->Or (argsToCapture);
56
+ }
57
+
52
58
FOREACH_BITSET_IN_SPARSEBV (symId, block->globOptData .changedSyms )
53
59
{
54
60
HashBucket<Sym*, Value*> * bucket = block->globOptData .symToValueMap ->GetBucket (symId);
@@ -80,7 +86,8 @@ GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
80
86
void
81
87
GlobOpt::CaptureValuesIncremental (BasicBlock * block,
82
88
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
83
- SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter)
89
+ SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter,
90
+ BVSparse<JitArenaAllocator>* argsToCapture)
84
91
{
85
92
CapturedValues * currCapturedValues = block->globOptData .capturedValues ;
86
93
SListBase<ConstantStackSymValue>::Iterator iterConst (currCapturedValues ? &currCapturedValues->constantValues : nullptr );
@@ -90,6 +97,11 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,
90
97
91
98
block->globOptData .changedSyms ->Set (Js::Constants::InvalidSymID);
92
99
100
+ if (argsToCapture)
101
+ {
102
+ block->globOptData .changedSyms ->Or (argsToCapture);
103
+ }
104
+
93
105
FOREACH_BITSET_IN_SPARSEBV (symId, block->globOptData .changedSyms )
94
106
{
95
107
Value * val = nullptr ;
@@ -225,7 +237,7 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,
225
237
226
238
227
239
void
228
- GlobOpt::CaptureValues (BasicBlock *block, BailOutInfo * bailOutInfo)
240
+ GlobOpt::CaptureValues (BasicBlock *block, BailOutInfo * bailOutInfo, BVSparse<JitArenaAllocator>* argsToCapture )
229
241
{
230
242
if (!this ->func ->DoGlobOptsForGeneratorFunc ())
231
243
{
@@ -244,11 +256,11 @@ GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo)
244
256
245
257
if (!block->globOptData .capturedValues )
246
258
{
247
- CaptureValuesFromScratch (block, bailOutConstValuesIter, bailOutCopySymsIter);
259
+ CaptureValuesFromScratch (block, bailOutConstValuesIter, bailOutCopySymsIter, argsToCapture );
248
260
}
249
261
else
250
262
{
251
- CaptureValuesIncremental (block, bailOutConstValuesIter, bailOutCopySymsIter);
263
+ CaptureValuesIncremental (block, bailOutConstValuesIter, bailOutCopySymsIter, argsToCapture );
252
264
}
253
265
254
266
// attach capturedValues to bailOutInfo
@@ -892,6 +904,8 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
892
904
{
893
905
AssertMsg (!this ->isCallHelper , " Bail out can't be inserted the middle of CallHelper sequence" );
894
906
907
+ BVSparse<JitArenaAllocator>* argsToCapture = nullptr ;
908
+
895
909
bailOutInfo->liveVarSyms = block->globOptData .liveVarSyms ->CopyNew (this ->func ->m_alloc );
896
910
bailOutInfo->liveFloat64Syms = block->globOptData .liveFloat64Syms ->CopyNew (this ->func ->m_alloc );
897
911
// The live int32 syms in the bailout info are only the syms resulting from lossless conversion to int. If the int32 value
@@ -971,7 +985,12 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
971
985
sym = opnd->GetStackSym ();
972
986
Assert (this ->currentBlock ->globOptData .FindValue (sym));
973
987
// StackSym args need to be re-captured
974
- this ->currentBlock ->globOptData .SetChangedSym (sym->m_id );
988
+ if (!argsToCapture)
989
+ {
990
+ argsToCapture = JitAnew (this ->tempAlloc , BVSparse<JitArenaAllocator>, this ->tempAlloc );
991
+ }
992
+
993
+ argsToCapture->Set (sym->m_id );
975
994
}
976
995
977
996
Assert (totalOutParamCount != 0 );
@@ -1019,7 +1038,7 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
1019
1038
1020
1039
// Save the constant values that we know so we can restore them directly.
1021
1040
// This allows us to dead store the constant value assign.
1022
- this ->CaptureValues (block, bailOutInfo);
1041
+ this ->CaptureValues (block, bailOutInfo, argsToCapture );
1023
1042
}
1024
1043
1025
1044
void
0 commit comments