From efd818b90d61a81b73b20f3d1720279f993faa2c Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Mon, 5 Jul 2021 14:17:48 +0300 Subject: [PATCH] JIT: don't report profile for methods with insufficient samples during prejitting (#55096) * Don't report profile for methods with insufficient samples for PREJIT --- src/coreclr/jit/importer.cpp | 23 ++++++++++++++++++----- src/coreclr/jit/jitconfigvalues.h | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index f65eb39fddc04f..e2a4257897d277 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -19073,17 +19073,30 @@ void Compiler::impMakeDiscretionaryInlineObservations(InlineInfo* pInlineInfo, I // If the call site has profile data, report the relative frequency of the site. // - if ((pInlineInfo != nullptr) && pInlineInfo->iciBlock->hasProfileWeight()) + if ((pInlineInfo != nullptr) && rootCompiler->fgHaveProfileData() && pInlineInfo->iciBlock->hasProfileWeight()) { - double callSiteWeight = (double)pInlineInfo->iciBlock->bbWeight; - double entryWeight = (double)impInlineRoot()->fgFirstBB->bbWeight; + BasicBlock::weight_t callSiteWeight = pInlineInfo->iciBlock->bbWeight; + BasicBlock::weight_t entryWeight = rootCompiler->fgFirstBB->bbWeight; + BasicBlock::weight_t profileFreq = entryWeight == 0.0f ? 0.0f : callSiteWeight / entryWeight; assert(callSiteWeight >= 0); assert(entryWeight >= 0); + BasicBlock::weight_t sufficientSamples = 1000.0f; + + if (!rootCompiler->opts.jitFlags->IsSet(JitFlags::JIT_FLAG_PREJIT) || + ((callSiteWeight + entryWeight) > sufficientSamples)) + { + // Let's not report profiles for methods with insufficient samples during prejitting. + inlineResult->NoteBool(InlineObservation::CALLSITE_HAS_PROFILE, true); + inlineResult->NoteDouble(InlineObservation::CALLSITE_PROFILE_FREQUENCY, profileFreq); + } + } + else if ((pInlineInfo == nullptr) && rootCompiler->fgHaveProfileData()) + { + // Simulate a hot callsite for PrejitRoot mode. inlineResult->NoteBool(InlineObservation::CALLSITE_HAS_PROFILE, true); - double frequency = entryWeight == 0.0 ? 0.0 : callSiteWeight / entryWeight; - inlineResult->NoteDouble(InlineObservation::CALLSITE_PROFILE_FREQUENCY, frequency); + inlineResult->NoteDouble(InlineObservation::CALLSITE_PROFILE_FREQUENCY, 1.0); } } diff --git a/src/coreclr/jit/jitconfigvalues.h b/src/coreclr/jit/jitconfigvalues.h index d55fe9be97f686..7527fd49221ce0 100644 --- a/src/coreclr/jit/jitconfigvalues.h +++ b/src/coreclr/jit/jitconfigvalues.h @@ -462,7 +462,7 @@ CONFIG_STRING(JitInlineReplayFile, W("JitInlineReplayFile")) CONFIG_INTEGER(JitExtDefaultPolicy, W("JitExtDefaultPolicy"), 1) CONFIG_INTEGER(JitExtDefaultPolicyMaxIL, W("JitExtDefaultPolicyMaxIL"), 0x64) CONFIG_INTEGER(JitExtDefaultPolicyMaxBB, W("JitExtDefaultPolicyMaxBB"), 7) -CONFIG_INTEGER(JitExtDefaultPolicyProfScale, W("JitExtDefaultPolicyProfScale"), 0x22) +CONFIG_INTEGER(JitExtDefaultPolicyProfScale, W("JitExtDefaultPolicyProfScale"), 0x2A) CONFIG_INTEGER(JitExtDefaultPolicyProfTrust, W("JitExtDefaultPolicyProfTrust"), 0x7) CONFIG_INTEGER(JitInlinePolicyModel, W("JitInlinePolicyModel"), 0)