diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-07-18 17:28:12 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-07-18 17:28:12 -0700 |
commit | c04260c0a1a66feac67ec8ed2d96793d255964d9 (patch) | |
tree | 479391a01938a6112cdd3e18b35b41e4e181d8d9 /tools | |
parent | c99739bd21d223decc52bb178e9cff96173999d6 (diff) |
do not emit spills in outlined code for variables that only appear in the outlines code
Diffstat (limited to 'tools')
-rw-r--r-- | tools/js-optimizer.js | 22 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline2-output.js | 160 |
2 files changed, 17 insertions, 165 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 3b460546..6e37cca8 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3122,17 +3122,27 @@ function outline(ast) { printErr(' do outline ' + [func[1], level, 'range:', start, end, 'of', stats.length]); var code = stats.slice(start, end+1); var newIdent = func[1] + '$' + (asmData.splitCounter++); - // add spills and reads before and after the call to the outlined code, and in the outlined code itself + // analyze variables, and find 'owned' variables - that only appear in the outlined code, and do not need any spill support var codeInfo = analyzeCode(func, asmData, code); + var allCodeInfo = analyzeCode(func, asmData, func); + var owned = { sp: 1 }; // sp is always owned, each has its own + keys(setUnion(codeInfo.reads, codeInfo.writes)).forEach(function(v) { + if (allCodeInfo.reads[v] === codeInfo.reads[v] && allCodeInfo.writes[v] === codeInfo.writes[v]) { + owned[v] = 1; + } + }); + // add spills and reads before and after the call to the outlined code, and in the outlined code itself var reps = []; keys(setUnion(codeInfo.reads, codeInfo.writes)).forEach(function(v) { - if (v != 'sp') { + 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]]]); } }); reps.push(['stat', ['call', ['name', newIdent], [['name', 'sp']]]]); for (var v in codeInfo.writes) { - reps.push(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]); + if (!(v in owned)) { + reps.push(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]); + } } // Generate new function if (codeInfo.hasReturn || codeInfo.hasReturnInt || codeInfo.hasReturnDouble || codeInfo.hasBreak || codeInfo.hasContinue) { @@ -3252,12 +3262,14 @@ function outline(ast) { } // add spills and unspills in outlined code outside the OL loop keys(setUnion(codeInfo.reads, codeInfo.writes)).forEach(function(v) { - if (v != 'sp') { + if (!(v in owned)) { code.unshift(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]); } }); for (var v in codeInfo.writes) { - code.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]]]); + if (!(v in owned)) { + code.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]]]); + } } // finalize var newFunc = ['defun', newIdent, ['sp'], code]; diff --git a/tools/test-js-optimizer-asm-outline2-output.js b/tools/test-js-optimizer-asm-outline2-output.js index c70b0030..40244c11 100644 --- a/tools/test-js-optimizer-asm-outline2-output.js +++ b/tools/test-js-optimizer-asm-outline2-output.js @@ -48,50 +48,12 @@ function _free($mem) { HEAP32[sp + 16 >> 2] = $10; HEAP32[sp + 48 >> 2] = $26; HEAP32[sp + 32 >> 2] = $21; - HEAP32[sp + 56 >> 2] = $37; - HEAP32[sp + 64 >> 2] = $40; HEAP32[sp + 8 >> 2] = $5; - HEAP32[sp + 72 >> 2] = $_pre_phi307; - HEAP32[sp + 80 >> 2] = $69; - HEAP32[sp + 88 >> 2] = $72; - HEAP32[sp + 96 >> 2] = $75; - HEAP32[sp + 112 >> 2] = $95; - HEAP32[sp + 120 >> 2] = $100; - HEAP32[sp + 176 >> 2] = $R_1; - HEAP32[sp + 136 >> 2] = $R_0; - HEAP32[sp + 128 >> 2] = $RP_0; - HEAP32[sp + 144 >> 2] = $102; - HEAP32[sp + 152 >> 2] = $103; - HEAP32[sp + 160 >> 2] = $106; - HEAP32[sp + 168 >> 2] = $107; - HEAP32[sp + 104 >> 2] = $80; - HEAP32[sp + 184 >> 2] = $120; - HEAP32[sp + 192 >> 2] = $151; - HEAP32[sp + 200 >> 2] = $164; HEAP32[sp + 216 >> 2] = $p_0; HEAP32[sp + 208 >> 2] = $psize_0; _free$1(sp); $p_0 = HEAP32[sp + 216 >> 2] | 0; $psize_0 = HEAP32[sp + 208 >> 2] | 0; - $37 = HEAP32[sp + 56 >> 2] | 0; - $40 = HEAP32[sp + 64 >> 2] | 0; - $_pre_phi307 = HEAP32[sp + 72 >> 2] | 0; - $69 = HEAP32[sp + 80 >> 2] | 0; - $72 = HEAP32[sp + 88 >> 2] | 0; - $75 = HEAP32[sp + 96 >> 2] | 0; - $95 = HEAP32[sp + 112 >> 2] | 0; - $100 = HEAP32[sp + 120 >> 2] | 0; - $R_1 = HEAP32[sp + 176 >> 2] | 0; - $R_0 = HEAP32[sp + 136 >> 2] | 0; - $RP_0 = HEAP32[sp + 128 >> 2] | 0; - $102 = HEAP32[sp + 144 >> 2] | 0; - $103 = HEAP32[sp + 152 >> 2] | 0; - $106 = HEAP32[sp + 160 >> 2] | 0; - $107 = HEAP32[sp + 168 >> 2] | 0; - $80 = HEAP32[sp + 104 >> 2] | 0; - $120 = HEAP32[sp + 184 >> 2] | 0; - $151 = HEAP32[sp + 192 >> 2] | 0; - $164 = HEAP32[sp + 200 >> 2] | 0; if ((HEAP32[sp + 632 >> 2] | 0) == 5) { return; } @@ -135,56 +97,14 @@ function _free($mem) { return; } HEAP32[sp + 24 >> 2] = $16; - HEAP32[sp + 248 >> 2] = $220; HEAP32[sp + 208 >> 2] = $psize_0; HEAP32[sp + 216 >> 2] = $p_0; HEAP32[sp + 224 >> 2] = $189; - HEAP32[sp + 256 >> 2] = $227; HEAP32[sp + 232 >> 2] = $194; - HEAP32[sp + 264 >> 2] = $233; HEAP32[sp + 0 >> 2] = $mem; HEAP32[sp + 16 >> 2] = $10; - HEAP32[sp + 272 >> 2] = $236; - HEAP32[sp + 280 >> 2] = $_pre_phi305; - HEAP32[sp + 288 >> 2] = $267; - HEAP32[sp + 296 >> 2] = $270; - HEAP32[sp + 304 >> 2] = $273; - HEAP32[sp + 320 >> 2] = $294; - HEAP32[sp + 328 >> 2] = $299; - HEAP32[sp + 384 >> 2] = $R7_1; - HEAP32[sp + 344 >> 2] = $R7_0; - HEAP32[sp + 336 >> 2] = $RP9_0; - HEAP32[sp + 352 >> 2] = $301; - HEAP32[sp + 360 >> 2] = $302; - HEAP32[sp + 368 >> 2] = $305; - HEAP32[sp + 376 >> 2] = $306; - HEAP32[sp + 312 >> 2] = $278; - HEAP32[sp + 392 >> 2] = $320; - HEAP32[sp + 400 >> 2] = $351; - HEAP32[sp + 408 >> 2] = $364; HEAP32[sp + 416 >> 2] = $psize_1; _free$0(sp); - $220 = HEAP32[sp + 248 >> 2] | 0; - $227 = HEAP32[sp + 256 >> 2] | 0; - $233 = HEAP32[sp + 264 >> 2] | 0; - $236 = HEAP32[sp + 272 >> 2] | 0; - $_pre_phi305 = HEAP32[sp + 280 >> 2] | 0; - $267 = HEAP32[sp + 288 >> 2] | 0; - $270 = HEAP32[sp + 296 >> 2] | 0; - $273 = HEAP32[sp + 304 >> 2] | 0; - $294 = HEAP32[sp + 320 >> 2] | 0; - $299 = HEAP32[sp + 328 >> 2] | 0; - $R7_1 = HEAP32[sp + 384 >> 2] | 0; - $R7_0 = HEAP32[sp + 344 >> 2] | 0; - $RP9_0 = HEAP32[sp + 336 >> 2] | 0; - $301 = HEAP32[sp + 352 >> 2] | 0; - $302 = HEAP32[sp + 360 >> 2] | 0; - $305 = HEAP32[sp + 368 >> 2] | 0; - $306 = HEAP32[sp + 376 >> 2] | 0; - $278 = HEAP32[sp + 312 >> 2] | 0; - $320 = HEAP32[sp + 392 >> 2] | 0; - $351 = HEAP32[sp + 400 >> 2] | 0; - $364 = HEAP32[sp + 408 >> 2] | 0; $psize_1 = HEAP32[sp + 416 >> 2] | 0; if ((HEAP32[sp + 632 >> 2] | 0) == 5) { return; @@ -357,33 +277,12 @@ function _free$0(sp) { sp = sp | 0; var $16 = 0, $220 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $227 = 0, $194 = 0, $233 = 0, $mem = 0, $10 = 0, $236 = 0, $_pre_phi305 = 0, $267 = 0, $270 = 0, $273 = 0, $294 = 0, $299 = 0, $R7_1 = 0, $R7_0 = 0, $RP9_0 = 0, $301 = 0, $302 = 0, $305 = 0, $306 = 0, $278 = 0, $320 = 0, $351 = 0, $364 = 0, $psize_1 = 0; $psize_1 = HEAP32[sp + 416 >> 2] | 0; - $364 = HEAP32[sp + 408 >> 2] | 0; - $351 = HEAP32[sp + 400 >> 2] | 0; - $320 = HEAP32[sp + 392 >> 2] | 0; - $278 = HEAP32[sp + 312 >> 2] | 0; - $306 = HEAP32[sp + 376 >> 2] | 0; - $305 = HEAP32[sp + 368 >> 2] | 0; - $302 = HEAP32[sp + 360 >> 2] | 0; - $301 = HEAP32[sp + 352 >> 2] | 0; - $RP9_0 = HEAP32[sp + 336 >> 2] | 0; - $R7_0 = HEAP32[sp + 344 >> 2] | 0; - $R7_1 = HEAP32[sp + 384 >> 2] | 0; - $299 = HEAP32[sp + 328 >> 2] | 0; - $294 = HEAP32[sp + 320 >> 2] | 0; - $273 = HEAP32[sp + 304 >> 2] | 0; - $270 = HEAP32[sp + 296 >> 2] | 0; - $267 = HEAP32[sp + 288 >> 2] | 0; - $_pre_phi305 = HEAP32[sp + 280 >> 2] | 0; - $236 = HEAP32[sp + 272 >> 2] | 0; $10 = HEAP32[sp + 16 >> 2] | 0; $mem = HEAP32[sp + 0 >> 2] | 0; - $233 = HEAP32[sp + 264 >> 2] | 0; $194 = HEAP32[sp + 232 >> 2] | 0; - $227 = HEAP32[sp + 256 >> 2] | 0; $189 = HEAP32[sp + 224 >> 2] | 0; $p_0 = HEAP32[sp + 216 >> 2] | 0; $psize_0 = HEAP32[sp + 208 >> 2] | 0; - $220 = HEAP32[sp + 248 >> 2] | 0; $16 = HEAP32[sp + 24 >> 2] | 0; OL : do { if (($16 | 0) == (HEAP32[25] | 0)) { @@ -559,27 +458,6 @@ function _free$0(sp) { HEAP32[sp + 632 >> 2] = 5; break OL; } while (0); - HEAP32[sp + 248 >> 2] = $220; - HEAP32[sp + 256 >> 2] = $227; - HEAP32[sp + 264 >> 2] = $233; - HEAP32[sp + 272 >> 2] = $236; - HEAP32[sp + 280 >> 2] = $_pre_phi305; - HEAP32[sp + 288 >> 2] = $267; - HEAP32[sp + 296 >> 2] = $270; - HEAP32[sp + 304 >> 2] = $273; - HEAP32[sp + 320 >> 2] = $294; - HEAP32[sp + 328 >> 2] = $299; - HEAP32[sp + 384 >> 2] = $R7_1; - HEAP32[sp + 344 >> 2] = $R7_0; - HEAP32[sp + 336 >> 2] = $RP9_0; - HEAP32[sp + 352 >> 2] = $301; - HEAP32[sp + 360 >> 2] = $302; - HEAP32[sp + 368 >> 2] = $305; - HEAP32[sp + 376 >> 2] = $306; - HEAP32[sp + 312 >> 2] = $278; - HEAP32[sp + 392 >> 2] = $320; - HEAP32[sp + 400 >> 2] = $351; - HEAP32[sp + 408 >> 2] = $364; HEAP32[sp + 416 >> 2] = $psize_1; } function _free$1(sp) { @@ -587,26 +465,7 @@ function _free$1(sp) { var $25 = 0, $mem = 0, $10 = 0, $26 = 0, $21 = 0, $37 = 0, $40 = 0, $5 = 0, $_pre_phi307 = 0, $69 = 0, $72 = 0, $75 = 0, $95 = 0, $100 = 0, $R_1 = 0, $R_0 = 0, $RP_0 = 0, $102 = 0, $103 = 0, $106 = 0, $107 = 0, $80 = 0, $120 = 0, $151 = 0, $164 = 0, $p_0 = 0, $psize_0 = 0; $psize_0 = HEAP32[sp + 208 >> 2] | 0; $p_0 = HEAP32[sp + 216 >> 2] | 0; - $164 = HEAP32[sp + 200 >> 2] | 0; - $151 = HEAP32[sp + 192 >> 2] | 0; - $120 = HEAP32[sp + 184 >> 2] | 0; - $80 = HEAP32[sp + 104 >> 2] | 0; - $107 = HEAP32[sp + 168 >> 2] | 0; - $106 = HEAP32[sp + 160 >> 2] | 0; - $103 = HEAP32[sp + 152 >> 2] | 0; - $102 = HEAP32[sp + 144 >> 2] | 0; - $RP_0 = HEAP32[sp + 128 >> 2] | 0; - $R_0 = HEAP32[sp + 136 >> 2] | 0; - $R_1 = HEAP32[sp + 176 >> 2] | 0; - $100 = HEAP32[sp + 120 >> 2] | 0; - $95 = HEAP32[sp + 112 >> 2] | 0; - $75 = HEAP32[sp + 96 >> 2] | 0; - $72 = HEAP32[sp + 88 >> 2] | 0; - $69 = HEAP32[sp + 80 >> 2] | 0; - $_pre_phi307 = HEAP32[sp + 72 >> 2] | 0; $5 = HEAP32[sp + 8 >> 2] | 0; - $40 = HEAP32[sp + 64 >> 2] | 0; - $37 = HEAP32[sp + 56 >> 2] | 0; $21 = HEAP32[sp + 32 >> 2] | 0; $26 = HEAP32[sp + 48 >> 2] | 0; $10 = HEAP32[sp + 16 >> 2] | 0; @@ -803,24 +662,5 @@ function _free$1(sp) { } while (0); HEAP32[sp + 216 >> 2] = $p_0; HEAP32[sp + 208 >> 2] = $psize_0; - HEAP32[sp + 56 >> 2] = $37; - HEAP32[sp + 64 >> 2] = $40; - HEAP32[sp + 72 >> 2] = $_pre_phi307; - HEAP32[sp + 80 >> 2] = $69; - HEAP32[sp + 88 >> 2] = $72; - HEAP32[sp + 96 >> 2] = $75; - HEAP32[sp + 112 >> 2] = $95; - HEAP32[sp + 120 >> 2] = $100; - HEAP32[sp + 176 >> 2] = $R_1; - HEAP32[sp + 136 >> 2] = $R_0; - HEAP32[sp + 128 >> 2] = $RP_0; - HEAP32[sp + 144 >> 2] = $102; - HEAP32[sp + 152 >> 2] = $103; - HEAP32[sp + 160 >> 2] = $106; - HEAP32[sp + 168 >> 2] = $107; - HEAP32[sp + 104 >> 2] = $80; - HEAP32[sp + 184 >> 2] = $120; - HEAP32[sp + 192 >> 2] = $151; - HEAP32[sp + 200 >> 2] = $164; } |