@@ -526,7 +526,9 @@ uint Inline::FillInlineesDataArray(
526
526
}
527
527
528
528
intptr_t inlineeFunctionInfoAddr = inlineeJitTimeData->GetFunctionInfoAddr ();
529
- if (!PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData))
529
+ #ifdef DBG
530
+ if (inlineeJitTimeData->HasBody () && !PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData))
531
+ #endif
530
532
{
531
533
const FunctionJITTimeInfo* rightInlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeFunctionInfoAddr);
532
534
@@ -573,28 +575,31 @@ void Inline::FillInlineesDataArrayUsingFixedMethods(
573
575
JITTimeFunctionBody* inlineeFuncBody = nullptr ;
574
576
while (inlineeJitTimeData)
575
577
{
576
- inlineeFuncBody = inlineeJitTimeData->GetBody ();
577
- if (!PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData) && !PHASE_OFF (Js::PolymorphicInlineFixedMethodsPhase, inlineeJitTimeData))
578
+ if (inlineeJitTimeData->HasBody ())
578
579
{
579
- const FunctionJITTimeInfo * jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData-> GetFunctionInfoAddr () );
580
- if (jitTimeData )
580
+ inlineeFuncBody = inlineeJitTimeData->GetBody ( );
581
+ if (! PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData) && ! PHASE_OFF (Js::PolymorphicInlineFixedMethodsPhase, inlineeJitTimeData) )
581
582
{
582
- for (uint16 i = 0 ; i < cachedFixedInlineeCount; i++)
583
+ const FunctionJITTimeInfo * jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData->GetFunctionInfoAddr ());
584
+ if (jitTimeData)
583
585
{
584
- if (inlineeJitTimeData-> GetFunctionInfoAddr () == fixedFieldInfoArray[i]. GetFuncInfoAddr () )
586
+ for (uint16 i = 0 ; i < cachedFixedInlineeCount; i++ )
585
587
{
586
- inlineesDataArray[i] = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData->GetFunctionInfoAddr ());
587
- break ;
588
+ if (inlineeJitTimeData->GetFunctionInfoAddr () == fixedFieldInfoArray[i].GetFuncInfoAddr ())
589
+ {
590
+ inlineesDataArray[i] = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData->GetFunctionInfoAddr ());
591
+ break ;
592
+ }
588
593
}
589
594
}
590
- }
591
- else
592
- {
595
+ else
596
+ {
593
597
#if defined(DBG_DUMP) || defined(ENABLE_DEBUG_CONFIG_OPTIONS)
594
- char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE];
598
+ char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE];
595
599
#endif
596
- POLYMORPHIC_INLINE_TESTTRACE (_u (" INLINING (Polymorphic): Missing jit time data skipped inlinee\t Inlinee: %s (%s)\n " ),
597
- inlineeFuncBody->GetDisplayName (), inlineeJitTimeData->GetDebugNumberSet (debugStringBuffer));
600
+ POLYMORPHIC_INLINE_TESTTRACE (_u (" INLINING (Polymorphic): Missing jit time data skipped inlinee\t Inlinee: %s (%s)\n " ),
601
+ inlineeFuncBody->GetDisplayName (), inlineeJitTimeData->GetDebugNumberSet (debugStringBuffer));
602
+ }
598
603
}
599
604
}
600
605
inlineeJitTimeData = inlineeJitTimeData->GetNext ();
@@ -1028,7 +1033,7 @@ Inline::InlinePolymorphicFunction(IR::Instr *callInstr, const FunctionJITTimeInf
1028
1033
IR::RegOpnd* functionObject = callInstr->GetSrc1 ()->AsRegOpnd ();
1029
1034
dispatchStartLabel->InsertBefore (IR::BranchInstr::New (Js::OpCode::BrAddr_A, inlineeStartLabel,
1030
1035
IR::IndirOpnd::New (functionObject, Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, dispatchStartLabel->m_func ),
1031
- IR::AddrOpnd::New (inlineesDataArray[i]->GetBody ()-> GetAddr (), IR::AddrOpndKindDynamicFunctionBody, dispatchStartLabel->m_func ), dispatchStartLabel->m_func ));
1036
+ IR::AddrOpnd::New (inlineesDataArray[i]->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionBody, dispatchStartLabel->m_func ), dispatchStartLabel->m_func ));
1032
1037
}
1033
1038
1034
1039
CompletePolymorphicInlining (callInstr, returnValueOpnd, doneLabel, dispatchStartLabel, /* ldMethodFldInstr*/ nullptr , IR::BailOutOnPolymorphicInlineFunction);
@@ -4143,14 +4148,14 @@ Inline::InsertJsFunctionCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr
4143
4148
}
4144
4149
4145
4150
void
4146
- Inline::InsertFunctionBodyCheck (IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, const FunctionJITTimeInfo *funcInfo)
4151
+ Inline::InsertFunctionInfoCheck (IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, const FunctionJITTimeInfo *funcInfo)
4147
4152
{
4148
4153
// if (JavascriptFunction::FromVar(r1)->functionInfo != funcInfo) goto noInlineLabel
4149
4154
// BrNeq_I4 noInlineLabel, r1->functionInfo, funcInfo
4150
- IR::IndirOpnd* funcBody = IR::IndirOpnd::New (callInstr->GetSrc1 ()->AsRegOpnd (), Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, callInstr->m_func );
4151
- IR::AddrOpnd* inlinedFuncBody = IR::AddrOpnd::New (funcInfo->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionBody , callInstr->m_func );
4152
- bailoutInstr->SetSrc1 (funcBody );
4153
- bailoutInstr->SetSrc2 (inlinedFuncBody );
4155
+ IR::IndirOpnd* opndFuncInfo = IR::IndirOpnd::New (callInstr->GetSrc1 ()->AsRegOpnd (), Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, callInstr->m_func );
4156
+ IR::AddrOpnd* inlinedFuncInfo = IR::AddrOpnd::New (funcInfo->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionInfo , callInstr->m_func );
4157
+ bailoutInstr->SetSrc1 (opndFuncInfo );
4158
+ bailoutInstr->SetSrc2 (inlinedFuncInfo );
4154
4159
4155
4160
insertBeforeInstr->InsertBefore (bailoutInstr);
4156
4161
}
@@ -4188,7 +4193,7 @@ Inline::PrepareInsertionPoint(IR::Instr *callInstr, const FunctionJITTimeInfo *f
4188
4193
InsertFunctionTypeIdCheck (callInstr, insertBeforeInstr, bailOutIfNotJsFunction);
4189
4194
4190
4195
// 3. Bailout if function body doesn't match funcInfo
4191
- InsertFunctionBodyCheck (callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo);
4196
+ InsertFunctionInfoCheck (callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo);
4192
4197
4193
4198
return primaryBailOutInstr;
4194
4199
}
0 commit comments