aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-06-07 20:57:55 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-06-07 20:57:55 -0700
commit0f382355e385e94f933f9962bf8b7703614b7c16 (patch)
tree3fd3884a952e87e2fbdbf2b48629b9c56a6fa2e9
parent8c3c8879d0a6c70fce10ee645e0f871f44f3d45a (diff)
improve tempDoublePtr elimination and only run analysis when necessary
-rw-r--r--tools/js-optimizer.js65
-rw-r--r--tools/test-js-optimizer-asm-pre-output.js2
-rw-r--r--tools/test-js-optimizer-asm-pre.js2
3 files changed, 43 insertions, 26 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 7aff3a47..ee056c33 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -479,8 +479,12 @@ function simplifyExpressionsPre(ast) {
return true;
}
+ var hasTempDoublePtr = false;
+
traverseGenerated(ast, function(node, type) {
- if (type == 'binary' && node[1] == '&' && node[3][0] == 'num') {
+ if (type == 'name') {
+ if (node[1] == 'tempDoublePtr') hasTempDoublePtr = true;
+ } else if (type == 'binary' && node[1] == '&' && node[3][0] == 'num') {
if (node[2][0] == 'num') return ['num', node[2][1] & node[3][1]];
var input = node[2];
var amount = node[3][1];
@@ -533,36 +537,45 @@ function simplifyExpressionsPre(ast) {
node[3] = node[3][2];
}
}
- // remove bitcasts that are now obviously pointless, e.g.
- // HEAP32[$45 >> 2] = HEAPF32[tempDoublePtr >> 2] = ($14 < $28 ? $14 : $28) - $42, HEAP32[tempDoublePtr >> 2] | 0;
- var value = node[3];
- if (value[0] == 'seq' && value[1][0] == 'assign' && value[1][2][0] == 'sub' && value[1][2][1][0] == 'name' && value[1][2][1][1] == 'HEAPF32' &&
- value[1][2][2][0] == 'binary' && value[1][2][2][2][0] == 'name' && value[1][2][2][2][1] == 'tempDoublePtr') {
- // transform to HEAPF32[$45 >> 2] = ($14 < $28 ? $14 : $28) - $42;
- node[2][1][1] = 'HEAPF32';
- node[3] = value[1][3];
- }
- }
- } else if (type == 'seq') {
- // (HEAP32[tempDoublePtr >> 2] = HEAP32[$37 >> 2], +HEAPF32[tempDoublePtr >> 2])
- // ==>
- // +HEAPF32[$37 >> 2]
- if (node[0] == 'seq' && node[1][0] == 'assign' && node[1][2][0] == 'sub' && node[1][2][1][0] == 'name' &&
- (node[1][2][1][1] == 'HEAP32' || node[1][2][1][1] == 'HEAPF32') &&
- node[1][2][2][0] == 'binary' && node[1][2][2][2][0] == 'name' && node[1][2][2][2][1] == 'tempDoublePtr' &&
- node[1][3][0] == 'sub' && node[1][3][1][0] == 'name' && (node[1][3][1][1] == 'HEAP32' || node[1][3][1][1] == 'HEAPF32')) {
- if (node[1][2][1][1] == 'HEAP32') {
- node[1][3][1][1] = 'HEAPF32';
- return ['unary-prefix', '+', node[1][3]];
- } else {
- node[1][3][1][1] = 'HEAP32';
- return ['binary', '|', node[1][3], ['num', 0]];
- }
}
}
});
if (asm) {
+ if (hasTempDoublePtr) {
+ traverse(ast, function(node, type) {
+ if (type == 'assign') {
+ if (node[1] === true && node[2][0] == 'sub' && node[2][1][0] == 'name' && node[2][1][1] == 'HEAP32') {
+ // remove bitcasts that are now obviously pointless, e.g.
+ // HEAP32[$45 >> 2] = HEAPF32[tempDoublePtr >> 2] = ($14 < $28 ? $14 : $28) - $42, HEAP32[tempDoublePtr >> 2] | 0;
+ var value = node[3];
+ if (value[0] == 'seq' && value[1][0] == 'assign' && value[1][2][0] == 'sub' && value[1][2][1][0] == 'name' && value[1][2][1][1] == 'HEAPF32' &&
+ value[1][2][2][0] == 'binary' && value[1][2][2][2][0] == 'name' && value[1][2][2][2][1] == 'tempDoublePtr') {
+ // transform to HEAPF32[$45 >> 2] = ($14 < $28 ? $14 : $28) - $42;
+ node[2][1][1] = 'HEAPF32';
+ node[3] = value[1][3];
+ }
+ }
+ } else if (type == 'seq') {
+ // (HEAP32[tempDoublePtr >> 2] = HEAP32[$37 >> 2], +HEAPF32[tempDoublePtr >> 2])
+ // ==>
+ // +HEAPF32[$37 >> 2]
+ if (node[0] == 'seq' && node[1][0] == 'assign' && node[1][2][0] == 'sub' && node[1][2][1][0] == 'name' &&
+ (node[1][2][1][1] == 'HEAP32' || node[1][2][1][1] == 'HEAPF32') &&
+ node[1][2][2][0] == 'binary' && node[1][2][2][2][0] == 'name' && node[1][2][2][2][1] == 'tempDoublePtr' &&
+ node[1][3][0] == 'sub' && node[1][3][1][0] == 'name' && (node[1][3][1][1] == 'HEAP32' || node[1][3][1][1] == 'HEAPF32')) {
+ if (node[1][2][1][1] == 'HEAP32') {
+ node[1][3][1][1] = 'HEAPF32';
+ return ['unary-prefix', '+', node[1][3]];
+ } else {
+ node[1][3][1][1] = 'HEAP32';
+ return ['binary', '|', node[1][3], ['num', 0]];
+ }
+ }
+ }
+ });
+ }
+
// optimize num >> num, in asm we need this here since we do not run optimizeShifts
traverseGenerated(ast, function(node, type) {
if (type == 'binary' && node[1] == '>>' && node[2][0] == 'num' && node[3][0] == 'num') {
diff --git a/tools/test-js-optimizer-asm-pre-output.js b/tools/test-js-optimizer-asm-pre-output.js
index 2f1fca1d..ae1140b1 100644
--- a/tools/test-js-optimizer-asm-pre-output.js
+++ b/tools/test-js-optimizer-asm-pre-output.js
@@ -116,5 +116,7 @@ function tempDoublePtr($45, $14, $28, $42) {
HEAP32[$world + 102916 >> 2] = _malloc(192) | 0;
f(+HEAPF32[$45 >> 2]);
g(HEAP32[$14 >> 2] | 0);
+ $42 = +HEAPF32[$42 >> 2];
+ ch($42);
}
diff --git a/tools/test-js-optimizer-asm-pre.js b/tools/test-js-optimizer-asm-pre.js
index 16a2566a..d28743c5 100644
--- a/tools/test-js-optimizer-asm-pre.js
+++ b/tools/test-js-optimizer-asm-pre.js
@@ -118,5 +118,7 @@ function tempDoublePtr($45, $14, $28, $42) {
HEAP32[$world + 102916 >> 2] = _malloc(192) | 0;
f((HEAP32[tempDoublePtr >> 2] = HEAP32[$45 >> 2], +HEAPF32[tempDoublePtr >> 2]));
g((HEAPF32[tempDoublePtr >> 2] = HEAPF32[$14 >> 2], HEAP32[tempDoublePtr >> 2] | 0));
+ $42 = (HEAP32[tempDoublePtr >> 2] = HEAP32[$42 >> 2] | 0, +HEAPF32[tempDoublePtr >> 2]);
+ ch($42);
}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "rett", "ret2t", "retf", "i32_8", "tempDoublePtr"]