diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-07-18 18:44:33 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-07-18 18:44:33 -0700 |
commit | 6e6807b4ce0448b00d8e10a222c44829bb3b60c7 (patch) | |
tree | bd47e6bdb455ba1ef9d6ee2433dd18344c73a36b | |
parent | 9f8c0f7512499408c93feaee3766a962e066e021 (diff) |
wipe out control flow variable before calling outlined code
-rw-r--r-- | tools/js-optimizer.js | 5 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1-output.js | 42 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline2-output.js | 8 |
3 files changed, 54 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a807b9cc..91e2928e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3131,8 +3131,11 @@ function outline(ast) { owned[v] = 1; } }); - // add spills and reads before and after the call to the outlined code, and in the outlined code itself var reps = []; + // wipe out control variable + reps.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlStackPos), ['num', 0])]); + reps.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlDataStackPos), ['num', 0])]); // XXX not really needed + // add spills and reads before and after the call to the outlined code, and in the outlined code itself keys(setUnion(codeInfo.reads, codeInfo.writes)).forEach(function(v) { if (!(v in owned)) { reps.push(['stat', ['assign', true, ['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]); diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js index c6a972d0..d3f469ef 100644 --- a/tools/test-js-optimizer-asm-outline1-output.js +++ b/tools/test-js-optimizer-asm-outline1-output.js @@ -6,7 +6,11 @@ function lin() { c(2); c(3); c(4); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin$1(sp); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin$0(sp); STACKTOP = sp; } @@ -19,7 +23,11 @@ function lin2() { c(2); c(3); c(4); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin2$1(sp); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin2$0(sp); } STACKTOP = sp; @@ -34,7 +42,11 @@ function lin3() { c(3); c(4); c(5); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin3$1(sp); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin3$0(sp); if ((HEAP32[sp + 0 >> 2] | 0) == 6) { STACKTOP = sp; @@ -53,7 +65,11 @@ function lin4() { c(2); c(3); c(4); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin4$1(sp); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin4$0(sp); if ((HEAP32[sp + 0 >> 2] | 0) == 1) { break; @@ -71,7 +87,11 @@ function lin5() { c(2); c(3); c(4); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin5$1(sp); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; lin5$0(sp); if ((HEAP32[sp + 0 >> 2] | 0) == 3) { continue; @@ -92,7 +112,11 @@ function mix() { c(5); c(6); c(7); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; mix$1(sp); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; mix$0(sp); if ((HEAP32[sp + 0 >> 2] | 0) == 1) { break; @@ -122,9 +146,13 @@ function vars(x, y) { var sp = 0; sp = STACKTOP; STACKTOP = STACKTOP + 32 | 0; + HEAP32[sp + 16 >> 2] = 0; + HEAP32[sp + 24 >> 2] = 0; HEAP32[sp + 0 >> 2] = x; HEAPF32[sp + 8 >> 2] = y; vars$1(sp); + HEAP32[sp + 16 >> 2] = 0; + HEAP32[sp + 24 >> 2] = 0; HEAP32[sp + 0 >> 2] = x; HEAPF32[sp + 8 >> 2] = y; vars$0(sp); @@ -140,6 +168,8 @@ function vars2(x, y) { b = y * x; a = c(1 + a); b = c(2 + b); + HEAP32[sp + 32 >> 2] = 0; + HEAP32[sp + 40 >> 2] = 0; HEAP32[sp + 16 >> 2] = a; HEAPF32[sp + 24 >> 2] = b; vars2$0(sp); @@ -153,11 +183,15 @@ function vars3(x, y) { var a = 0, sp = 0; sp = STACKTOP; STACKTOP = STACKTOP + 40 | 0; + HEAP32[sp + 24 >> 2] = 0; + HEAP32[sp + 32 >> 2] = 0; HEAP32[sp + 16 >> 2] = a; HEAP32[sp + 0 >> 2] = x; HEAPF32[sp + 8 >> 2] = y; vars3$1(sp); a = HEAP32[sp + 16 >> 2] | 0; + HEAP32[sp + 24 >> 2] = 0; + HEAP32[sp + 32 >> 2] = 0; HEAP32[sp + 16 >> 2] = a; HEAPF32[sp + 8 >> 2] = y; HEAP32[sp + 0 >> 2] = x; @@ -172,6 +206,8 @@ function vars4(x, y) { sp = STACKTOP; STACKTOP = STACKTOP + 48 | 0; a = x + y; + HEAP32[sp + 32 >> 2] = 0; + HEAP32[sp + 40 >> 2] = 0; HEAPF32[sp + 8 >> 2] = y; HEAP32[sp + 0 >> 2] = x; HEAP32[sp + 16 >> 2] = a; @@ -179,6 +215,8 @@ function vars4(x, y) { vars4$1(sp); b = +HEAPF32[sp + 24 >> 2]; a = HEAP32[sp + 16 >> 2] | 0; + HEAP32[sp + 32 >> 2] = 0; + HEAP32[sp + 40 >> 2] = 0; HEAP32[sp + 16 >> 2] = a; HEAP32[sp + 0 >> 2] = x; HEAPF32[sp + 24 >> 2] = b; @@ -194,6 +232,8 @@ function vars_w_stack(x, y) { sp = STACKTOP; STACKTOP = STACKTOP + 72 | 0; a = x + y; + HEAP32[sp + 56 >> 2] = 0; + HEAP32[sp + 64 >> 2] = 0; HEAPF32[sp + 24 >> 2] = y; HEAP32[sp + 16 >> 2] = x; HEAP32[sp + 32 >> 2] = a; @@ -201,6 +241,8 @@ function vars_w_stack(x, y) { vars_w_stack$1(sp); b = +HEAPF32[sp + 40 >> 2]; a = HEAP32[sp + 32 >> 2] | 0; + HEAP32[sp + 56 >> 2] = 0; + HEAP32[sp + 64 >> 2] = 0; HEAP32[sp + 32 >> 2] = a; HEAPF32[sp + 40 >> 2] = b; vars_w_stack$0(sp); diff --git a/tools/test-js-optimizer-asm-outline2-output.js b/tools/test-js-optimizer-asm-outline2-output.js index 40244c11..646c6517 100644 --- a/tools/test-js-optimizer-asm-outline2-output.js +++ b/tools/test-js-optimizer-asm-outline2-output.js @@ -11,7 +11,11 @@ function linear() { cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0); cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0); cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; linear$1(sp); + HEAP32[sp + 0 >> 2] = 0; + HEAP32[sp + 8 >> 2] = 0; linear$0(sp); STACKTOP = sp; } @@ -43,6 +47,8 @@ function _free($mem) { if (($mem + (-8 - $21 | 0) | 0) >>> 0 < $5 >>> 0) { _abort(); } + HEAP32[sp + 632 >> 2] = 0; + HEAP32[sp + 640 >> 2] = 0; HEAP32[sp + 40 >> 2] = $25; HEAP32[sp + 0 >> 2] = $mem; HEAP32[sp + 16 >> 2] = $10; @@ -96,6 +102,8 @@ function _free($mem) { _sys_trim(0) | 0; return; } + HEAP32[sp + 632 >> 2] = 0; + HEAP32[sp + 640 >> 2] = 0; HEAP32[sp + 24 >> 2] = $16; HEAP32[sp + 208 >> 2] = $psize_0; HEAP32[sp + 216 >> 2] = $p_0; |