@@ -1150,7 +1150,7 @@ uint32 bailOutOffset, void * returnAddress, IR::BailOutKind bailOutKind, Js::Imp
1150
1150
sizeof (registerSaves));
1151
1151
1152
1152
Js::Var result = BailOutCommonNoCodeGen (layout, bailOutRecord, bailOutOffset, returnAddress, bailOutKind, branchValue, nullptr , bailOutReturnValue, argoutRestoreAddress);
1153
- ScheduleFunctionCodeGen (Js::ScriptFunction::FromVar (layout->functionObject ), nullptr , bailOutRecord, bailOutKind, savedImplicitCallFlags, returnAddress);
1153
+ ScheduleFunctionCodeGen (Js::ScriptFunction::FromVar (layout->functionObject ), nullptr , bailOutRecord, bailOutKind, bailOutOffset, savedImplicitCallFlags, returnAddress);
1154
1154
return result;
1155
1155
}
1156
1156
@@ -1171,7 +1171,7 @@ BailOutRecord::BailOutInlinedCommon(Js::JavascriptCallStackLayout * layout, Bail
1171
1171
BailOutInlinedHelper (layout, currentBailOutRecord, bailOutOffset, returnAddress, bailOutKind, registerSaves, &bailOutReturnValue, &innerMostInlinee, false , branchValue);
1172
1172
Js::Var result = BailOutCommonNoCodeGen (layout, currentBailOutRecord, currentBailOutRecord->bailOutOffset , returnAddress, bailOutKind, branchValue,
1173
1173
registerSaves, &bailOutReturnValue);
1174
- ScheduleFunctionCodeGen (Js::ScriptFunction::FromVar (layout->functionObject ), innerMostInlinee, currentBailOutRecord, bailOutKind, savedImplicitCallFlags, returnAddress);
1174
+ ScheduleFunctionCodeGen (Js::ScriptFunction::FromVar (layout->functionObject ), innerMostInlinee, currentBailOutRecord, bailOutKind, bailOutOffset, savedImplicitCallFlags, returnAddress);
1175
1175
return result;
1176
1176
}
1177
1177
@@ -1750,8 +1750,10 @@ BailOutRecord::BailOutHelper(Js::JavascriptCallStackLayout * layout, Js::ScriptF
1750
1750
// code we avoid a rejit by checking if the offending optimization has been disabled in the default code and if so
1751
1751
// we "rethunk" the bailing out function rather that incurring a rejit.
1752
1752
1753
+ // actualBailOutOffset - bail out offset in the function, inlinee or otherwise, that had the bailout.
1754
+
1753
1755
void BailOutRecord::ScheduleFunctionCodeGen (Js::ScriptFunction * function, Js::ScriptFunction * innerMostInlinee,
1754
- BailOutRecord const * bailOutRecord, IR::BailOutKind bailOutKind, Js::ImplicitCallFlags savedImplicitCallFlags, void * returnAddress)
1756
+ BailOutRecord const * bailOutRecord, IR::BailOutKind bailOutKind, uint32 actualBailOutOffset, Js::ImplicitCallFlags savedImplicitCallFlags, void * returnAddress)
1755
1757
{
1756
1758
if (bailOutKind == IR::BailOnSimpleJitToFullJitLoopBody ||
1757
1759
bailOutKind == IR::BailOutForGeneratorYield ||
@@ -2216,18 +2218,21 @@ void BailOutRecord::ScheduleFunctionCodeGen(Js::ScriptFunction * function, Js::S
2216
2218
rejitReason = RejitReason::Forced;
2217
2219
}
2218
2220
2219
- // REVIEW: Temporary fix for RS1. Disable Rejiting if it looks like it is not fixing the problem.
2220
- // For RS2, turn this into an assert and let's fix all these issues.
2221
2221
if (!reThunk && rejitReason != RejitReason::None)
2222
2222
{
2223
- if (executeFunction->GetDynamicProfileInfo ()->GetRejitCount () >= 100 )
2223
+ Js::DynamicProfileInfo * profileInfo = executeFunction->GetAnyDynamicProfileInfo ();
2224
+ // REVIEW: Temporary fix for RS1. Disable Rejiting if it looks like it is not fixing the problem.
2225
+ // For RS2, turn the rejitCount check into an assert and let's fix all these issues.
2226
+ if (profileInfo->GetRejitCount () >= 100 ||
2227
+ (profileInfo->GetBailOutOffsetForLastRejit () == actualBailOutOffset && function->IsNewEntryPointAvailable ()))
2224
2228
{
2225
2229
reThunk = true ;
2226
2230
rejitReason = RejitReason::None;
2227
2231
}
2228
2232
else
2229
2233
{
2230
- executeFunction->GetDynamicProfileInfo ()->IncRejitCount ();
2234
+ profileInfo->IncRejitCount ();
2235
+ profileInfo->SetBailOutOffsetForLastRejit (actualBailOutOffset);
2231
2236
}
2232
2237
}
2233
2238
0 commit comments