Skip to content

Commit e4e8063

Browse files
committed
handle variables that assign a value including themselves in aggressiveVariableElimination
1 parent 582e3e6 commit e4e8063

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

tests/test_core.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -4652,12 +4652,15 @@ def test_lua(self):
46524652
if Settings.QUANTUM_SIZE == 1: return self.skip('TODO: make this work')
46534653
if os.environ.get('EMCC_FAST_COMPILER') == '1': return self.skip('todo in fastcomp')
46544654

4655-
self.do_run('',
4656-
'hello lua world!\n17\n1\n2\n3\n4\n7',
4657-
args=['-e', '''print("hello lua world!");print(17);for x = 1,4 do print(x) end;print(10-3)'''],
4658-
libraries=self.get_library('lua', [os.path.join('src', 'lua'), os.path.join('src', 'liblua.a')], make=['make', 'generic'], configure=None),
4659-
includes=[path_from_root('tests', 'lua')],
4660-
output_nicerizer=lambda string, err: (string + err).replace('\n\n', '\n').replace('\n\n', '\n'))
4655+
for aggro in ([0, 1] if '-O2' in self.emcc_args else [0]):
4656+
print aggro
4657+
Settings.AGGRESSIVE_VARIABLE_ELIMINATION = aggro
4658+
self.do_run('',
4659+
'hello lua world!\n17\n1\n2\n3\n4\n7',
4660+
args=['-e', '''print("hello lua world!");print(17);for x = 1,4 do print(x) end;print(10-3)'''],
4661+
libraries=self.get_library('lua', [os.path.join('src', 'lua'), os.path.join('src', 'liblua.a')], make=['make', 'generic'], configure=None),
4662+
includes=[path_from_root('tests', 'lua')],
4663+
output_nicerizer=lambda string, err: (string + err).replace('\n\n', '\n').replace('\n\n', '\n'))
46614664

46624665
def get_freetype(self):
46634666
Settings.DEAD_FUNCTIONS += ['_inflateEnd', '_inflate', '_inflateReset', '_inflateInit2_']

tools/js-optimizer.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -3030,24 +3030,29 @@ function aggressiveVariableEliminationInternal(func, asmData) {
30303030

30313031
allTrivials = {};
30323032

3033-
var values = {};
3033+
var values = {}, recursives = {};
30343034

30353035
function evaluate(name) {
30363036
var node = values[name];
30373037
if (node) return node;
3038-
values[node] = null; // prevent infinite recursion
3038+
values[name] = null; // prevent infinite recursion
30393039
var def = defs[name];
30403040
if (def) {
30413041
node = def[3];
30423042
if (node[0] == 'name') {
30433043
var name2 = node[1];
3044+
assert(name2 !== name);
30443045
if (name2 in trivials) {
30453046
node = evaluate(name2);
30463047
}
30473048
} else {
30483049
traverse(node, function(node, type) {
30493050
if (type == 'name') {
30503051
var name2 = node[1];
3052+
if (name2 === name) {
3053+
recursives[name] = 1;
3054+
return false;
3055+
}
30513056
if (name2 in trivials) {
30523057
return evaluate(name2);
30533058
}
@@ -3062,6 +3067,9 @@ function aggressiveVariableEliminationInternal(func, asmData) {
30623067
for (var name in trivials) {
30633068
evaluate(name);
30643069
}
3070+
for (var name in recursives) {
3071+
delete trivials[name];
3072+
}
30653073

30663074
for (var name in trivials) {
30673075
var def = defs[name];

0 commit comments

Comments
 (0)