diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-12-30 14:48:47 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-12-30 14:48:47 -0800 |
commit | 2063a3112d90dd65a4764f2c0c29860a20b2fec1 (patch) | |
tree | 40df42edbef480e33fbc8851f5e23e633a0d6a42 /tools/js-optimizer.js | |
parent | 3d9832b7518bfd7b0585269fcb0ec605fff5f8e3 (diff) |
add var for new variables in shiftOptimizer, and tweak cost function logic
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 3bfa3c8b..81512ed4 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -355,7 +355,7 @@ function simplifyExpressionsPre(ast) { // very often. We can in some cases do the shift on the variable itself when it is set, // to greatly reduce the number of shift operations. // TODO: when shifting a variable, if there are other uses, keep an unshifted version too, to prevent slowdowns? -function optimizeShifts(ast) { +function optimizeShiftsInternal(ast, conservative) { traverseGeneratedFunctions(ast, function(fun) { var funMore = true; var funFinished = {}; @@ -446,13 +446,18 @@ function optimizeShifts(ast) { if (funFinished[name]) continue; // We have one shift size (and possible unshifted uses). Consider replacing this variable with a shifted clone. If // the estimated benefit is >0, we will do it - data.replaceOriginal = data.uses == totalTimesShifted; // if always shifted, replace the original - if (!data.replaceOriginal) { - data.benefit = totalTimesShifted - (data.uses-totalTimesShifted) - data.defs - (data.param ? 1 : 0); + data.replaceOriginal = false; // Let later passes remove unneeded new variables. The only case where that might not + // work perfectly is with parameters, but inlining can fix even that + if (data.replaceOriginal) { + assert(0); + data.benefit = totalTimesShifted - ((data.uses-totalTimesShifted) + data.defs + (data.param ? 1 : 0)); } else { // We keep the original around, so there is some additional cost for each def, but none for unshifted uses - data.benefit = totalTimesShifted - 2*(data.defs + (data.param ? 1 : 0)); + if (data.defs == 1) { // bad 11 12 ok + data.benefit = totalTimesShifted - 11; + } } + if (conservative) data.benefit = 0; if (data.benefit > 0) { funMore = true; // We will reprocess this function for (var i = 0; i < 4; i++) { @@ -475,13 +480,17 @@ function optimizeShifts(ast) { function needsShift(name) { return vars[name] && vars[name].primaryShift >= 0; } - for (var name in vars) { // add shifts for params + for (var name in vars) { // add shifts for params and var's for all new variables var data = vars[name]; - if (data.param && needsShift(name)) { - if (data.replaceOriginal) { - fun[3].unshift(['stat', ['assign', '>>', ['name', name], ['num', data.primaryShift]]]); + if (needsShift(name)) { + if (data.param) { + if (data.replaceOriginal) { + fun[3].unshift(['stat', ['assign', '>>', ['name', name], ['num', data.primaryShift]]]); + } else { + fun[3].unshift(['var', [[name + '$s' + data.primaryShift, ['binary', '>>', ['name', name], ['num', data.primaryShift]]]]]); + } } else { - fun[3].unshift(['var', [[name + '$s' + data.primaryShift, ['binary', '>>', ['name', name], ['num', data.primaryShift]]]]]); + fun[3].unshift(['var', [[name + '$s' + data.primaryShift]]]); } } } @@ -698,6 +707,14 @@ function optimizeShifts(ast) { }); } +function optimizeShiftsConservative(ast) { + optimizeShiftsInternal(ast, true); +} + +function optimizeShiftsAggressive(ast) { + optimizeShiftsInternal(ast, false); +} + function simplifyExpressionsPost(ast) { // We often have branchings that are simplified so one end vanishes, and // we then get @@ -976,7 +993,8 @@ var passes = { removeAssignsToUndefined: removeAssignsToUndefined, //removeUnneededLabelSettings: removeUnneededLabelSettings, simplifyExpressionsPre: simplifyExpressionsPre, - optimizeShifts: optimizeShifts, + optimizeShiftsConservative: optimizeShiftsConservative, + optimizeShiftsAggressive: optimizeShiftsAggressive, simplifyExpressionsPost: simplifyExpressionsPost, hoistMultiples: hoistMultiples, loopOptimizer: loopOptimizer |