aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test_core.py15
-rw-r--r--tools/js-optimizer.js12
2 files changed, 19 insertions, 8 deletions
diff --git a/tests/test_core.py b/tests/test_core.py
index 6442f894..1dc25dce 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -4652,12 +4652,15 @@ return malloc(size);
if Settings.QUANTUM_SIZE == 1: return self.skip('TODO: make this work')
if os.environ.get('EMCC_FAST_COMPILER') == '1': return self.skip('todo in fastcomp')
- self.do_run('',
- 'hello lua world!\n17\n1\n2\n3\n4\n7',
- args=['-e', '''print("hello lua world!");print(17);for x = 1,4 do print(x) end;print(10-3)'''],
- libraries=self.get_library('lua', [os.path.join('src', 'lua'), os.path.join('src', 'liblua.a')], make=['make', 'generic'], configure=None),
- includes=[path_from_root('tests', 'lua')],
- output_nicerizer=lambda string, err: (string + err).replace('\n\n', '\n').replace('\n\n', '\n'))
+ for aggro in ([0, 1] if '-O2' in self.emcc_args else [0]):
+ print aggro
+ Settings.AGGRESSIVE_VARIABLE_ELIMINATION = aggro
+ self.do_run('',
+ 'hello lua world!\n17\n1\n2\n3\n4\n7',
+ args=['-e', '''print("hello lua world!");print(17);for x = 1,4 do print(x) end;print(10-3)'''],
+ libraries=self.get_library('lua', [os.path.join('src', 'lua'), os.path.join('src', 'liblua.a')], make=['make', 'generic'], configure=None),
+ includes=[path_from_root('tests', 'lua')],
+ output_nicerizer=lambda string, err: (string + err).replace('\n\n', '\n').replace('\n\n', '\n'))
def get_freetype(self):
Settings.DEAD_FUNCTIONS += ['_inflateEnd', '_inflate', '_inflateReset', '_inflateInit2_']
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 7b1c6bd1..b507a45a 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -3030,17 +3030,18 @@ function aggressiveVariableEliminationInternal(func, asmData) {
allTrivials = {};
- var values = {};
+ var values = {}, recursives = {};
function evaluate(name) {
var node = values[name];
if (node) return node;
- values[node] = null; // prevent infinite recursion
+ values[name] = null; // prevent infinite recursion
var def = defs[name];
if (def) {
node = def[3];
if (node[0] == 'name') {
var name2 = node[1];
+ assert(name2 !== name);
if (name2 in trivials) {
node = evaluate(name2);
}
@@ -3048,6 +3049,10 @@ function aggressiveVariableEliminationInternal(func, asmData) {
traverse(node, function(node, type) {
if (type == 'name') {
var name2 = node[1];
+ if (name2 === name) {
+ recursives[name] = 1;
+ return false;
+ }
if (name2 in trivials) {
return evaluate(name2);
}
@@ -3062,6 +3067,9 @@ function aggressiveVariableEliminationInternal(func, asmData) {
for (var name in trivials) {
evaluate(name);
}
+ for (var name in recursives) {
+ delete trivials[name];
+ }
for (var name in trivials) {
var def = defs[name];