Bug 777583 - Add caller/callee use count ratio to balance inlining cost. r=djvj

This commit is contained in:
Nicolas B. Pierron 2012-09-29 00:50:58 -07:00
Родитель 5bca2c570a
Коммит 9cbce41576
2 изменённых файлов: 17 добавлений и 0 удалений

Просмотреть файл

@ -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)
{

Просмотреть файл

@ -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;