@@ -524,7 +524,9 @@ uint Inline::FillInlineesDataArray(
524524 }
525525
526526 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
528530 {
529531 const FunctionJITTimeInfo* rightInlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeFunctionInfoAddr);
530532
@@ -571,28 +573,31 @@ void Inline::FillInlineesDataArrayUsingFixedMethods(
571573 JITTimeFunctionBody* inlineeFuncBody = nullptr ;
572574 while (inlineeJitTimeData)
573575 {
574- inlineeFuncBody = inlineeJitTimeData->GetBody ();
575- if (!PHASE_OFF (Js::PolymorphicInlinePhase, inlineeJitTimeData) && !PHASE_OFF (Js::PolymorphicInlineFixedMethodsPhase, inlineeJitTimeData))
576+ if (inlineeJitTimeData->HasBody ())
576577 {
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) )
579580 {
580- for (uint16 i = 0 ; i < cachedFixedInlineeCount; i++)
581+ const FunctionJITTimeInfo * jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfoAddr (inlineeJitTimeData->GetFunctionInfoAddr ());
582+ if (jitTimeData)
581583 {
582- if (inlineeJitTimeData-> GetFunctionInfoAddr () == fixedFieldInfoArray[i]. GetFuncInfoAddr () )
584+ for (uint16 i = 0 ; i < cachedFixedInlineeCount; i++ )
583585 {
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+ }
586591 }
587592 }
588- }
589- else
590- {
593+ else
594+ {
591595#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];
593597#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+ }
596601 }
597602 }
598603 inlineeJitTimeData = inlineeJitTimeData->GetNext ();
@@ -1026,7 +1031,7 @@ Inline::InlinePolymorphicFunction(IR::Instr *callInstr, const FunctionJITTimeInf
10261031 IR::RegOpnd* functionObject = callInstr->GetSrc1 ()->AsRegOpnd ();
10271032 dispatchStartLabel->InsertBefore (IR::BranchInstr::New (Js::OpCode::BrAddr_A, inlineeStartLabel,
10281033 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 ));
10301035 }
10311036
10321037 CompletePolymorphicInlining (callInstr, returnValueOpnd, doneLabel, dispatchStartLabel, /* ldMethodFldInstr*/ nullptr , IR::BailOutOnPolymorphicInlineFunction);
@@ -4124,14 +4129,14 @@ Inline::InsertJsFunctionCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr
41244129}
41254130
41264131void
4127- Inline::InsertFunctionBodyCheck (IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, const FunctionJITTimeInfo *funcInfo)
4132+ Inline::InsertFunctionInfoCheck (IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, const FunctionJITTimeInfo *funcInfo)
41284133{
41294134 // if (JavascriptFunction::FromVar(r1)->functionInfo != funcInfo) goto noInlineLabel
41304135 // BrNeq_I4 noInlineLabel, r1->functionInfo, funcInfo
4131- IR::IndirOpnd* funcBody = IR::IndirOpnd::New (callInstr->GetSrc1 ()->AsRegOpnd (), Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, callInstr->m_func );
4132- IR::AddrOpnd* inlinedFuncBody = IR::AddrOpnd::New (funcInfo->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionBody , callInstr->m_func );
4133- bailoutInstr->SetSrc1 (funcBody );
4134- bailoutInstr->SetSrc2 (inlinedFuncBody );
4136+ IR::IndirOpnd* opndFuncInfo = IR::IndirOpnd::New (callInstr->GetSrc1 ()->AsRegOpnd (), Js::JavascriptFunction::GetOffsetOfFunctionInfo (), TyMachPtr, callInstr->m_func );
4137+ IR::AddrOpnd* inlinedFuncInfo = IR::AddrOpnd::New (funcInfo->GetFunctionInfoAddr (), IR::AddrOpndKindDynamicFunctionInfo , callInstr->m_func );
4138+ bailoutInstr->SetSrc1 (opndFuncInfo );
4139+ bailoutInstr->SetSrc2 (inlinedFuncInfo );
41354140
41364141 insertBeforeInstr->InsertBefore (bailoutInstr);
41374142}
@@ -4169,7 +4174,7 @@ Inline::PrepareInsertionPoint(IR::Instr *callInstr, const FunctionJITTimeInfo *f
41694174 InsertFunctionTypeIdCheck (callInstr, insertBeforeInstr, bailOutIfNotJsFunction);
41704175
41714176 // 3. Bailout if function body doesn't match funcInfo
4172- InsertFunctionBodyCheck (callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo);
4177+ InsertFunctionInfoCheck (callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo);
41734178
41744179 return primaryBailOutInstr;
41754180}
0 commit comments