aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/js-optimizer.js22
-rw-r--r--tools/test-js-optimizer-asm-outline2-output.js160
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;
}