void InlineStrategy::NoteOutcome(InlineContext* context) { // Might want to differentiate candidates from non-candidates here... // We don't really attempt to inline non-candidates. m_InlineAttemptCount++; if (context->IsSuccess()) { m_InlineCount++; #if defined(DEBUG) || defined(INLINE_DATA) m_LastSuccessfulPolicy = context->m_Policy; #endif // defined(DEBUG) || defined(INLINE_DATA) // Budget update. // // If callee is a force inline, increase budget, provided all // parent contexts are likewise force inlines. // // If callee is discretionary or has a discretionary ancestor, // increase expense. InlineContext* currentContext = context; bool isForceInline = false; while (currentContext != m_RootContext) { InlineObservation observation = currentContext->GetObservation(); if (observation != InlineObservation::CALLEE_IS_FORCE_INLINE) { if (isForceInline) { // Interesting case where discretionary inlines pull // in a force inline... m_HasForceViaDiscretionary = true; } isForceInline = false; break; } isForceInline = true; currentContext = currentContext->GetParent(); } int timeDelta = EstimateTime(context); if (isForceInline) { // Update budget since this inline was forced. Only allow // budget to increase. if (timeDelta > 0) { m_CurrentTimeBudget += timeDelta; } } // Update time estimate. m_CurrentTimeEstimate += timeDelta; // Update size estimate. // // Sometimes estimates don't make sense. Don't let the method // size go negative. int sizeDelta = EstimateSize(context); if (m_CurrentSizeEstimate + sizeDelta <= 0) { sizeDelta = 0; } // Update the code size estimate. m_CurrentSizeEstimate += sizeDelta; } }
void InlineStrategy::NoteOutcome(InlineContext* context) { // Note we can't generally count up failures here -- we only // create contexts for failures in debug modes, and even then // we may not get them all. if (context->IsSuccess()) { m_InlineCount++; #if defined(DEBUG) || defined(INLINE_DATA) // Keep track of the inline targeted for data collection or, // if we don't have one (yet), the last successful inline. bool updateLast = (m_LastSuccessfulPolicy == nullptr) || !m_LastSuccessfulPolicy->IsDataCollectionTarget(); if (updateLast) { m_LastContext = context; m_LastSuccessfulPolicy = context->m_Policy; } else { // We only expect one inline to be a data collection // target. assert(!context->m_Policy->IsDataCollectionTarget()); } #endif // defined(DEBUG) || defined(INLINE_DATA) // Budget update. // // If callee is a force inline, increase budget, provided all // parent contexts are likewise force inlines. // // If callee is discretionary or has a discretionary ancestor, // increase expense. InlineContext* currentContext = context; bool isForceInline = false; while (currentContext != m_RootContext) { InlineObservation observation = currentContext->GetObservation(); if (observation != InlineObservation::CALLEE_IS_FORCE_INLINE) { if (isForceInline) { // Interesting case where discretionary inlines pull // in a force inline... m_HasForceViaDiscretionary = true; } isForceInline = false; break; } isForceInline = true; currentContext = currentContext->GetParent(); } int timeDelta = EstimateTime(context); if (isForceInline) { // Update budget since this inline was forced. Only allow // budget to increase. if (timeDelta > 0) { m_CurrentTimeBudget += timeDelta; } } // Update time estimate. m_CurrentTimeEstimate += timeDelta; // Update size estimate. // // Sometimes estimates don't make sense. Don't let the method // size go negative. int sizeDelta = EstimateSize(context); if (m_CurrentSizeEstimate + sizeDelta <= 0) { sizeDelta = 0; } // Update the code size estimate. m_CurrentSizeEstimate += sizeDelta; } }