Skip to content

Commit c0fdf61

Browse files
committed
do not eliminate loop vars if there are non-loop vars in the else that are influenced by the loop var or the helper
1 parent d93fd81 commit c0fdf61

File tree

3 files changed

+109
-1
lines changed

3 files changed

+109
-1
lines changed

tools/eliminator/asm-eliminator-test-output.js

+44
Original file line numberDiff line numberDiff line change
@@ -857,4 +857,48 @@ function elimOneLoopVar($argc, $argv) {
857857
HEAP32[$vararg_buffer1 >> 2] = $curri$012;
858858
return $retval$0 | 0;
859859
}
860+
function elimOneLoopVar2() {
861+
var $storemerge3$neg9 = 0, $18 = 0, $25 = 0, $26 = 0, $30 = 0, $jp = 0;
862+
$storemerge3$neg9 = -1;
863+
while (1) {
864+
$25 = $jp + ($26 << 2) | 0;
865+
HEAP32[$25 >> 2] = ($18 + $storemerge3$neg9 | 0) + (HEAP32[$25 >> 2] | 0) | 0;
866+
$30 = $26 + 1 | 0;
867+
if (($30 | 0) == 63) {
868+
break;
869+
} else {
870+
$storemerge3$neg9 = $26 ^ -1;
871+
$26 = $30;
872+
}
873+
}
874+
}
875+
function elimOneLoopVar3() {
876+
var $storemerge3$neg9 = 0, $18 = 0, $25 = 0, $26 = 0, $30 = 0, $jp = 0;
877+
$storemerge3$neg9 = -1;
878+
while (1) {
879+
$25 = $jp + ($26 << 2) | 0;
880+
HEAP32[$25 >> 2] = ($18 + $storemerge3$neg9 | 0) + (HEAP32[$25 >> 2] | 0) | 0;
881+
$30 = $26 + 1 | 0;
882+
if (($30 | 0) == 63) {
883+
break;
884+
} else {
885+
$storemerge3$neg9 = $30 ^ -1;
886+
$26 = $30;
887+
}
888+
}
889+
}
890+
function elimOneLoopVar4() {
891+
var $storemerge3$neg9 = 0, $18 = 0, $25 = 0, $26 = 0, $jp = 0;
892+
$storemerge3$neg9 = -1;
893+
while (1) {
894+
$25 = $jp + ($26 << 2) | 0;
895+
HEAP32[$25 >> 2] = ($18 + $storemerge3$neg9 | 0) + (HEAP32[$25 >> 2] | 0) | 0;
896+
$26 = $26 + 1 | 0;
897+
if (($26 | 0) == 63) {
898+
break;
899+
} else {
900+
$storemerge3$neg9 = $18 ^ -1;
901+
}
902+
}
903+
}
860904

tools/eliminator/asm-eliminator-test.js

