Skip to content

Commit d5ed105

Browse files
committed
remove more useless subnodes in native optimizer
1 parent 769d286 commit d5ed105

File tree

4 files changed

+68
-17
lines changed

4 files changed

+68
-17
lines changed

tests/test_other.py

+13-10
Original file line numberDiff line numberDiff line change
@@ -1951,16 +1951,19 @@ def fix(src):
19511951
return map(fix, src)
19521952
src = '\n'.join(filter(lambda line: 'var ' not in line, src.split('\n'))) # ignore vars
19531953
def reorder(func):
1954-
# emit EYE_ONE always before EYE_TWO, replaceing i1,i2 or i2,i1
1955-
i1 = 'i1'
1956-
i2 = 'i2'
1957-
if i1 not in func or i2 not in func: return func
1958-
ok = func.index(i1) < func.index(i2)
1959-
if not ok:
1960-
i1 = 'i2'
1961-
i2 = 'i1'
1962-
func = func.replace(i1, 'EYE_ONE').replace(i2, 'EYE_TWO')
1963-
assert func.index('EYE_ONE') < func.index('EYE_TWO')
1954+
def swap(func, i1, i2):
1955+
# emit EYE_ONE always before EYE_TWO, replacing i1,i2 or i2,i1 etc
1956+
if i1 not in func or i2 not in func: return func
1957+
ok = func.index(i1) < func.index(i2)
1958+
if not ok:
1959+
temp = i1
1960+
i1 = i2
1961+
i2 = temp
1962+
func = func.replace(i1, 'EYE_ONE').replace(i2, 'EYE_TWO')
1963+
assert func.index('EYE_ONE') < func.index('EYE_TWO')
1964+
return func
1965+
func = swap(func, 'i1', 'i2')
1966+
func = swap(func, 'i4', 'i5')
19641967
return func
19651968
src = 'function '.join(map(reorder, src.split('function ')))
19661969
return src

tools/optimizer/optimizer.cpp

+23-7
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,8 @@ Ref makeAsmCoercion(Ref node, AsmType type) {
516516
// Checks
517517

518518
bool isEmpty(Ref node) {
519-
return node->size() == 2 && node[0] == TOPLEVEL && node[1]->size() == 0;
519+
return (node->size() == 2 && node[0] == TOPLEVEL && node[1]->size() == 0) ||
520+
(node->size() > 0 && node[0] == BLOCK && (!node[1] || node[1]->size() == 0));
520521
}
521522

522523
bool commable(Ref node) { // TODO: hashing
@@ -664,7 +665,6 @@ void clearUselessNodes(Ref arr) {
664665

665666
void removeAllEmptySubNodes(Ref ast) {
666667
traversePre(ast, [](Ref node) {
667-
int index = -1;
668668
if (node[0] == DEFUN) {
669669
clearEmptyNodes(node[3]);
670670
} else if (node[0] == BLOCK && node->size() > 1 && !!node[1]) {
@@ -675,15 +675,31 @@ void removeAllEmptySubNodes(Ref ast) {
675675
});
676676
}
677677
void removeAllUselessSubNodes(Ref ast) {
678-
traversePre(ast, [](Ref node) {
679-
int index = -1;
680-
if (node[0] == DEFUN) {
678+
traversePrePost(ast, [](Ref node) {
679+
Ref type = node[0];
680+
if (type == DEFUN) {
681681
clearUselessNodes(node[3]);
682-
} else if (node[0] == BLOCK && node->size() > 1 && !!node[1]) {
682+
} else if (type == BLOCK && node->size() > 1 && !!node[1]) {
683683
clearUselessNodes(node[1]);
684-
} else if (node[0] == SEQ && isEmpty(node[1])) {
684+
} else if (type == SEQ && isEmpty(node[1])) {
685685
safeCopy(node, node[2]);
686686
}
687+
}, [](Ref node) {
688+
Ref type = node[0];
689+
if (type == IF) {
690+
bool empty2 = isEmpty(node[2]), has3 = node->size() == 4 && !!node[3], empty3 = !has3 || isEmpty(node[3]);
691+
if (!empty2 && empty3 && has3) { // empty else clauses
692+
node->setSize(3);
693+
} else if (empty2 && !empty3) { // empty if blocks
694+
safeCopy(node, make2(IF, make2(UNARY_PREFIX, L_NOT, node[1]), node[3]));
695+
} else if (empty2 && empty3) {
696+
if (hasSideEffects(node[1])) {
697+
safeCopy(node, make1(STAT, node[1]));
698+
} else {
699+
safeCopy(node, makeEmpty());
700+
}
701+
}
702+
}
687703
});
688704
}
689705

tools/test-js-optimizer-asm-regs-output.js

+15
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,20 @@ function iffey() {
106106
function nops() {
107107
var i1 = 0;
108108
f(i1);
109+
if (cheez) {
110+
doIt();
111+
} else {
112+
doIt();
113+
}
114+
if (cheez) {
115+
doIt();
116+
}
117+
if (!cheez) {
118+
doIt();
119+
}
120+
if (!cheez) {
121+
doIt();
122+
}
123+
doIt();
109124
}
110125

tools/test-js-optimizer-asm-regs.js

+17
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,23 @@ function nops() {
111111
x | 0;
112112
~x;
113113
f(x);
114+
// vaccuming
115+
if (cheez) {
116+
doIt();
117+
} else {
118+
doIt();
119+
}
120+
if (cheez) {
121+
doIt();
122+
} else {}
123+
if (cheez) {} else {
124+
doIt();
125+
}
126+
if (cheez) {} else {
127+
doIt();
128+
}
129+
if (cheez) {} else {}
130+
if (doIt()) {} else {}
114131
}
115132
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "stackRestore", "switchey", "switchey2", "iffey", "nops"]
116133

0 commit comments

Comments
 (0)