From 9cbce4157642dd46e499845d298fdf7b842f7e14 Mon Sep 17 00:00:00 2001 From: "Nicolas B. Pierron" Date: Sat, 29 Sep 2012 00:50:58 -0700 Subject: [PATCH] Bug 777583 - Add caller/callee use count ratio to balance inlining cost. r=djvj --- js/src/ion/Ion.h | 7 +++++++ js/src/ion/IonBuilder.cpp | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/js/src/ion/Ion.h b/js/src/ion/Ion.h index 7ad116ef7f35..a014bc20c83f 100644 --- a/js/src/ion/Ion.h +++ b/js/src/ion/Ion.h @@ -129,6 +129,12 @@ struct IonOptions // Default: 800 uint32 inlineMaxTotalBytecodeLength; + // Minimal ratio between the use counts of the caller and the callee to + // enable inlining of functions. + // + // Default: 128 + uint32 inlineUseCountRatio; + // Whether functions are compiled immediately. // // Default: false @@ -170,6 +176,7 @@ struct IonOptions smallFunctionUsesBeforeInlining(usesBeforeInlining / 4), polyInlineMax(4), inlineMaxTotalBytecodeLength(800), + inlineUseCountRatio(128), eagerCompilation(false), slowCallLimit(512) { diff --git a/js/src/ion/IonBuilder.cpp b/js/src/ion/IonBuilder.cpp index fd7f226386ff..a5ba2ce150eb 100644 --- a/js/src/ion/IonBuilder.cpp +++ b/js/src/ion/IonBuilder.cpp @@ -2898,6 +2898,10 @@ IonBuilder::makeInliningDecision(AutoObjectVector &targets) // 2. The cost of inlining (in terms of size expansion of the SSA graph), // and size expansion of the ultimately generated code, will be // less significant. + // 3. Do not inline functions which are not called as frequently as their + // callers. + + uint32_t callerUses = script_->getUseCount(); uint32_t totalSize = 0; uint32_t checkUses = js_IonOptions.usesBeforeInlining; @@ -2908,12 +2912,18 @@ IonBuilder::makeInliningDecision(AutoObjectVector &targets) return false; JSScript *script = target->script(); + uint32_t calleeUses = script->getUseCount(); totalSize += script->length; if (totalSize > js_IonOptions.inlineMaxTotalBytecodeLength) return false; if (script->length > js_IonOptions.smallFunctionMaxBytecodeLength) allFunctionsAreSmall = false; + + if (calleeUses * js_IonOptions.inlineUseCountRatio < callerUses) { + IonSpew(IonSpew_Inlining, "Not inlining, callee is not hot"); + return false; + } } if (allFunctionsAreSmall) checkUses = js_IonOptions.smallFunctionUsesBeforeInlining;