+46-1
Original file line numberDiff line numberDiff line change
@@ -1086,5 +1086,50 @@ function elimOneLoopVar($argc, $argv) {
10861086
HEAP32[$vararg_buffer1 >> 2] = $curri$012;
10871087
return $retval$0 | 0;
10881088
}
1089-
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "__Z11printResultPiS_j", "_segment_holding", "__ZN5identC2EiPKcPci", "_vec2Length", "exc", "label", "confuusion", "tempDouble", "_org_apache_harmony_luni_util_NumberConverter_freeFormat__", "__ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_", "_java_nio_charset_Charset_forNameInternal___java_lang_String", "looop2", "looop3", "looop4", "looop5", "looop6", "looop7", "looop8", "multiloop", "multiloop2", "tempDouble2", "watIf", "select2", "binary", "cute", "selfAssign", "elimOneLoopVar"]
1089+
function elimOneLoopVar2() {
1090+
var $storemerge3$neg9 = 0, $18 = 0, $25 = 0, $26 = 0, $30 = 0, $jp = 0;
1091+
$storemerge3$neg9 = -1;
1092+
while (1) {
1093+
$25 = $jp + ($26 << 2) | 0;
1094+
HEAP32[$25 >> 2] = ($18 + $storemerge3$neg9 | 0) + (HEAP32[$25 >> 2] | 0) | 0;
1095+
$30 = $26 + 1 | 0;
1096+
if (($30 | 0) == 63) {
1097+
break;
1098+
} else {
1099+
$storemerge3$neg9 = $26 ^ -1; // $26 is a loopvar, use here is dangerous
1100+
$26 = $30;
1101+
}
1102+
}
1103+
}
1104+
function elimOneLoopVar3() {
1105+
var $storemerge3$neg9 = 0, $18 = 0, $25 = 0, $26 = 0, $30 = 0, $jp = 0;
1106+
$storemerge3$neg9 = -1;
1107+
while (1) {
1108+
$25 = $jp + ($26 << 2) | 0;
1109+
HEAP32[$25 >> 2] = ($18 + $storemerge3$neg9 | 0) + (HEAP32[$25 >> 2] | 0) | 0;
1110+
$30 = $26 + 1 | 0;
1111+
if (($30 | 0) == 63) {
1112+
break;
1113+
} else {
1114+
$storemerge3$neg9 = $30 ^ -1; // $26 is a helper, use here is dangerous
1115+
$26 = $30;
1116+
}
1117+
}
1118+
}
1119+
function elimOneLoopVar4() {
1120+
var $storemerge3$neg9 = 0, $18 = 0, $25 = 0, $26 = 0, $30 = 0, $jp = 0;
1121+
$storemerge3$neg9 = -1;
1122+
while (1) {
1123+
$25 = $jp + ($26 << 2) | 0;
1124+
HEAP32[$25 >> 2] = ($18 + $storemerge3$neg9 | 0) + (HEAP32[$25 >> 2] | 0) | 0;
1125+
$30 = $26 + 1 | 0;
1126+
if (($30 | 0) == 63) {
1127+
break;
1128+
} else {
1129+
$storemerge3$neg9 = $18 ^ -1;
1130+
$26 = $30;
1131+
}
1132+
}
1133+
}
1134+
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "__Z11printResultPiS_j", "_segment_holding", "__ZN5identC2EiPKcPci", "_vec2Length", "exc", "label", "confuusion", "tempDouble", "_org_apache_harmony_luni_util_NumberConverter_freeFormat__", "__ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_", "_java_nio_charset_Charset_forNameInternal___java_lang_String", "looop2", "looop3", "looop4", "looop5", "looop6", "looop7", "looop8", "multiloop", "multiloop2", "tempDouble2", "watIf", "select2", "binary", "cute", "selfAssign", "elimOneLoopVar", "elimOneLoopVar2", "elimOneLoopVar3", "elimOneLoopVar4"]
10901135

tools/js-optimizer.js

+19
Original file line numberDiff line numberDiff line change
@@ -3550,6 +3550,25 @@ function eliminate(ast, memSafe) {
35503550
}
35513551
}
35523552
}
3553+
// remove loop vars that are used in the rest of the else
3554+
for (var i = 0; i < assigns.length; i++) {
3555+
if (assigns[i][0] === 'stat' && assigns[i][1][0] === 'assign') {
3556+
var assign = assigns[i][1];
3557+
if (!(assign[1] === true && assign[2][0] === 'name' && assign[3][0] === 'name') || loopers.indexOf(assign[2][1]) < 0) {
3558+
// this is not one of the loop assigns
3559+
traverse(assign, function(node, type) {
3560+
if (type === 'name') {
3561+
var index = loopers.indexOf(node[1]);
3562+
if (index < 0) index = helpers.indexOf(node[1]);
3563+
if (index >= 0) {
3564+
loopers.splice(index, 1);
3565+
helpers.splice(index, 1);
3566+
}
3567+
}
3568+
});
3569+
}
3570+
}
3571+
}
35533572
if (loopers.length === 0) return;
35543573
for (var l = 0; l < loopers.length; l++) {
35553574
var looper = loopers[l];

0 commit comments

Comments
 (0)