Skip to content

Commit 3554808

Browse files
committed
Fix an issue where redeferral did not properly track recursive inlinees, e.g. 'a' inlines 'b', which inlines 'c'. If 'a' was not redeferred, we were properly marking 'a' and 'b' as active, but not 'c'.
1 parent add6acf commit 3554808

8 files changed

Lines changed: 9876 additions & 11 deletions

File tree

lib/Runtime/Base/FunctionBody.cpp

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -747,8 +747,36 @@ namespace Js
747747
return !!pActiveFuncs->TestAndSet(this->GetFunctionNumber());
748748
}
749749

750-
void FunctionBody::UpdateActiveFunctionSet(ActiveFunctionSet *pActiveFuncs) const
750+
void FunctionBody::UpdateActiveFunctionsForOneDataSet(ActiveFunctionSet *pActiveFuncs, FunctionCodeGenRuntimeData **dataSet) const
751751
{
752+
FunctionCodeGenRuntimeData *inlineeData;
753+
for (uint i = 0; i < this->GetProfiledCallSiteCount(); i++)
754+
{
755+
for (inlineeData = dataSet[i]; inlineeData; inlineeData = inlineeData->GetNext())
756+
{
757+
inlineeData->GetFunctionBody()->UpdateActiveFunctionSet(pActiveFuncs, inlineeData);
758+
}
759+
}
760+
}
761+
762+
void FunctionBody::UpdateActiveFunctionSet(ActiveFunctionSet *pActiveFuncs, FunctionCodeGenRuntimeData *callSiteData) const
763+
{
764+
// Always walk the inlinee and ldFldInlinee data (if we have them), as they are different at each call site.
765+
766+
if (callSiteData)
767+
{
768+
if (callSiteData->GetInlinees())
769+
{
770+
this->UpdateActiveFunctionsForOneDataSet(pActiveFuncs, callSiteData->GetInlinees());
771+
}
772+
if (callSiteData->GetLdFldInlinees())
773+
{
774+
this->UpdateActiveFunctionsForOneDataSet(pActiveFuncs, callSiteData->GetLdFldInlinees());
775+
}
776+
}
777+
778+
// Now walk the top-level data, but only do it once, since it's always the same.
779+
752780
if (this->TestAndUpdateActiveFunctions(pActiveFuncs))
753781
{
754782
return;
@@ -758,13 +786,8 @@ namespace Js
758786
{
759787
return;
760788
}
761-
for (uint i = 0; i < this->GetProfiledCallSiteCount(); i++)
762-
{
763-
for (FunctionCodeGenRuntimeData *inlineeData = data[i]; inlineeData; inlineeData = inlineeData->GetNext())
764-
{
765-
inlineeData->GetFunctionBody()->UpdateActiveFunctionSet(pActiveFuncs);
766-
}
767-
}
789+
790+
this->UpdateActiveFunctionsForOneDataSet(pActiveFuncs, data);
768791
}
769792

770793
bool FunctionBody::DoRedeferFunction(uint inactiveThreshold) const

lib/Runtime/Base/FunctionBody.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2580,7 +2580,8 @@ namespace Js
25802580
void RedeferFunction();
25812581
bool IsActiveFunction(ActiveFunctionSet * pActiveFuncs) const;
25822582
bool TestAndUpdateActiveFunctions(ActiveFunctionSet * pActiveFuncs) const;
2583-
void UpdateActiveFunctionSet(ActiveFunctionSet * pActiveFuncs) const;
2583+
void UpdateActiveFunctionSet(ActiveFunctionSet * pActiveFuncs, FunctionCodeGenRuntimeData *callSiteData) const;
2584+
void UpdateActiveFunctionsForOneDataSet(ActiveFunctionSet *pActiveFuncs, FunctionCodeGenRuntimeData **dataSet) const;
25842585
uint GetInactiveCount() const { return inactiveCount; }
25852586
void SetInactiveCount(uint count) { inactiveCount = count; }
25862587
void IncrInactiveCount(uint increment);

lib/Runtime/Base/ScriptContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,7 @@ namespace Js
10881088
bool doRedefer = functionBody->DoRedeferFunction(inactiveThreshold);
10891089
if (!doRedefer)
10901090
{
1091-
functionBody->UpdateActiveFunctionSet(pActiveFuncs);
1091+
functionBody->UpdateActiveFunctionSet(pActiveFuncs, nullptr);
10921092
}
10931093
}
10941094
};

lib/Runtime/Base/ThreadContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2796,7 +2796,7 @@ ThreadContext::GetActiveFunctions(ActiveFunctionSet * pActiveFuncs)
27962796
if (function->GetFunctionInfo()->HasBody())
27972797
{
27982798
Js::FunctionBody *body = function->GetFunctionInfo()->GetFunctionBody();
2799-
body->UpdateActiveFunctionSet(pActiveFuncs);
2799+
body->UpdateActiveFunctionSet(pActiveFuncs, nullptr);
28002800
}
28012801
}
28022802
}

lib/Runtime/Language/FunctionCodeGenRuntimeData.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ namespace Js
3636
public:
3737
FunctionBody *GetFunctionBody() const;
3838
FunctionCodeGenRuntimeData *GetNext() const { return next; };
39+
FunctionCodeGenRuntimeData **GetInlinees() const { return inlinees; }
40+
FunctionCodeGenRuntimeData **GetLdFldInlinees() const { return ldFldInlinees; }
3941
const FunctionCodeGenRuntimeData *GetForTarget(FunctionBody *targetFuncBody) const;
4042
const InlineCachePointerArray<InlineCache> *ClonedInlineCaches() const;
4143
InlineCachePointerArray<InlineCache> *ClonedInlineCaches();

0 commit comments

Comments
 (0)