bool CodeGenWorkItem::ShouldSpeculativelyJitBasedOnProfile() const { Js::FunctionBody* functionBody = this->GetFunctionBody(); uint loopPercentage = (functionBody->GetByteCodeInLoopCount()*100) / (functionBody->GetByteCodeCount() + 1); uint straightLineSize = functionBody->GetByteCodeCount() - functionBody->GetByteCodeInLoopCount(); // This ensures only small and loopy functions are prejitted. if(loopPercentage >= 50 || straightLineSize < 300) { Js::SourceDynamicProfileManager* profileManager = functionBody->GetSourceContextInfo()->sourceDynamicProfileManager; if(profileManager != nullptr) { functionBody->SetIsSpeculativeJitCandidate(); if(!functionBody->HasDynamicProfileInfo()) { return false; } Js::ExecutionFlags executionFlags = profileManager->IsFunctionExecuted(functionBody->GetLocalFunctionId()); if(executionFlags == Js::ExecutionFlags_Executed) { return true; } } } return false; }