aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-08 16:49:17 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-08 16:49:17 -0700
commit94dfbf75aa9813432a60e6832f34f26e8b763512 (patch)
treef62a6cae2f0d72a38c4a0a2d1a51dd62649bec22 /tools/js-optimizer.js
parent24471090e1c6b6066b188960507ec1c7d988d705 (diff)
add read/writes in outlined functions
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r--tools/js-optimizer.js5
1 files changed, 4 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 39d58478..a5075910 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -3012,11 +3012,13 @@ function outline(ast) {
for (var v in varInfo.reads) {
if (v != 'sp') {
reps.push(['stat', ['assign', true, ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]);
+ code.unshift(['stat', ['assign', true, ['name', v], ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]]]]);
}
}
reps.push(['stat', ['call', ['name', newIdent], [['name', 'sp']]]]);
for (var v in varInfo.writes) {
reps.push(['stat', ['assign', true, ['name', v], ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]]]]);
+ code.push(['stat', ['assign', true, ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]);
}
stats.splice.apply(stats, [start, end-start+1].concat(reps));
// Generate new function
@@ -3095,7 +3097,8 @@ function outline(ast) {
denormalizeAsm(func, asmData);
});
- // TODO: control flow: route returns and breaks
+ // TODO: control flow: route returns and breaks. outlined code should have all breaks/continues/returns break into the outermost scope,
+ // after setting a state variable, etc.
// TODO: recurse into new functions, must be careful though so as to not quickly re-outline and leave an intermediary skeletal function
if (newFuncs.length > 0) {