@@ -524,7 +524,9 @@ uint Inline::FillInlineesDataArray(
524
524
}
525
525
526
526
intptr_t inlineeFunctionInfoAddr = inlineeJitTimeData->GetFunctionInfoAddr ();
527
- if (!PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData))
527
+ #ifdef DBG
528
+ if (inlineeJitTimeData->HasBody () && !PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData))
529
+ #endif
528
530
{
529
531
const FunctionJITTimeInfo* rightInlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeFunctionInfoAddr);
530
532
@@ -571,28 +573,31 @@ void Inline::FillInlineesDataArrayUsingFixedMethods(
571
573
JITTimeFunctionBody* inlineeFuncBody = nullptr ;
572
574
while (inlineeJitTimeData)
573
575
{
574
- inlineeFuncBody = inlineeJitTimeData->GetBody ();
575
- if (!PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData) && !PHASE_OFF (Js::PolymorphicInlineFixedMethodsPhase, inlineeJitTimeData))
576
+ if (inlineeJitTimeData->HasBody ())
576
577
{
577
- const FunctionJITTimeInfo * jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData-> GetFunctionInfoAddr () );
578
- if (jitTimeData )
578
+ inlineeFuncBody = inlineeJitTimeData->GetBody ( );
579
+ if (! PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData) && ! PHASE_OFF (Js::PolymorphicInlineFixedMethodsPhase, inlineeJitTimeData) )
579
580
{
580
- for (uint16 i = 0 ; i < cachedFixedInlineeCount; i++)
581
+ const FunctionJITTimeInfo * jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData->GetFunctionInfoAddr ());
582
+ if (jitTimeData)
581
583
{
582
- if (inlineeJitTimeData-> GetFunctionInfoAddr () == fixedFieldInfoArray[i]. GetFuncInfoAddr () )
584
+ for (uint16 i = 0 ; i < cachedFixedInlineeCount; i++ )
583
585
{
584
- inlineesDataArray[i] = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData->GetFunctionInfoAddr ());
585
- break ;
586
+ if (inlineeJitTimeData->GetFunctionInfoAddr () == fixedFieldInfoArray[i].GetFuncInfoAddr ())
587
+ {
588
+ inlineesDataArray[i] = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData->GetFunctionInfoAddr ());
589
+ break ;
590
+ }
586
591
}
587
592
}
588
- }
589
- else
590
- {
593
+ else
594
+ {
591
595
#if defined(DBG_DUMP) || defined(ENABLE_DEBUG_CONFIG_OPTIONS)
592
- char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE];
596
+ char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE];
593
597
#endif
594
- POLYMORPHIC_INLINE_TESTTRACE (_u (" INLINING (Polymorphic): Missing jit time data skipped inlinee\t Inlinee: %s (%s)\n " ),
595
- inlineeFuncBody->GetDisplayName (), inlineeJitTimeData->GetDebugNumberSet (debugStringBuffer));
598
+ POLYMORPHIC_INLINE_TESTTRACE (_u (" INLINING (Polymorphic): Missing jit time data skipped inlinee\t Inlinee: %s (%s)\n " ),
599
+ inlineeFuncBody->GetDisplayName (), inlineeJitTimeData->GetDebugNumberSet (debugStringBuffer));
600
+ }
596
601
}
597
602
}
598
603
inlineeJitTimeData = inlineeJitTimeData->GetNext ();
@@ -1026,7 +1031,7 @@ Inline::InlinePolymorphicFunction(IR::Instr *callInstr, const FunctionJITTimeInf
1026
1031
IR::RegOpnd* functionObject = callInstr->GetSrc1 ()->AsRegOpnd ();
1027
1032
dispatchStartLabel->InsertBefore (IR::BranchInstr::New (Js::OpCode::BrAddr_A, inlineeStartLabel,
1028
1033
IR::IndirOpnd::New (functionObject, Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, dispatchStartLabel->m_func ),
1029
- IR::AddrOpnd::New (inlineesDataArray[i]->GetBody ()-> GetAddr (), IR::AddrOpndKindDynamicFunctionBody, dispatchStartLabel->m_func ), dispatchStartLabel->m_func ));
1034
+ IR::AddrOpnd::New (inlineesDataArray[i]->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionBody, dispatchStartLabel->m_func ), dispatchStartLabel->m_func ));
1030
1035
}
1031
1036
1032
1037
CompletePolymorphicInlining (callInstr, returnValueOpnd, doneLabel, dispatchStartLabel, /* ldMethodFldInstr*/ nullptr , IR::BailOutOnPolymorphicInlineFunction);
@@ -4063,14 +4068,14 @@ Inline::InsertJsFunctionCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr
4063
4068
}
4064
4069
4065
4070
void
4066
- Inline::InsertFunctionBodyCheck (IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, const FunctionJITTimeInfo *funcInfo)
4071
+ Inline::InsertFunctionInfoCheck (IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, const FunctionJITTimeInfo *funcInfo)
4067
4072
{
4068
4073
// if (JavascriptFunction::FromVar(r1)->functionInfo != funcInfo) goto noInlineLabel
4069
4074
// BrNeq_I4 noInlineLabel, r1->functionInfo, funcInfo
4070
- IR::IndirOpnd* funcBody = IR::IndirOpnd::New (callInstr->GetSrc1 ()->AsRegOpnd (), Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, callInstr->m_func );
4071
- IR::AddrOpnd* inlinedFuncBody = IR::AddrOpnd::New (funcInfo->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionBody , callInstr->m_func );
4072
- bailoutInstr->SetSrc1 (funcBody );
4073
- bailoutInstr->SetSrc2 (inlinedFuncBody );
4075
+ IR::IndirOpnd* opndFuncInfo = IR::IndirOpnd::New (callInstr->GetSrc1 ()->AsRegOpnd (), Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, callInstr->m_func );
4076
+ IR::AddrOpnd* inlinedFuncInfo = IR::AddrOpnd::New (funcInfo->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionInfo , callInstr->m_func );
4077
+ bailoutInstr->SetSrc1 (opndFuncInfo );
4078
+ bailoutInstr->SetSrc2 (inlinedFuncInfo );
4074
4079
4075
4080
insertBeforeInstr->InsertBefore (bailoutInstr);
4076
4081
}
@@ -4108,7 +4113,7 @@ Inline::PrepareInsertionPoint(IR::Instr *callInstr, const FunctionJITTimeInfo *f
4108
4113
InsertFunctionTypeIdCheck (callInstr, insertBeforeInstr, bailOutIfNotJsFunction);
4109
4114
4110
4115
// 3. Bailout if function body doesn't match funcInfo
4111
- InsertFunctionBodyCheck (callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo);
4116
+ InsertFunctionInfoCheck (callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo);
4112
4117
4113
4118
return primaryBailOutInstr;
4114
4119
}
0 commit comments