summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xem++2
-rwxr-xr-xemcc37
-rw-r--r--src/jsifier.js30
-rw-r--r--src/library.js25
-rw-r--r--src/settings.js6
-rwxr-xr-xtests/runner.py94
-rw-r--r--tools/js-optimizer.js63
-rw-r--r--tools/shared.py2
-rw-r--r--tools/test-js-optimizer-asm-outline1-output.js349
-rw-r--r--tools/test-js-optimizer-asm-outline2-output.js594
10 files changed, 586 insertions, 616 deletions
diff --git a/em++ b/em++
index ba09e1a2..810b7aec 100755
--- a/em++
+++ b/em++
@@ -8,5 +8,7 @@ import os, subprocess, sys
from tools import shared
os.environ['EMMAKEN_CXX'] = '1'
+if not os.path.exists(shared.PYTHON):
+ print >> sys.stderr, 'warning: PYTHON does not seem to be defined properly in ~/.emscripten (%s)' % shared.PYTHON
exit(subprocess.call([shared.PYTHON, shared.EMCC] + sys.argv[1:]))
diff --git a/emcc b/emcc
index 0eb4499b..b63eada0 100755
--- a/emcc
+++ b/emcc
@@ -219,6 +219,9 @@ Options that are modified or new in %s include:
1: Parallel typed arrays
2: Shared (C-like) typed arrays (default)
+ --js-opts 0: Prevent JS optimizer from running
+ 1: Use JS optimizer (default)
+
--llvm-opts <level> 0: No LLVM optimizations (default in -O0)
1: -O1 LLVM optimizations (default in -O1)
2: -O2 LLVM optimizations
@@ -712,6 +715,7 @@ try:
opt_level = 0
debug_level = 0
+ js_opts = None
llvm_opts = None
llvm_lto = None
closure = None
@@ -767,6 +771,11 @@ try:
settings_changes.append('INLINING_LIMIT=50')
opt_level = validate_arg_level(requested_level, 3, 'Invalid optimization level: ' + newargs[i])
newargs[i] = ''
+ elif newargs[i].startswith('--js-opts'):
+ check_bad_eq(newargs[i])
+ js_opts = eval(newargs[i+1])
+ newargs[i] = ''
+ newargs[i+1] = ''
elif newargs[i].startswith('--llvm-opts'):
check_bad_eq(newargs[i])
llvm_opts = eval(newargs[i+1])
@@ -899,6 +908,7 @@ try:
if default_cxx_std:
newargs = newargs + [default_cxx_std]
+ if js_opts is None: js_opts = True
if llvm_opts is None: llvm_opts = LLVM_OPT_LEVEL[opt_level]
if llvm_lto is None and opt_level >= 3: llvm_lto = 3
if opt_level == 0: debug_level = 4
@@ -1594,7 +1604,7 @@ try:
js_optimizer_queue = []
js_optimizer_extra_info = {}
- if opt_level >= 1:
+ if opt_level >= 1 and js_opts:
logging.debug('running pre-closure post-opts')
if DEBUG == '2':
@@ -1623,23 +1633,24 @@ try:
final = shared.Building.closure_compiler(final)
if DEBUG: save_intermediate('closure')
- if shared.Settings.OUTLINING_LIMIT > 0:
- js_optimizer_queue += ['outline']
- js_optimizer_extra_info['sizeToOutline'] = shared.Settings.OUTLINING_LIMIT
+ if js_opts:
+ if shared.Settings.OUTLINING_LIMIT > 0:
+ js_optimizer_queue += ['outline']
+ js_optimizer_extra_info['sizeToOutline'] = shared.Settings.OUTLINING_LIMIT
- if (not closure or shared.Settings.ASM_JS) and shared.Settings.RELOOP and debug_level < 3:
- js_optimizer_queue += ['registerize']
+ if (not closure or shared.Settings.ASM_JS) and shared.Settings.RELOOP and debug_level < 3:
+ js_optimizer_queue += ['registerize']
- if opt_level > 0:
- if debug_level < 2 and shared.Settings.ASM_JS: js_optimizer_queue = map(lambda p: p if p != 'registerize' else 'registerizeAndMinify', js_optimizer_queue)
- if debug_level == 0: js_optimizer_queue += ['minifyWhitespace']
+ if opt_level > 0:
+ if debug_level < 2 and shared.Settings.ASM_JS: js_optimizer_queue = map(lambda p: p if p != 'registerize' else 'registerizeAndMinify', js_optimizer_queue)
+ if debug_level == 0: js_optimizer_queue += ['minifyWhitespace']
- if closure and shared.Settings.ASM_JS:
- js_optimizer_queue += ['closure']
+ if closure and shared.Settings.ASM_JS:
+ js_optimizer_queue += ['closure']
- if not shared.Settings.SIDE_MODULE: js_optimizer_queue += ['last'] # side modules are not finalized until after relocation
+ if not shared.Settings.SIDE_MODULE: js_optimizer_queue += ['last'] # side modules are not finalized until after relocation
- flush_js_optimizer_queue()
+ flush_js_optimizer_queue()
# Remove some trivial whitespace # TODO: do not run when compress has already been done on all parts of the code
src = open(final).read()
diff --git a/src/jsifier.js b/src/jsifier.js
index b377202d..c92526d2 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -658,6 +658,10 @@ function JSify(data, functionsOnly, givenFunctions) {
}
}
+ if (func.hasVarArgsCall) {
+ func.JS += INDENTATION + 'var tempVarArgs = 0;\n';
+ }
+
// Prepare the stack, if we need one. If we have other stack allocations, force the stack to be set up.
func.JS += INDENTATION + RuntimeGenerator.stackEnter(func.initialStack, func.otherStackAllocations) + ';\n';
@@ -1234,6 +1238,7 @@ function JSify(data, functionsOnly, givenFunctions) {
+ (EXCEPTION_DEBUG ? 'Module.print("Exception: " + e + ", currently at: " + (new Error().stack)); ' : '')
+ 'return null } })();';
}
+ ret = makeVarArgsCleanup(ret);
if (item.assignTo) {
ret = 'var ' + item.assignTo + ' = ' + ret;
@@ -1446,12 +1451,13 @@ function JSify(data, functionsOnly, givenFunctions) {
});
if (hasVarArgs && !useJSArgs) {
+ funcData.hasVarArgsCall = true;
if (varargs.length === 0) {
varargs = [0];
varargsTypes = ['i32'];
}
var offset = 0;
- varargs = '(tempInt=' + RuntimeGenerator.stackAlloc(varargs.length, ',') + ',' +
+ varargs = '(tempVarArgs=' + RuntimeGenerator.stackAlloc(varargs.length, ',') + ',' +
varargs.map(function(arg, i) {
var type = varargsTypes[i];
if (type == 0) return null;
@@ -1459,17 +1465,17 @@ function JSify(data, functionsOnly, givenFunctions) {
var ret;
assert(offset % Runtime.STACK_ALIGN == 0); // varargs must be aligned
if (!varargsByVals[i]) {
- ret = makeSetValue(getFastValue('tempInt', '+', offset), 0, arg, type, null, null, Runtime.STACK_ALIGN, null, ',');
+ ret = makeSetValue(getFastValue('tempVarArgs', '+', offset), 0, arg, type, null, null, Runtime.STACK_ALIGN, null, ',');
offset += Runtime.alignMemory(Runtime.getNativeFieldSize(type), Runtime.STACK_ALIGN);
} else {
var size = calcAllocatedSize(removeAllPointing(type));
- ret = makeCopyValues(getFastValue('tempInt', '+', offset), arg, size, null, null, varargsByVals[i], ',');
+ ret = makeCopyValues(getFastValue('tempVarArgs', '+', offset), arg, size, null, null, varargsByVals[i], ',');
offset += Runtime.forceAlign(size, Runtime.STACK_ALIGN);
}
return ret;
}).filter(function(arg) {
return arg !== null;
- }).join(',') + ',tempInt)';
+ }).join(',') + ',tempVarArgs)';
varargs = asmCoercion(varargs, 'i32');
}
@@ -1557,10 +1563,24 @@ function JSify(data, functionsOnly, givenFunctions) {
return ret;
}
+
+ function makeVarArgsCleanup(js) {
+ if (js.indexOf('(tempVarArgs=') >= 0) {
+ if (js[js.length-1] == ';') {
+ return js + ' STACKTOP=tempVarArgs;';
+ } else {
+ assert(js.indexOf(';') < 0);
+ return '((' + js + '), STACKTOP=tempVarArgs)';
+ }
+ }
+ return js;
+ }
+
makeFuncLineActor('getelementptr', function(item) { return finalizeLLVMFunctionCall(item) });
makeFuncLineActor('call', function(item) {
if (item.standalone && LibraryManager.isStubFunction(item.ident)) return ';';
- return makeFunctionCall(item.ident, item.params, item.funcData, item.type, false, !!item.assignTo || !item.standalone) + (item.standalone ? ';' : '');
+ var ret = makeFunctionCall(item.ident, item.params, item.funcData, item.type, false, !!item.assignTo || !item.standalone) + (item.standalone ? ';' : '');
+ return makeVarArgsCleanup(ret);
});
makeFuncLineActor('unreachable', function(item) {
diff --git a/src/library.js b/src/library.js
index b68a9324..6ce77268 100644
--- a/src/library.js
+++ b/src/library.js
@@ -2961,6 +2961,7 @@ LibraryManager.library = {
_exit: function(status) {
// void _exit(int status);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html
+ Module.print('exit(' + status + ') called');
Module['exit'](status);
},
fork__deps: ['__setErrNo', '$ERRNO_CODES'],
@@ -8216,10 +8217,8 @@ LibraryManager.library = {
ECOMM: {{{ cDefine('ECOMM') }}},
EPROTO: {{{ cDefine('EPROTO') }}},
EMULTIHOP: {{{ cDefine('EMULTIHOP') }}},
- ELBIN: {{{ cDefine('ELBIN') }}},
EDOTDOT: {{{ cDefine('EDOTDOT') }}},
EBADMSG: {{{ cDefine('EBADMSG') }}},
- EFTYPE: {{{ cDefine('EFTYPE') }}},
ENOTUNIQ: {{{ cDefine('ENOTUNIQ') }}},
EBADFD: {{{ cDefine('EBADFD') }}},
EREMCHG: {{{ cDefine('EREMCHG') }}},
@@ -8229,7 +8228,6 @@ LibraryManager.library = {
ELIBMAX: {{{ cDefine('ELIBMAX') }}},
ELIBEXEC: {{{ cDefine('ELIBEXEC') }}},
ENOSYS: {{{ cDefine('ENOSYS') }}},
- ENMFILE: {{{ cDefine('ENMFILE') }}},
ENOTEMPTY: {{{ cDefine('ENOTEMPTY') }}},
ENAMETOOLONG: {{{ cDefine('ENAMETOOLONG') }}},
ELOOP: {{{ cDefine('ELOOP') }}},
@@ -8261,14 +8259,11 @@ LibraryManager.library = {
EISCONN: {{{ cDefine('EISCONN') }}},
ENOTCONN: {{{ cDefine('ENOTCONN') }}},
ETOOMANYREFS: {{{ cDefine('ETOOMANYREFS') }}},
- EPROCLIM: {{{ cDefine('EPROCLIM') }}},
EUSERS: {{{ cDefine('EUSERS') }}},
EDQUOT: {{{ cDefine('EDQUOT') }}},
ESTALE: {{{ cDefine('ESTALE') }}},
ENOTSUP: {{{ cDefine('ENOTSUP') }}},
ENOMEDIUM: {{{ cDefine('ENOMEDIUM') }}},
- ENOSHARE: {{{ cDefine('ENOSHARE') }}},
- ECASECLASH: {{{ cDefine('ECASECLASH') }}},
EILSEQ: {{{ cDefine('EILSEQ') }}},
EOVERFLOW: {{{ cDefine('EOVERFLOW') }}},
ECANCELED: {{{ cDefine('ECANCELED') }}},
@@ -8345,10 +8340,8 @@ LibraryManager.library = {
{{{ cDefine('ECOMM') }}}: 'Communication error on send',
{{{ cDefine('EPROTO') }}}: 'Protocol error',
{{{ cDefine('EMULTIHOP') }}}: 'Multihop attempted',
- {{{ cDefine('ELBIN') }}}: 'Inode is remote (not really error)',
{{{ cDefine('EDOTDOT') }}}: 'Cross mount point (not really error)',
{{{ cDefine('EBADMSG') }}}: 'Trying to read unreadable message',
- {{{ cDefine('EFTYPE') }}}: 'Inappropriate file type or format',
{{{ cDefine('ENOTUNIQ') }}}: 'Given log. name not unique',
{{{ cDefine('EBADFD') }}}: 'f.d. invalid for this operation',
{{{ cDefine('EREMCHG') }}}: 'Remote address changed',
@@ -8358,7 +8351,6 @@ LibraryManager.library = {
{{{ cDefine('ELIBMAX') }}}: 'Attempting to link in too many libs',
{{{ cDefine('ELIBEXEC') }}}: 'Attempting to exec a shared library',
{{{ cDefine('ENOSYS') }}}: 'Function not implemented',
- {{{ cDefine('ENMFILE') }}}: 'No more files',
{{{ cDefine('ENOTEMPTY') }}}: 'Directory not empty',
{{{ cDefine('ENAMETOOLONG') }}}: 'File or path name too long',
{{{ cDefine('ELOOP') }}}: 'Too many symbolic links',
@@ -8386,19 +8378,16 @@ LibraryManager.library = {
{{{ cDefine('EPROTONOSUPPORT') }}}: 'Unknown protocol',
{{{ cDefine('ESOCKTNOSUPPORT') }}}: 'Socket type not supported',
{{{ cDefine('EADDRNOTAVAIL') }}}: 'Address not available',
- {{{ cDefine('ENETRESET') }}}: 'ENETRESET',
+ {{{ cDefine('ENETRESET') }}}: 'Connection reset by network',
{{{ cDefine('EISCONN') }}}: 'Socket is already connected',
{{{ cDefine('ENOTCONN') }}}: 'Socket is not connected',
- {{{ cDefine('ETOOMANYREFS') }}}: 'TOOMANYREFS',
- {{{ cDefine('EPROCLIM') }}}: 'EPROCLIM',
- {{{ cDefine('EUSERS') }}}: 'EUSERS',
- {{{ cDefine('EDQUOT') }}}: 'EDQUOT',
- {{{ cDefine('ESTALE') }}}: 'ESTALE',
+ {{{ cDefine('ETOOMANYREFS') }}}: 'Too many references',
+ {{{ cDefine('EUSERS') }}}: 'Too many users',
+ {{{ cDefine('EDQUOT') }}}: 'Quota exceeded',
+ {{{ cDefine('ESTALE') }}}: 'Stale file handle',
{{{ cDefine('ENOTSUP') }}}: 'Not supported',
{{{ cDefine('ENOMEDIUM') }}}: 'No medium (in tape drive)',
- {{{ cDefine('ENOSHARE') }}}: 'No such host or network path',
- {{{ cDefine('ECASECLASH') }}}: 'Filename exists with different case',
- {{{ cDefine('EILSEQ') }}}: 'EILSEQ',
+ {{{ cDefine('EILSEQ') }}}: 'Illegal byte sequence',
{{{ cDefine('EOVERFLOW') }}}: 'Value too large for defined data type',
{{{ cDefine('ECANCELED') }}}: 'Operation canceled',
{{{ cDefine('ENOTRECOVERABLE') }}}: 'State not recoverable',
diff --git a/src/settings.js b/src/settings.js
index 21745ef8..3515091d 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -1391,10 +1391,8 @@ var C_DEFINES = {
'ECOMM': '70',
'EPROTO': '71',
'EMULTIHOP': '74',
- 'ELBIN': '75',
'EDOTDOT': '76',
'EBADMSG': '77',
- 'EFTYPE': '79',
'ENOTUNIQ': '80',
'EBADFD': '81',
'EREMCHG': '82',
@@ -1404,7 +1402,6 @@ var C_DEFINES = {
'ELIBMAX': '86',
'ELIBEXEC': '87',
'ENOSYS': '88',
- 'ENMFILE': '89',
'ENOTEMPTY': '90',
'ENAMETOOLONG': '91',
'ELOOP': '92',
@@ -1436,14 +1433,11 @@ var C_DEFINES = {
'EISCONN': '127',
'ENOTCONN': '128',
'ETOOMANYREFS': '129',
- 'EPROCLIM': '130',
'EUSERS': '131',
'EDQUOT': '132',
'ESTALE': '133',
'ENOTSUP': '134',
'ENOMEDIUM': '135',
- 'ENOSHARE': '136',
- 'ECASECLASH': '137',
'EILSEQ': '138',
'EOVERFLOW': '139',
'ECANCELED': '140',
diff --git a/tests/runner.py b/tests/runner.py
index 77f54bfd..f7a0fa26 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -3254,7 +3254,7 @@ Exiting setjmp function, level: 0, prev_jmp: -1
''')
self.emcc_args += ['--pre-js', 'pre.js']
- self.do_run(src, '''reported\nExit Status: 1\npostRun\nok.\n''')
+ self.do_run(src, '''reported\nexit(1) called\nExit Status: 1\npostRun\nok.\n''')
def test_class(self):
src = '''
@@ -3719,6 +3719,82 @@ Exiting setjmp function, level: 0, prev_jmp: -1
Settings.TOTAL_STACK = 1024
self.do_run(src, 'ok!')
+ def test_stack_varargs2(self):
+ if self.emcc_args is None: return # too slow in other modes
+ Settings.TOTAL_STACK = 1024
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ void func(int i) {
+ }
+ int main() {
+ for (int i = 0; i < 1024; i++) {
+ printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
+ i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+ }
+ printf("ok!\n");
+ return 0;
+ }
+ '''
+ self.do_run(src, 'ok!')
+
+ print 'with return'
+
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ for (int i = 0; i < 1024; i++) {
+ int j = printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+ printf(" (%d)\n", j);
+ }
+ printf("ok!\n");
+ return 0;
+ }
+ '''
+ self.do_run(src, 'ok!')
+
+ print 'with definitely no return'
+
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <stdarg.h>
+
+ void vary(const char *s, ...)
+ {
+ va_list v;
+ va_start(v, s);
+ char d[20];
+ vsnprintf(d, 20, s, v);
+ puts(d);
+
+ // Try it with copying
+ va_list tempva;
+ va_copy(tempva, v);
+ vsnprintf(d, 20, s, tempva);
+ puts(d);
+
+ va_end(v);
+ }
+
+ int main() {
+ for (int i = 0; i < 1024; i++) {
+ int j = printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+ printf(" (%d)\n", j);
+ vary("*cheez: %d+%d*", 99, 24);
+ vary("*albeit*");
+ }
+ printf("ok!\n");
+ return 0;
+ }
+ '''
+ self.do_run(src, 'ok!')
+
def test_stack_void(self):
Settings.INLINING_LIMIT = 50
@@ -10236,6 +10312,7 @@ def process(filename):
Settings.CORRECT_SIGNS = 0
def test_exit_status(self):
+ if self.emcc_args is None: return self.skip('need emcc')
src = r'''
#include <stdio.h>
#include <stdlib.h>
@@ -10251,12 +10328,12 @@ def process(filename):
'''
open('post.js', 'w').write('''
Module.addOnExit(function () {
- Module.print('Exit Status: ' + EXITSTATUS);
+ Module.print('I see exit status: ' + EXITSTATUS);
});
Module.callMain();
''')
self.emcc_args += ['-s', 'INVOKE_RUN=0', '--post-js', 'post.js']
- self.do_run(src, 'hello, world!\ncleanup\nExit Status: 118')
+ self.do_run(src, 'hello, world!\nexit(118) called\ncleanup\nI see exit status: 118')
def test_gc(self):
if self.emcc_args == None: return self.skip('needs ta2')
@@ -10682,6 +10759,7 @@ Options that are modified or new in %s include:
(['-O2', '--closure', '1'], lambda generated: 'function intArrayToString' not in generated, 'closure minifies the shell'),
(['-O2'], lambda generated: 'var b=0' in generated and not 'function _main' in generated, 'registerize/minify is run by default in -O2'),
(['-O2', '--minify', '0'], lambda generated: 'var b = 0' in generated and not 'function _main' in generated, 'minify is cancelled, but not registerize'),
+ (['-O2', '--js-opts', '0'], lambda generated: 'var b=0' not in generated and 'var b = 0' not in generated and 'function _main' in generated, 'js opts are cancelled'),
(['-O2', '-g'], lambda generated: 'var b=0' not in generated and 'var b = 0' not in generated and 'function _main' in generated, 'registerize/minify is cancelled by -g'),
(['-O2', '-g0'], lambda generated: 'var b=0' in generated and not 'function _main' in generated, 'registerize/minify is run by default in -O2 -g0'),
(['-O2', '-g1'], lambda generated: 'var b = 0' in generated and not 'function _main' in generated, 'compress is cancelled by -g1'),
@@ -11301,11 +11379,11 @@ f.close()
([], {
100: (190, 250),
250: (200, 330),
- 500: (250, 310),
- 1000: (230, 300),
- 2000: (380, 450),
- 5000: (800, 1100),
- 0: (1500, 1800)
+ 500: (250, 500),
+ 1000: (230, 1000),
+ 2000: (380, 2000),
+ 5000: (800, 5000),
+ 0: (1500, 5000)
}),
(['-O2'], {
100: (0, 1500),
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 4192ddd1..ff6aee67 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -3106,7 +3106,9 @@ function outline(ast) {
// Reserve an extra two spots per possible outlining: one for control flow var, the other for control flow data
// The control variables are zeroed out when calling an outlined function, and after using
// the value after they return.
- asmData.maxOutlinings = Math.round(3*measureSize(func)/extraInfo.sizeToOutline);
+ var size = measureSize(func);
+ asmData.maxOutlinings = Math.round(3*size/extraInfo.sizeToOutline);
+ asmData.intendedPieces = Math.ceil(size/extraInfo.sizeToOutline);
asmData.totalStackSize = stackSize + (stack.length + 2*asmData.maxOutlinings)*8;
asmData.controlStackPos = function(i) { return stackSize + (stack.length + i)*8 };
asmData.controlDataStackPos = function(i) { return stackSize + (stack.length + i)*8 + 4 };
@@ -3211,16 +3213,18 @@ function outline(ast) {
var CONTROL_BREAK = 1, CONTROL_BREAK_LABEL = 2, CONTROL_CONTINUE = 3, CONTROL_CONTINUE_LABEL = 4, CONTROL_RETURN_VOID = 5, CONTROL_RETURN_INT = 6, CONTROL_RETURN_DOUBLE = 7;
var sizeToOutline = null; // customized per function and as we make progress
- function calculateThreshold(func) {
- sizeToOutline = extraInfo.sizeToOutline;
+ function calculateThreshold(func, asmData) {
var size = measureSize(func);
- //var desiredChunks = Math.ceil(size/extraInfo.sizeToOutline);
- ////sizeToOutline = Math.round((extraInfo.sizeToOutline + (2*size/desiredChunks))/3);
- //sizeToOutline = Math.round(size/desiredChunks);
- printErr('trying to reduce the size of ' + func[1] + ' which is ' + size + ' (>= ' + extraInfo.sizeToOutline + '), aim for ' + sizeToOutline);
+ if (size <= extraInfo.sizeToOutline) {
+ sizeToOutline = Infinity;
+ printErr(' no point in trying to reduce the size of ' + func[1] + ' which is ' + size + ' <= ' + extraInfo.sizeToOutline);
+ } else {
+ sizeToOutline = Math.round(size/Math.max(2, asmData.intendedPieces--));
+ printErr('trying to reduce the size of ' + func[1] + ' which is ' + size + ' (>=? ' + extraInfo.sizeToOutline + '), aim for ' + sizeToOutline);
+ }
}
- var level = 0;
+ var level = 0, loops = 0;
var outliningParents = {}; // function name => parent it was outlined from
function doOutline(func, asmData, stats, start, end) {
@@ -3241,21 +3245,29 @@ function outline(ast) {
}
});
var reps = [];
- // wipe out control variable
- reps.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlStackPos(outlineIndex)), ['num', 0])]);
- reps.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlDataStackPos(outlineIndex)), ['num', 0])]); // XXX not really needed
- // add spills and reads before and after the call to the outlined code, and in the outlined code itself
- keys(setUnion(codeInfo.reads, codeInfo.writes)).forEach(function(v) {
+ // add spills
+ function orderFunc(x, y) {
+ return (asmData.stackPos[x] - asmData.stackPos[y]) || x.localeCompare(y);
+ }
+ var sortedReadsAndWrites = keys(setUnion(codeInfo.reads, codeInfo.writes)).sort(orderFunc);
+ var sortedWrites = keys(codeInfo.writes).sort(orderFunc);
+ sortedReadsAndWrites.forEach(function(v) {
if (!(v in owned)) {
reps.push(['stat', ['assign', true, ['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]);
}
});
+ // wipe out control variable
+ reps.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlStackPos(outlineIndex)), ['num', 0])]);
+ reps.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlDataStackPos(outlineIndex)), ['num', 0])]); // XXX not really needed
+ // do the call
reps.push(['stat', ['call', ['name', newIdent], [['name', 'sp']]]]);
- for (var v in codeInfo.writes) {
+ // add unspills
+ sortedWrites.forEach(function(v) {
if (!(v in owned)) {
reps.push(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]);
}
- }
+ });
+
// Generate new function
if (codeInfo.hasReturn || codeInfo.hasReturnInt || codeInfo.hasReturnDouble || codeInfo.hasBreak || codeInfo.hasContinue) {
// we need to capture all control flow using a top-level labeled one-time loop in the outlined function
@@ -3389,16 +3401,17 @@ function outline(ast) {
}
}
// add spills and unspills in outlined code outside the OL loop
- keys(setUnion(codeInfo.reads, codeInfo.writes)).forEach(function(v) {
+ sortedReadsAndWrites.reverse();
+ sortedReadsAndWrites.forEach(function(v) {
if (!(v in owned)) {
code.unshift(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]);
}
});
- for (var v in codeInfo.writes) {
+ sortedWrites.forEach(function(v) {
if (!(v in owned)) {
code.push(['stat', ['assign', true, ['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]);
}
- }
+ });
// finalize
var newFunc = ['defun', newIdent, ['sp'], code];
var newAsmData = { params: { sp: ASM_INT }, vars: {} };
@@ -3436,8 +3449,8 @@ function outline(ast) {
}
}
outliningParents[newIdent] = func[1];
- printErr('performed outline ' + [func[1], newIdent, 'code sizes (pre/post):', originalCodeSize, measureSize(code), 'overhead (w/r):', setSize(setSub(codeInfo.writes, owned)), setSize(setSub(codeInfo.reads, owned))]);
- calculateThreshold(func);
+ printErr('performed outline ' + [func[1], newIdent, 'code sizes (pre/post):', originalCodeSize, measureSize(code), 'overhead (w/r):', setSize(setSub(codeInfo.writes, owned)), setSize(setSub(codeInfo.reads, owned)), ' owned: ', setSize(owned), ' left: ', setSize(asmData.vars), setSize(asmData.params), ' loopsDepth: ', loops]);
+ calculateThreshold(func, asmData);
return [newFunc];
}
@@ -3506,11 +3519,18 @@ function outline(ast) {
if (subRet && subRet.length > 0) ret.push.apply(ret, subRet);
}
return null; // do not recurse into children, outlineStatements will do so if necessary
+ } else if (type == 'while') {
+ loops++;
+ }
+ }, function(node, type) {
+ if (type == 'while') {
+ loops--;
}
});
if (ret.length > pre) {
// we outlined recursively, reset our state here
//printErr('successful outline in recursion ' + func[1] + ' due to recursive in level ' + level);
+ if (measureSize(func) <= extraInfo.sizeToOutline) break;
end = i-1;
sizeSeen = 0;
canRestart = true;
@@ -3550,6 +3570,7 @@ function outline(ast) {
if (newFuncs.length) {
ret.push.apply(ret, newFuncs);
}
+ if (measureSize(func) <= extraInfo.sizeToOutline) break;
sizeSeen = 0;
end = i-1;
canRestart = true;
@@ -3581,8 +3602,8 @@ function outline(ast) {
if (size >= extraInfo.sizeToOutline) {
aggressiveVariableElimination(func, asmData);
flatten(func, asmData);
- calculateThreshold(func);
analyzeFunction(func, asmData);
+ calculateThreshold(func, asmData);
var stats = getStatements(func);
var ret = outlineStatements(func, asmData, stats, 0.9*size);
assert(level == 0);
diff --git a/tools/shared.py b/tools/shared.py
index 37d568e7..08231af9 100644
--- a/tools/shared.py
+++ b/tools/shared.py
@@ -630,7 +630,7 @@ def line_splitter(data):
return out
-def limit_size(string, MAX=120*20):
+def limit_size(string, MAX=12000*20):
if len(string) < MAX: return string
return string[0:MAX/2] + '\n[..]\n' + string[-MAX/2:]
diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js
index 5027f680..904e56cf 100644
--- a/tools/test-js-optimizer-asm-outline1-output.js
+++ b/tools/test-js-optimizer-asm-outline1-output.js
@@ -5,7 +5,6 @@ function lin() {
c(1);
c(2);
c(3);
- c(4);
HEAP32[sp + 16 >> 2] = 0;
HEAP32[sp + 20 >> 2] = 0;
lin$1(sp);
@@ -21,8 +20,6 @@ function lin2() {
while (1) {
c(1);
c(2);
- c(3);
- c(4);
HEAP32[sp + 16 >> 2] = 0;
HEAP32[sp + 20 >> 2] = 0;
lin2$1(sp);
@@ -42,9 +39,14 @@ function lin3() {
c(3);
c(4);
c(5);
- HEAP32[sp + 16 >> 2] = 0;
- HEAP32[sp + 20 >> 2] = 0;
- lin3$1(sp);
+ c(6);
+ c(7);
+ c(8);
+ c(9);
+ c(10);
+ c(11);
+ c(12);
+ c(13);
HEAP32[sp + 8 >> 2] = 0;
HEAP32[sp + 12 >> 2] = 0;
lin3$0(sp);
@@ -70,9 +72,15 @@ function lin4() {
c(2);
c(3);
c(4);
- HEAP32[sp + 16 >> 2] = 0;
- HEAP32[sp + 20 >> 2] = 0;
- lin4$1(sp);
+ c(5);
+ c(6);
+ c(7);
+ c(8);
+ c(9);
+ c(10);
+ c(11);
+ c(12);
+ c(13);
HEAP32[sp + 8 >> 2] = 0;
HEAP32[sp + 12 >> 2] = 0;
lin4$0(sp);
@@ -97,9 +105,15 @@ function lin5() {
c(2);
c(3);
c(4);
- HEAP32[sp + 16 >> 2] = 0;
- HEAP32[sp + 20 >> 2] = 0;
- lin5$1(sp);
+ c(5);
+ c(6);
+ c(7);
+ c(8);
+ c(9);
+ c(10);
+ c(11);
+ c(12);
+ c(13);
HEAP32[sp + 8 >> 2] = 0;
HEAP32[sp + 12 >> 2] = 0;
lin5$0(sp);
@@ -120,13 +134,6 @@ function mix() {
sp = STACKTOP;
STACKTOP = STACKTOP + 168 | 0;
main : while (1) {
- c(1);
- c(2);
- c(3);
- c(4);
- c(5);
- c(6);
- c(7);
HEAP32[sp + 16 >> 2] = 0;
HEAP32[sp + 20 >> 2] = 0;
mix$1(sp);
@@ -170,15 +177,14 @@ function vars(x, y) {
var sp = 0;
sp = STACKTOP;
STACKTOP = STACKTOP + 152 | 0;
- HEAP32[sp + 32 >> 2] = 0;
- HEAP32[sp + 36 >> 2] = 0;
+ c(1 + (x + y));
+ c(2 + y * x);
+ c(3 + (x + y));
+ c(4 + y * x);
HEAP32[sp + 8 >> 2] = x;
HEAPF32[sp + 16 >> 2] = y;
- vars$1(sp);
HEAP32[sp + 24 >> 2] = 0;
HEAP32[sp + 28 >> 2] = 0;
- HEAP32[sp + 8 >> 2] = x;
- HEAPF32[sp + 16 >> 2] = y;
vars$0(sp);
STACKTOP = sp;
}
@@ -192,10 +198,11 @@ function vars2(x, y) {
b = y * x;
a = c(1 + a);
b = c(2 + b);
- HEAP32[sp + 40 >> 2] = 0;
- HEAP32[sp + 44 >> 2] = 0;
+ a = c(3 + a);
HEAP32[sp + 24 >> 2] = a;
HEAPF32[sp + 32 >> 2] = b;
+ HEAP32[sp + 40 >> 2] = 0;
+ HEAP32[sp + 44 >> 2] = 0;
vars2$0(sp);
a = HEAP32[sp + 24 >> 2] | 0;
b = +HEAPF32[sp + 32 >> 2];
@@ -207,18 +214,16 @@ function vars3(x, y) {
var a = 0, sp = 0;
sp = STACKTOP;
STACKTOP = STACKTOP + 160 | 0;
- HEAP32[sp + 40 >> 2] = 0;
- HEAP32[sp + 44 >> 2] = 0;
- HEAP32[sp + 24 >> 2] = a;
+ a = x + y;
+ a = c(1 + a);
+ a = c(2 + y * x);
+ a = c(3 + a);
+ a = c(4 + y * x);
HEAP32[sp + 8 >> 2] = x;
HEAPF32[sp + 16 >> 2] = y;
- vars3$1(sp);
- a = HEAP32[sp + 24 >> 2] | 0;
+ HEAP32[sp + 24 >> 2] = a;
HEAP32[sp + 32 >> 2] = 0;
HEAP32[sp + 36 >> 2] = 0;
- HEAP32[sp + 24 >> 2] = a;
- HEAPF32[sp + 16 >> 2] = y;
- HEAP32[sp + 8 >> 2] = x;
vars3$0(sp);
a = HEAP32[sp + 24 >> 2] | 0;
STACKTOP = sp;
@@ -230,20 +235,16 @@ function vars4(x, y) {
sp = STACKTOP;
STACKTOP = STACKTOP + 168 | 0;
a = x + y;
- HEAP32[sp + 48 >> 2] = 0;
- HEAP32[sp + 52 >> 2] = 0;
- HEAPF32[sp + 16 >> 2] = y;
+ b = y * x;
+ a = c(1 + a);
+ a = c(2 + a);
+ a = c(3 + a);
+ a = c(4 + a);
HEAP32[sp + 8 >> 2] = x;
HEAP32[sp + 24 >> 2] = a;
HEAPF32[sp + 32 >> 2] = b;
- vars4$1(sp);
- b = +HEAPF32[sp + 32 >> 2];
- a = HEAP32[sp + 24 >> 2] | 0;
HEAP32[sp + 40 >> 2] = 0;
HEAP32[sp + 44 >> 2] = 0;
- HEAP32[sp + 24 >> 2] = a;
- HEAP32[sp + 8 >> 2] = x;
- HEAPF32[sp + 32 >> 2] = b;
vars4$0(sp);
a = HEAP32[sp + 24 >> 2] | 0;
b = +HEAPF32[sp + 32 >> 2];
@@ -255,20 +256,19 @@ function vars_w_stack(x, y) {
var a = 0, b = +0, sp = 0;
sp = STACKTOP;
STACKTOP = STACKTOP + 208 | 0;
- a = x + y;
- HEAP32[sp + 72 >> 2] = 0;
- HEAP32[sp + 76 >> 2] = 0;
- HEAPF32[sp + 32 >> 2] = y;
HEAP32[sp + 24 >> 2] = x;
+ HEAPF32[sp + 32 >> 2] = y;
HEAP32[sp + 40 >> 2] = a;
HEAPF32[sp + 48 >> 2] = b;
+ HEAP32[sp + 72 >> 2] = 0;
+ HEAP32[sp + 76 >> 2] = 0;
vars_w_stack$1(sp);
- b = +HEAPF32[sp + 48 >> 2];
a = HEAP32[sp + 40 >> 2] | 0;
- HEAP32[sp + 64 >> 2] = 0;
- HEAP32[sp + 68 >> 2] = 0;
+ b = +HEAPF32[sp + 48 >> 2];
HEAP32[sp + 40 >> 2] = a;
HEAPF32[sp + 48 >> 2] = b;
+ HEAP32[sp + 64 >> 2] = 0;
+ HEAP32[sp + 68 >> 2] = 0;
vars_w_stack$0(sp);
a = HEAP32[sp + 40 >> 2] | 0;
b = +HEAPF32[sp + 48 >> 2];
@@ -276,43 +276,22 @@ function vars_w_stack(x, y) {
function chain() {
var helper$0 = 0, sp = 0;
sp = STACKTOP;
- STACKTOP = STACKTOP + 336 | 0;
+ STACKTOP = STACKTOP + 240 | 0;
helper$0 = 1;
- HEAP32[sp + 56 >> 2] = 0;
- HEAP32[sp + 60 >> 2] = 0;
- HEAP32[sp + 8 >> 2] = helper$0;
- chain$5(sp);
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
- HEAP32[sp + 48 >> 2] = 0;
- HEAP32[sp + 52 >> 2] = 0;
HEAP32[sp + 8 >> 2] = helper$0;
- chain$4(sp);
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
HEAP32[sp + 40 >> 2] = 0;
HEAP32[sp + 44 >> 2] = 0;
- HEAP32[sp + 8 >> 2] = helper$0;
chain$3(sp);
helper$0 = HEAP32[sp + 8 >> 2] | 0;
+ HEAP32[sp + 8 >> 2] = helper$0;
HEAP32[sp + 32 >> 2] = 0;
HEAP32[sp + 36 >> 2] = 0;
- HEAP32[sp + 8 >> 2] = helper$0;
chain$2(sp);
helper$0 = HEAP32[sp + 8 >> 2] | 0;
- HEAP32[sp + 24 >> 2] = 0;
- HEAP32[sp + 28 >> 2] = 0;
- HEAP32[sp + 8 >> 2] = helper$0;
- chain$1(sp);
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
- HEAP32[sp + 16 >> 2] = 0;
- HEAP32[sp + 20 >> 2] = 0;
- HEAP32[sp + 8 >> 2] = helper$0;
- chain$0(sp);
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
STACKTOP = sp;
}
function lin$0(sp) {
sp = sp | 0;
- c(13);
c(14);
c(15);
c(16);
@@ -323,6 +302,7 @@ function lin$0(sp) {
}
function lin$1(sp) {
sp = sp | 0;
+ c(4);
c(5);
c(6);
c(7);
@@ -331,10 +311,10 @@ function lin$1(sp) {
c(10);
c(11);
c(12);
+ c(13);
}
function lin2$0(sp) {
sp = sp | 0;
- c(13);
c(14);
c(15);
c(16);
@@ -345,6 +325,8 @@ function lin2$0(sp) {
}
function lin2$1(sp) {
sp = sp | 0;
+ c(3);
+ c(4);
c(5);
c(6);
c(7);
@@ -353,6 +335,7 @@ function lin2$1(sp) {
c(10);
c(11);
c(12);
+ c(13);
}
function lin3$0(sp) {
sp = sp | 0;
@@ -369,21 +352,9 @@ function lin3$0(sp) {
break OL;
} while (0);
}
-function lin3$1(sp) {
- sp = sp | 0;
- c(6);
- c(7);
- c(8);
- c(9);
- c(10);
- c(11);
- c(12);
- c(13);
-}
function lin4$0(sp) {
sp = sp | 0;
OL : do {
- c(13);
c(14);
c(15);
c(16);
@@ -395,21 +366,9 @@ function lin4$0(sp) {
break OL;
} while (0);
}
-function lin4$1(sp) {
- sp = sp | 0;
- c(5);
- c(6);
- c(7);
- c(8);
- c(9);
- c(10);
- c(11);
- c(12);
-}
function lin5$0(sp) {
sp = sp | 0;
OL : do {
- c(13);
c(14);
c(15);
c(16);
@@ -421,22 +380,9 @@ function lin5$0(sp) {
break OL;
} while (0);
}
-function lin5$1(sp) {
- sp = sp | 0;
- c(5);
- c(6);
- c(7);
- c(8);
- c(9);
- c(10);
- c(11);
- c(12);
-}
function mix$0(sp) {
sp = sp | 0;
OL : do {
- c(16);
- c(17);
HEAP32[sp + 8 >> 2] = 2;
HEAP32[sp + 12 >> 2] = 2;
break OL;
@@ -460,6 +406,13 @@ function mix$0(sp) {
}
function mix$1(sp) {
sp = sp | 0;
+ c(1);
+ c(2);
+ c(3);
+ c(4);
+ c(5);
+ c(6);
+ c(7);
c(8);
c(9);
c(10);
@@ -468,33 +421,24 @@ function mix$1(sp) {
c(13);
c(14);
c(15);
+ c(16);
+ c(17);
}
function vars$0(sp) {
sp = sp | 0;
var x = 0, y = +0;
- y = +HEAPF32[sp + 16 >> 2];
x = HEAP32[sp + 8 >> 2] | 0;
+ y = +HEAPF32[sp + 16 >> 2];
c(5 + (x + y));
c(6 + y * x);
c(7 + (x + y));
c(8 + y * x);
}
-function vars$1(sp) {
- sp = sp | 0;
- var x = 0, y = +0;
- y = +HEAPF32[sp + 16 >> 2];
- x = HEAP32[sp + 8 >> 2] | 0;
- c(1 + (x + y));
- c(2 + y * x);
- c(3 + (x + y));
- c(4 + y * x);
-}
function vars2$0(sp) {
sp = sp | 0;
- var a = 0, b = +0;
- b = +HEAPF32[sp + 32 >> 2];
+ var b = +0, a = 0;
a = HEAP32[sp + 24 >> 2] | 0;
- a = c(3 + a);
+ b = +HEAPF32[sp + 32 >> 2];
b = c(4 + b);
a = c(5 + a);
b = c(6 + b);
@@ -507,57 +451,28 @@ function vars3$0(sp) {
x = HEAP32[sp + 8 >> 2] | 0;
y = +HEAPF32[sp + 16 >> 2];
a = HEAP32[sp + 24 >> 2] | 0;
- a = c(4 + y * x);
a = c(5 + a);
a = c(6 + y * x);
a = c(7 + a);
HEAP32[sp + 24 >> 2] = a;
}
-function vars3$1(sp) {
- sp = sp | 0;
- var a = 0, x = 0, y = +0;
- y = +HEAPF32[sp + 16 >> 2];
- x = HEAP32[sp + 8 >> 2] | 0;
- a = HEAP32[sp + 24 >> 2] | 0;
- a = x + y;
- a = c(1 + a);
- a = c(2 + y * x);
- a = c(3 + a);
- HEAP32[sp + 24 >> 2] = a;
-}
function vars4$0(sp) {
sp = sp | 0;
var a = 0, x = 0, b = +0;
- b = +HEAPF32[sp + 32 >> 2];
x = HEAP32[sp + 8 >> 2] | 0;
a = HEAP32[sp + 24 >> 2] | 0;
- a = c(4 + a);
+ b = +HEAPF32[sp + 32 >> 2];
a = c(5 + a);
a = c(6 + a);
b = c(7 + a + x);
HEAP32[sp + 24 >> 2] = a;
HEAPF32[sp + 32 >> 2] = b;
}
-function vars4$1(sp) {
- sp = sp | 0;
- var y = +0, x = 0, a = 0, b = +0;
- b = +HEAPF32[sp + 32 >> 2];
- a = HEAP32[sp + 24 >> 2] | 0;
- x = HEAP32[sp + 8 >> 2] | 0;
- y = +HEAPF32[sp + 16 >> 2];
- b = y * x;
- a = c(1 + a);
- a = c(2 + a);
- a = c(3 + a);
- HEAPF32[sp + 32 >> 2] = b;
- HEAP32[sp + 24 >> 2] = a;
-}
function vars_w_stack$0(sp) {
sp = sp | 0;
var a = 0, b = +0;
- b = +HEAPF32[sp + 48 >> 2];
a = HEAP32[sp + 40 >> 2] | 0;
- a = c(4 + a);
+ b = +HEAPF32[sp + 48 >> 2];
a = c(5 + a);
a = c(6 + a);
b = c(7 + a);
@@ -567,39 +482,40 @@ function vars_w_stack$0(sp) {
}
function vars_w_stack$1(sp) {
sp = sp | 0;
- var y = +0, x = 0, a = 0, b = +0;
- b = +HEAPF32[sp + 48 >> 2];
- a = HEAP32[sp + 40 >> 2] | 0;
+ var a = 0, x = 0, y = +0, b = +0;
x = HEAP32[sp + 24 >> 2] | 0;
y = +HEAPF32[sp + 32 >> 2];
+ a = HEAP32[sp + 40 >> 2] | 0;
+ b = +HEAPF32[sp + 48 >> 2];
+ a = x + y;
b = y * x;
a = c(1 + a);
a = c(2 + a);
a = c(3 + a);
- HEAPF32[sp + 48 >> 2] = b;
+ a = c(4 + a);
HEAP32[sp + 40 >> 2] = a;
+ HEAPF32[sp + 48 >> 2] = b;
}
function chain$0(sp) {
sp = sp | 0;
var helper$0 = 0;
helper$0 = HEAP32[sp + 8 >> 2] | 0;
- if (helper$0) {
- helper$0 = 0;
- if (x == 11) {
- print(11);
- } else if (x == 12) {
- print(12);
- } else {
- helper$0 = 1;
- }
- }
- if (helper$0) {
- helper$0 = 0;
- if (1) {
- print(99);
- } else {
- helper$0 = 1;
- }
+ if (x == 7) {
+ print(7);
+ } else if (x == 8) {
+ print(8);
+ } else if (x == 9) {
+ print(9);
+ } else if (x == 10) {
+ print(10);
+ } else if (x == 11) {
+ print(11);
+ } else if (x == 12) {
+ print(12);
+ } else if (1) {
+ print(99);
+ } else {
+ helper$0 = 1;
}
HEAP32[sp + 8 >> 2] = helper$0;
}
@@ -607,15 +523,20 @@ function chain$1(sp) {
sp = sp | 0;
var helper$0 = 0;
helper$0 = HEAP32[sp + 8 >> 2] | 0;
- if (helper$0) {
- helper$0 = 0;
- if (x == 9) {
- print(9);
- } else if (x == 10) {
- print(10);
- } else {
- helper$0 = 1;
- }
+ if (x == 1) {
+ print(1);
+ } else if (x == 2) {
+ print(2);
+ } else if (x == 3) {
+ print(3);
+ } else if (x == 4) {
+ print(4);
+ } else if (x == 5) {
+ print(5);
+ } else if (x == 6) {
+ print(6);
+ } else {
+ helper$0 = 1;
}
HEAP32[sp + 8 >> 2] = helper$0;
}
@@ -625,13 +546,11 @@ function chain$2(sp) {
helper$0 = HEAP32[sp + 8 >> 2] | 0;
if (helper$0) {
helper$0 = 0;
- if (x == 7) {
- print(7);
- } else if (x == 8) {
- print(8);
- } else {
- helper$0 = 1;
- }
+ HEAP32[sp + 8 >> 2] = helper$0;
+ HEAP32[sp + 16 >> 2] = 0;
+ HEAP32[sp + 20 >> 2] = 0;
+ chain$0(sp);
+ helper$0 = HEAP32[sp + 8 >> 2] | 0;
}
HEAP32[sp + 8 >> 2] = helper$0;
}
@@ -641,45 +560,11 @@ function chain$3(sp) {
helper$0 = HEAP32[sp + 8 >> 2] | 0;
if (helper$0) {
helper$0 = 0;
- if (x == 5) {
- print(5);
- } else if (x == 6) {
- print(6);
- } else {
- helper$0 = 1;
- }
- }
- HEAP32[sp + 8 >> 2] = helper$0;
-}
-function chain$4(sp) {
- sp = sp | 0;
- var helper$0 = 0;
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
- if (helper$0) {
- helper$0 = 0;
- if (x == 3) {
- print(3);
- } else if (x == 4) {
- print(4);
- } else {
- helper$0 = 1;
- }
- }
- HEAP32[sp + 8 >> 2] = helper$0;
-}
-function chain$5(sp) {
- sp = sp | 0;
- var helper$0 = 0;
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
- if (helper$0) {
- helper$0 = 0;
- if (x == 1) {
- print(1);
- } else if (x == 2) {
- print(2);
- } else {
- helper$0 = 1;
- }
+ HEAP32[sp + 8 >> 2] = helper$0;
+ HEAP32[sp + 24 >> 2] = 0;
+ HEAP32[sp + 28 >> 2] = 0;
+ chain$1(sp);
+ helper$0 = HEAP32[sp + 8 >> 2] | 0;
}
HEAP32[sp + 8 >> 2] = helper$0;
}
diff --git a/tools/test-js-optimizer-asm-outline2-output.js b/tools/test-js-optimizer-asm-outline2-output.js
index 9f0be278..28feb6cb 100644
--- a/tools/test-js-optimizer-asm-outline2-output.js
+++ b/tools/test-js-optimizer-asm-outline2-output.js
@@ -11,6 +11,8 @@ function linear() {
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
+ cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
+ cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
HEAP32[sp + 16 >> 2] = 0;
HEAP32[sp + 20 >> 2] = 0;
linear$1(sp);
@@ -21,7 +23,7 @@ function linear() {
}
function _free($mem) {
$mem = $mem | 0;
- var $5 = 0, $10 = 0, $16 = 0, $21 = 0, $25 = 0, $26 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $194 = 0, sp = 0, helper$0 = 0;
+ var $5 = 0, $10 = 0, $16 = 0, $21 = 0, $25 = 0, $26 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $194 = 0, sp = 0;
sp = STACKTOP;
if (($mem | 0) == 0) {
STACKTOP = sp;
@@ -37,63 +39,59 @@ function _free($mem) {
}
$16 = $mem + (($10 & -8) - 8) | 0;
L621 : do {
- helper$0 = 1;
- if (helper$0) {
- helper$0 = 0;
- if (($10 & 1 | 0) == 0) {
- $21 = HEAP32[($mem - 8 | 0) >> 2] | 0;
- if (($10 & 3 | 0) == 0) {
- return;
- }
- $25 = $mem + (-8 - $21 | 0) | 0;
- $26 = $21 + ($10 & -8) | 0;
- if (($mem + (-8 - $21 | 0) | 0) >>> 0 < $5 >>> 0) {
- _abort();
- }
- HEAP32[sp + 664 >> 2] = 0;
- HEAP32[sp + 668 >> 2] = 0;
- HEAP32[sp + 48 >> 2] = $25;
- HEAP32[sp + 8 >> 2] = $mem;
- HEAP32[sp + 24 >> 2] = $10;
- HEAP32[sp + 56 >> 2] = $26;
- HEAP32[sp + 40 >> 2] = $21;
- HEAP32[sp + 16 >> 2] = $5;
- HEAP32[sp + 224 >> 2] = $p_0;
- HEAP32[sp + 216 >> 2] = $psize_0;
- _free$1(sp);
- $p_0 = HEAP32[sp + 224 >> 2] | 0;
- $psize_0 = HEAP32[sp + 216 >> 2] | 0;
- tempValue = HEAP32[sp + 664 >> 2] | 0;
- tempInt = HEAP32[sp + 668 >> 2] | 0;
- tempDouble = +HEAPF32[sp + 668 >> 2];
- HEAP32[sp + 664 >> 2] = 0;
- HEAP32[sp + 668 >> 2] = 0;
- if ((tempValue | 0) == 5) {
- return;
- }
- if ((tempValue | 0) == 1) {
+ if (($10 & 1 | 0) == 0) {
+ $21 = HEAP32[($mem - 8 | 0) >> 2] | 0;
+ if (($10 & 3 | 0) == 0) {
+ return;
+ }
+ $25 = $mem + (-8 - $21 | 0) | 0;
+ $26 = $21 + ($10 & -8) | 0;
+ if (($mem + (-8 - $21 | 0) | 0) >>> 0 < $5 >>> 0) {
+ _abort();
+ }
+ if (($25 | 0) == (HEAP32[25] | 0)) {
+ if ((HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & 3 | 0) != 3) {
+ $p_0 = $25;
+ $psize_0 = $26;
break;
}
- if ((tempValue | 0) == 2) {
- switch (tempInt | 0) {
- case 2:
- {
- break L621;
- }
+ HEAP32[22] = $26;
+ HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & -2;
+ HEAP32[$mem + ((-8 - $21 | 0) + 4) >> 2] = $26 | 1;
+ HEAP32[($mem + (($10 & -8) - 8) | 0) >> 2] = $26;
+ return;
+ }
+ HEAP32[sp + 8 >> 2] = $mem;
+ HEAP32[sp + 16 >> 2] = $5;
+ HEAP32[sp + 40 >> 2] = $21;
+ HEAP32[sp + 48 >> 2] = $25;
+ HEAP32[sp + 56 >> 2] = $26;
+ HEAP32[sp + 216 >> 2] = $psize_0;
+ HEAP32[sp + 224 >> 2] = $p_0;
+ HEAP32[sp + 648 >> 2] = 0;
+ HEAP32[sp + 652 >> 2] = 0;
+ _free$1(sp);
+ $psize_0 = HEAP32[sp + 216 >> 2] | 0;
+ $p_0 = HEAP32[sp + 224 >> 2] | 0;
+ tempValue = HEAP32[sp + 648 >> 2] | 0;
+ tempInt = HEAP32[sp + 652 >> 2] | 0;
+ tempDouble = +HEAPF32[sp + 652 >> 2];
+ HEAP32[sp + 648 >> 2] = 0;
+ HEAP32[sp + 652 >> 2] = 0;
+ if ((tempValue | 0) == 1) {
+ break;
+ }
+ if ((tempValue | 0) == 2) {
+ switch (tempInt | 0) {
+ case 2:
+ {
+ break L621;
}
}
- } else {
- helper$0 = 1;
- }
- }
- if (helper$0) {
- helper$0 = 0;
- if (1) {
- $p_0 = $mem - 8 | 0;
- $psize_0 = $10 & -8;
- } else {
- helper$0 = 1;
}
+ } else {
+ $p_0 = $mem - 8 | 0;
+ $psize_0 = $10 & -8;
}
} while (0);
$189 = $p_0;
@@ -104,21 +102,21 @@ function _free($mem) {
if (($194 & 1 | 0) == 0) {
_abort();
}
- HEAP32[sp + 672 >> 2] = 0;
- HEAP32[sp + 676 >> 2] = 0;
- HEAP32[sp + 240 >> 2] = $194;
+ HEAP32[sp + 8 >> 2] = $mem;
+ HEAP32[sp + 24 >> 2] = $10;
HEAP32[sp + 32 >> 2] = $16;
HEAP32[sp + 216 >> 2] = $psize_0;
HEAP32[sp + 224 >> 2] = $p_0;
HEAP32[sp + 232 >> 2] = $189;
- HEAP32[sp + 8 >> 2] = $mem;
- HEAP32[sp + 24 >> 2] = $10;
+ HEAP32[sp + 240 >> 2] = $194;
+ HEAP32[sp + 656 >> 2] = 0;
+ HEAP32[sp + 660 >> 2] = 0;
_free$2(sp);
- tempValue = HEAP32[sp + 672 >> 2] | 0;
- tempInt = HEAP32[sp + 676 >> 2] | 0;
- tempDouble = +HEAPF32[sp + 676 >> 2];
- HEAP32[sp + 672 >> 2] = 0;
- HEAP32[sp + 676 >> 2] = 0;
+ tempValue = HEAP32[sp + 656 >> 2] | 0;
+ tempInt = HEAP32[sp + 660 >> 2] | 0;
+ tempDouble = +HEAPF32[sp + 660 >> 2];
+ HEAP32[sp + 656 >> 2] = 0;
+ HEAP32[sp + 660 >> 2] = 0;
if ((tempValue | 0) == 5) {
return;
}
@@ -137,7 +135,6 @@ function linear$0(sp) {
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
- cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
}
function linear$1(sp) {
sp = sp | 0;
@@ -153,221 +150,186 @@ function linear$1(sp) {
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
- cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
}
function _free$0(sp) {
sp = sp | 0;
- var $16 = 0, $220 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $227 = 0, $194 = 0, $233 = 0, $mem = 0, $10 = 0, $236 = 0, $_pre_phi305 = 0, $267 = 0, $270 = 0, $273 = 0, $294 = 0, $299 = 0, $R7_1 = 0, $R7_0 = 0, $RP9_0 = 0, $301 = 0, $302 = 0, $305 = 0, $306 = 0, $278 = 0, $320 = 0, $351 = 0, $364 = 0, $psize_1 = 0;
- $psize_1 = HEAP32[sp + 424 >> 2] | 0;
- $10 = HEAP32[sp + 24 >> 2] | 0;
+ var $194 = 0, $233 = 0, $mem = 0, $10 = 0, $236 = 0, $16 = 0, $_pre_phi305 = 0, $267 = 0, $270 = 0, $273 = 0, $294 = 0, $299 = 0, $R7_1 = 0, $R7_0 = 0, $RP9_0 = 0, $301 = 0, $302 = 0, $305 = 0, $306 = 0, $278 = 0, $320 = 0, $351 = 0, $364 = 0;
$mem = HEAP32[sp + 8 >> 2] | 0;
- $194 = HEAP32[sp + 240 >> 2] | 0;
- $189 = HEAP32[sp + 232 >> 2] | 0;
- $p_0 = HEAP32[sp + 224 >> 2] | 0;
- $psize_0 = HEAP32[sp + 216 >> 2] | 0;
+ $10 = HEAP32[sp + 24 >> 2] | 0;
$16 = HEAP32[sp + 32 >> 2] | 0;
+ $194 = HEAP32[sp + 240 >> 2] | 0;
OL : do {
- if (($16 | 0) == (HEAP32[25] | 0)) {
- $220 = (HEAP32[22] | 0) + $psize_0 | 0;
- HEAP32[22] = $220;
- HEAP32[25] = $p_0;
- HEAP32[$p_0 + 4 >> 2] = $220 | 1;
- HEAP32[$189 + $220 >> 2] = $220;
- HEAP32[sp + 656 >> 2] = 5;
- break OL;
- }
- $227 = ($194 & -8) + $psize_0 | 0;
- L726 : do {
- if ($194 >>> 0 < 256) {
- $233 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
- $236 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
- do {
- if (($233 | 0) != (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
- if ($233 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- if ((HEAP32[$233 + 12 >> 2] | 0) == ($16 | 0)) {
- break;
- }
+ if ($194 >>> 0 < 256) {
+ $233 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
+ $236 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
+ do {
+ if (($233 | 0) != (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
+ if ($233 >>> 0 < (HEAP32[24] | 0) >>> 0) {
_abort();
}
- } while (0);
- if (($236 | 0) == ($233 | 0)) {
- HEAP32[20] = HEAP32[20] & (1 << ($194 >>> 3) ^ -1);
- break;
+ if ((HEAP32[$233 + 12 >> 2] | 0) == ($16 | 0)) {
+ break;
+ }
+ _abort();
}
- do {
- if (($236 | 0) == (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
- $_pre_phi305 = $236 + 8 | 0;
- } else {
- if ($236 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- if ((HEAP32[($236 + 8 | 0) >> 2] | 0) == ($16 | 0)) {
- $_pre_phi305 = $236 + 8 | 0;
- break;
- }
+ } while (0);
+ if (($236 | 0) == ($233 | 0)) {
+ HEAP32[20] = HEAP32[20] & (1 << ($194 >>> 3) ^ -1);
+ HEAP32[sp + 640 >> 2] = 1;
+ break OL;
+ }
+ do {
+ if (($236 | 0) == (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
+ $_pre_phi305 = $236 + 8 | 0;
+ } else {
+ if ($236 >>> 0 < (HEAP32[24] | 0) >>> 0) {
_abort();
}
- } while (0);
- HEAP32[$233 + 12 >> 2] = $236;
- HEAP32[$_pre_phi305 >> 2] = $233;
- } else {
- $267 = $mem + (($10 & -8) - 8) | 0;
- $270 = HEAP32[$mem + (($10 & -8) + 16) >> 2] | 0;
- $273 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
- do {
- if (($273 | 0) == ($267 | 0)) {
- $294 = HEAP32[($mem + (($10 & -8) + 12) | 0) >> 2] | 0;
- if (($294 | 0) == 0) {
- $299 = HEAP32[($mem + (($10 & -8) + 8) | 0) >> 2] | 0;
- if (($299 | 0) == 0) {
- $R7_1 = 0;
- break;
- } else {
- $R7_0 = $299;
- $RP9_0 = $mem + (($10 & -8) + 8) | 0;
- }
- } else {
- $R7_0 = $294;
- $RP9_0 = $mem + (($10 & -8) + 12) | 0;
- }
- while (1) {
- $301 = $R7_0 + 20 | 0;
- $302 = HEAP32[$301 >> 2] | 0;
- if (($302 | 0) != 0) {
- $R7_0 = $302;
- $RP9_0 = $301;
- continue;
- }
- $305 = $R7_0 + 16 | 0;
- $306 = HEAP32[$305 >> 2] | 0;
- if (($306 | 0) == 0) {
- break;
- } else {
- $R7_0 = $306;
- $RP9_0 = $305;
- }
- }
- if ($RP9_0 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- } else {
- HEAP32[$RP9_0 >> 2] = 0;
- $R7_1 = $R7_0;
+ if ((HEAP32[($236 + 8 | 0) >> 2] | 0) == ($16 | 0)) {
+ $_pre_phi305 = $236 + 8 | 0;
+ break;
+ }
+ _abort();
+ }
+ } while (0);
+ HEAP32[$233 + 12 >> 2] = $236;
+ HEAP32[$_pre_phi305 >> 2] = $233;
+ } else {
+ $267 = $mem + (($10 & -8) - 8) | 0;
+ $270 = HEAP32[$mem + (($10 & -8) + 16) >> 2] | 0;
+ $273 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
+ do {
+ if (($273 | 0) == ($267 | 0)) {
+ $294 = HEAP32[($mem + (($10 & -8) + 12) | 0) >> 2] | 0;
+ if (($294 | 0) == 0) {
+ $299 = HEAP32[($mem + (($10 & -8) + 8) | 0) >> 2] | 0;
+ if (($299 | 0) == 0) {
+ $R7_1 = 0;
break;
+ } else {
+ $R7_0 = $299;
+ $RP9_0 = $mem + (($10 & -8) + 8) | 0;
}
} else {
- $278 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
- if ($278 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- if ((HEAP32[($278 + 12 | 0) >> 2] | 0) != ($267 | 0)) {
- _abort();
+ $R7_0 = $294;
+ $RP9_0 = $mem + (($10 & -8) + 12) | 0;
+ }
+ while (1) {
+ $301 = $R7_0 + 20 | 0;
+ $302 = HEAP32[$301 >> 2] | 0;
+ if (($302 | 0) != 0) {
+ $R7_0 = $302;
+ $RP9_0 = $301;
+ continue;
}
- if ((HEAP32[($273 + 8 | 0) >> 2] | 0) == ($267 | 0)) {
- HEAP32[($278 + 12 | 0) >> 2] = $273;
- HEAP32[($273 + 8 | 0) >> 2] = $278;
- $R7_1 = $273;
+ $305 = $R7_0 + 16 | 0;
+ $306 = HEAP32[$305 >> 2] | 0;
+ if (($306 | 0) == 0) {
break;
} else {
- _abort();
+ $R7_0 = $306;
+ $RP9_0 = $305;
}
}
- } while (0);
- if (($270 | 0) == 0) {
- break;
- }
- $320 = 384 + (HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] << 2) | 0;
- do {
- if (($267 | 0) == (HEAP32[$320 >> 2] | 0)) {
- HEAP32[$320 >> 2] = $R7_1;
- if (($R7_1 | 0) != 0) {
- break;
- }
- HEAP32[21] = HEAP32[21] & (1 << HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] ^ -1);
- break L726;
+ if ($RP9_0 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
} else {
- if ($270 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- if ((HEAP32[($270 + 16 | 0) >> 2] | 0) == ($267 | 0)) {
- HEAP32[($270 + 16 | 0) >> 2] = $R7_1;
- } else {
- HEAP32[$270 + 20 >> 2] = $R7_1;
- }
- if (($R7_1 | 0) == 0) {
- break L726;
- }
+ HEAP32[$RP9_0 >> 2] = 0;
+ $R7_1 = $R7_0;
+ break;
}
- } while (0);
- if ($R7_1 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- HEAP32[$R7_1 + 24 >> 2] = $270;
- $351 = HEAP32[$mem + (($10 & -8) + 8) >> 2] | 0;
- do {
- if (($351 | 0) != 0) {
- if ($351 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- } else {
- HEAP32[$R7_1 + 16 >> 2] = $351;
- HEAP32[$351 + 24 >> 2] = $R7_1;
- break;
- }
+ } else {
+ $278 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
+ if ($278 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ }
+ if ((HEAP32[($278 + 12 | 0) >> 2] | 0) != ($267 | 0)) {
+ _abort();
+ }
+ if ((HEAP32[($273 + 8 | 0) >> 2] | 0) == ($267 | 0)) {
+ HEAP32[($278 + 12 | 0) >> 2] = $273;
+ HEAP32[($273 + 8 | 0) >> 2] = $278;
+ $R7_1 = $273;
+ break;
+ } else {
+ _abort();
}
- } while (0);
- $364 = HEAP32[$mem + (($10 & -8) + 12) >> 2] | 0;
- if (($364 | 0) == 0) {
- break;
}
- if ($364 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
+ } while (0);
+ if (($270 | 0) == 0) {
+ HEAP32[sp + 640 >> 2] = 1;
+ break OL;
+ }
+ $320 = 384 + (HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] << 2) | 0;
+ do {
+ if (($267 | 0) == (HEAP32[$320 >> 2] | 0)) {
+ HEAP32[$320 >> 2] = $R7_1;
+ if (($R7_1 | 0) != 0) {
+ break;
+ }
+ HEAP32[21] = HEAP32[21] & (1 << HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] ^ -1);
+ HEAP32[sp + 640 >> 2] = 2;
+ HEAP32[sp + 644 >> 2] = 2;
+ break OL;
} else {
- HEAP32[$R7_1 + 20 >> 2] = $364;
- HEAP32[$364 + 24 >> 2] = $R7_1;
- break;
+ if ($270 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ }
+ if ((HEAP32[($270 + 16 | 0) >> 2] | 0) == ($267 | 0)) {
+ HEAP32[($270 + 16 | 0) >> 2] = $R7_1;
+ } else {
+ HEAP32[$270 + 20 >> 2] = $R7_1;
+ }
+ if (($R7_1 | 0) == 0) {
+ HEAP32[sp + 640 >> 2] = 2;
+ HEAP32[sp + 644 >> 2] = 2;
+ break OL;
+ }
}
+ } while (0);
+ if ($R7_1 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ }
+ HEAP32[$R7_1 + 24 >> 2] = $270;
+ $351 = HEAP32[$mem + (($10 & -8) + 8) >> 2] | 0;
+ do {
+ if (($351 | 0) != 0) {
+ if ($351 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$R7_1 + 16 >> 2] = $351;
+ HEAP32[$351 + 24 >> 2] = $R7_1;
+ break;
+ }
+ }
+ } while (0);
+ $364 = HEAP32[$mem + (($10 & -8) + 12) >> 2] | 0;
+ if (($364 | 0) == 0) {
+ HEAP32[sp + 640 >> 2] = 1;
+ break OL;
+ }
+ if ($364 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$R7_1 + 20 >> 2] = $364;
+ HEAP32[$364 + 24 >> 2] = $R7_1;
+ HEAP32[sp + 640 >> 2] = 1;
+ break OL;
}
- } while (0);
- HEAP32[$p_0 + 4 >> 2] = $227 | 1;
- HEAP32[$189 + $227 >> 2] = $227;
- if (($p_0 | 0) != (HEAP32[25] | 0)) {
- $psize_1 = $227;
- HEAP32[sp + 656 >> 2] = 1;
- break OL;
}
- HEAP32[22] = $227;
- HEAP32[sp + 656 >> 2] = 5;
- break OL;
} while (0);
- HEAP32[sp + 424 >> 2] = $psize_1;
}
function _free$1(sp) {
sp = sp | 0;
- var $25 = 0, $mem = 0, $10 = 0, $26 = 0, $21 = 0, $37 = 0, $40 = 0, $5 = 0, $_pre_phi307 = 0, $69 = 0, $72 = 0, $75 = 0, $95 = 0, $100 = 0, $R_1 = 0, $R_0 = 0, $RP_0 = 0, $102 = 0, $103 = 0, $106 = 0, $107 = 0, $80 = 0, $120 = 0, $151 = 0, $164 = 0, $p_0 = 0, $psize_0 = 0;
- $psize_0 = HEAP32[sp + 216 >> 2] | 0;
- $p_0 = HEAP32[sp + 224 >> 2] | 0;
+ var $21 = 0, $37 = 0, $mem = 0, $40 = 0, $5 = 0, $25 = 0, $26 = 0, $_pre_phi307 = 0, $69 = 0, $72 = 0, $75 = 0, $95 = 0, $100 = 0, $R_1 = 0, $R_0 = 0, $RP_0 = 0, $102 = 0, $103 = 0, $106 = 0, $107 = 0, $80 = 0, $120 = 0, $151 = 0, $164 = 0, $p_0 = 0, $psize_0 = 0;
+ $mem = HEAP32[sp + 8 >> 2] | 0;
$5 = HEAP32[sp + 16 >> 2] | 0;
$21 = HEAP32[sp + 40 >> 2] | 0;
- $26 = HEAP32[sp + 56 >> 2] | 0;
- $10 = HEAP32[sp + 24 >> 2] | 0;
- $mem = HEAP32[sp + 8 >> 2] | 0;
$25 = HEAP32[sp + 48 >> 2] | 0;
+ $26 = HEAP32[sp + 56 >> 2] | 0;
+ $psize_0 = HEAP32[sp + 216 >> 2] | 0;
+ $p_0 = HEAP32[sp + 224 >> 2] | 0;
OL : do {
- if (($25 | 0) == (HEAP32[25] | 0)) {
- if ((HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & 3 | 0) != 3) {
- $p_0 = $25;
- $psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 1;
- break OL;
- }
- HEAP32[22] = $26;
- HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & -2;
- HEAP32[$mem + ((-8 - $21 | 0) + 4) >> 2] = $26 | 1;
- HEAP32[($mem + (($10 & -8) - 8) | 0) >> 2] = $26;
- HEAP32[sp + 664 >> 2] = 5;
- break OL;
- }
if ($21 >>> 0 < 256) {
$37 = HEAP32[$mem + ((-8 - $21 | 0) + 8) >> 2] | 0;
$40 = HEAP32[$mem + ((-8 - $21 | 0) + 12) >> 2] | 0;
@@ -386,7 +348,7 @@ function _free$1(sp) {
HEAP32[20] = HEAP32[20] & (1 << ($21 >>> 3) ^ -1);
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 1;
+ HEAP32[sp + 648 >> 2] = 1;
break OL;
}
do {
@@ -407,7 +369,7 @@ function _free$1(sp) {
HEAP32[$_pre_phi307 >> 2] = $37;
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 1;
+ HEAP32[sp + 648 >> 2] = 1;
break OL;
}
$69 = $mem + (-8 - $21 | 0) | 0;
@@ -474,7 +436,7 @@ function _free$1(sp) {
if (($72 | 0) == 0) {
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 1;
+ HEAP32[sp + 648 >> 2] = 1;
break OL;
}
$120 = 384 + (HEAP32[($mem + ((-8 - $21 | 0) + 28) | 0) >> 2] << 2) | 0;
@@ -487,8 +449,8 @@ function _free$1(sp) {
HEAP32[21] = HEAP32[21] & (1 << HEAP32[($mem + ((-8 - $21 | 0) + 28) | 0) >> 2] ^ -1);
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 2;
- HEAP32[sp + 668 >> 2] = 2;
+ HEAP32[sp + 648 >> 2] = 2;
+ HEAP32[sp + 652 >> 2] = 2;
break OL;
} else {
if ($72 >>> 0 < (HEAP32[24] | 0) >>> 0) {
@@ -502,8 +464,8 @@ function _free$1(sp) {
if (($R_1 | 0) == 0) {
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 2;
- HEAP32[sp + 668 >> 2] = 2;
+ HEAP32[sp + 648 >> 2] = 2;
+ HEAP32[sp + 652 >> 2] = 2;
break OL;
}
}
@@ -528,7 +490,7 @@ function _free$1(sp) {
if (($164 | 0) == 0) {
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 1;
+ HEAP32[sp + 648 >> 2] = 1;
break OL;
}
if ($164 >>> 0 < (HEAP32[24] | 0) >>> 0) {
@@ -538,84 +500,92 @@ function _free$1(sp) {
HEAP32[$164 + 24 >> 2] = $R_1;
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 664 >> 2] = 1;
+ HEAP32[sp + 648 >> 2] = 1;
break OL;
}
} while (0);
- HEAP32[sp + 224 >> 2] = $p_0;
HEAP32[sp + 216 >> 2] = $psize_0;
+ HEAP32[sp + 224 >> 2] = $p_0;
}
function _free$2(sp) {
sp = sp | 0;
- var helper$1 = 0, $194 = 0, $16 = 0, $204 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $mem = 0, $10 = 0, $psize_1 = 0, $390 = 0, $396 = 0, $F16_0 = 0, $_pre_phi = 0, $404 = 0, $414 = 0, $415 = 0, $I18_0 = 0, $428 = 0, $436 = 0, $443 = 0, $447 = 0, $448 = 0, $463 = 0, $K19_0 = 0, $T_0 = 0, $472 = 0, $473 = 0, label = 0, $486 = 0, $487 = 0, $489 = 0, $501 = 0, $sp_0_in_i = 0, $sp_0_i = 0;
- $10 = HEAP32[sp + 24 >> 2] | 0;
+ var $194 = 0, $16 = 0, $204 = 0, $psize_0 = 0, $p_0 = 0, $220 = 0, $189 = 0, $227 = 0, $mem = 0, $10 = 0, $psize_1 = 0, $390 = 0, $396 = 0, $F16_0 = 0, $_pre_phi = 0, $404 = 0, $414 = 0, $415 = 0, $I18_0 = 0, $428 = 0, $436 = 0, $443 = 0, $447 = 0, $448 = 0, $463 = 0, $K19_0 = 0, $T_0 = 0, $472 = 0, $473 = 0, label = 0, $486 = 0, $487 = 0, $489 = 0, $501 = 0, $sp_0_in_i = 0, $sp_0_i = 0;
$mem = HEAP32[sp + 8 >> 2] | 0;
- $189 = HEAP32[sp + 232 >> 2] | 0;
- $p_0 = HEAP32[sp + 224 >> 2] | 0;
- $psize_0 = HEAP32[sp + 216 >> 2] | 0;
+ $10 = HEAP32[sp + 24 >> 2] | 0;
$16 = HEAP32[sp + 32 >> 2] | 0;
+ $psize_0 = HEAP32[sp + 216 >> 2] | 0;
+ $p_0 = HEAP32[sp + 224 >> 2] | 0;
+ $189 = HEAP32[sp + 232 >> 2] | 0;
$194 = HEAP32[sp + 240 >> 2] | 0;
OL : do {
do {
- helper$1 = 1;
- if (helper$1) {
- helper$1 = 0;
- if (($194 & 2 | 0) == 0) {
- if (($16 | 0) == (HEAP32[26] | 0)) {
- $204 = (HEAP32[23] | 0) + $psize_0 | 0;
- HEAP32[23] = $204;
- HEAP32[26] = $p_0;
- HEAP32[$p_0 + 4 >> 2] = $204 | 1;
- if (($p_0 | 0) == (HEAP32[25] | 0)) {
- HEAP32[25] = 0;
- HEAP32[22] = 0;
- }
- if ($204 >>> 0 <= (HEAP32[27] | 0) >>> 0) {
- HEAP32[sp + 672 >> 2] = 5;
- break OL;
- }
- _sys_trim(0) | 0;
- HEAP32[sp + 672 >> 2] = 5;
+ if (($194 & 2 | 0) == 0) {
+ if (($16 | 0) == (HEAP32[26] | 0)) {
+ $204 = (HEAP32[23] | 0) + $psize_0 | 0;
+ HEAP32[23] = $204;
+ HEAP32[26] = $p_0;
+ HEAP32[$p_0 + 4 >> 2] = $204 | 1;
+ if (($p_0 | 0) == (HEAP32[25] | 0)) {
+ HEAP32[25] = 0;
+ HEAP32[22] = 0;
+ }
+ if ($204 >>> 0 <= (HEAP32[27] | 0) >>> 0) {
+ HEAP32[sp + 656 >> 2] = 5;
break OL;
}
- HEAP32[sp + 656 >> 2] = 0;
- HEAP32[sp + 660 >> 2] = 0;
- HEAP32[sp + 32 >> 2] = $16;
- HEAP32[sp + 216 >> 2] = $psize_0;
- HEAP32[sp + 224 >> 2] = $p_0;
- HEAP32[sp + 232 >> 2] = $189;
- HEAP32[sp + 240 >> 2] = $194;
+ _sys_trim(0) | 0;
+ HEAP32[sp + 656 >> 2] = 5;
+ break OL;
+ }
+ if (($16 | 0) == (HEAP32[25] | 0)) {
+ $220 = (HEAP32[22] | 0) + $psize_0 | 0;
+ HEAP32[22] = $220;
+ HEAP32[25] = $p_0;
+ HEAP32[$p_0 + 4 >> 2] = $220 | 1;
+ HEAP32[$189 + $220 >> 2] = $220;
+ HEAP32[sp + 656 >> 2] = 5;
+ break OL;
+ }
+ $227 = ($194 & -8) + $psize_0 | 0;
+ L726 : do {
HEAP32[sp + 8 >> 2] = $mem;
HEAP32[sp + 24 >> 2] = $10;
- HEAP32[sp + 424 >> 2] = $psize_1;
+ HEAP32[sp + 32 >> 2] = $16;
+ HEAP32[sp + 240 >> 2] = $194;
+ HEAP32[sp + 640 >> 2] = 0;
+ HEAP32[sp + 644 >> 2] = 0;
_free$0(sp);
- $psize_1 = HEAP32[sp + 424 >> 2] | 0;
- tempValue = HEAP32[sp + 656 >> 2] | 0;
- tempInt = HEAP32[sp + 660 >> 2] | 0;
- tempDouble = +HEAPF32[sp + 660 >> 2];
- HEAP32[sp + 656 >> 2] = 0;
- HEAP32[sp + 660 >> 2] = 0;
- if ((tempValue | 0) == 5) {
- HEAP32[sp + 672 >> 2] = 5;
- break OL;
- }
+ tempValue = HEAP32[sp + 640 >> 2] | 0;
+ tempInt = HEAP32[sp + 644 >> 2] | 0;
+ tempDouble = +HEAPF32[sp + 644 >> 2];
+ HEAP32[sp + 640 >> 2] = 0;
+ HEAP32[sp + 644 >> 2] = 0;
if ((tempValue | 0) == 1) {
break;
}
- } else {
- helper$1 = 1;
- }
- }
- if (helper$1) {
- helper$1 = 0;
- if (1) {
- HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = $194 & -2;
- HEAP32[$p_0 + 4 >> 2] = $psize_0 | 1;
- HEAP32[$189 + $psize_0 >> 2] = $psize_0;
- $psize_1 = $psize_0;
- } else {
- helper$1 = 1;
+ if ((tempValue | 0) == 2) {
+ switch (tempInt | 0) {
+ case 2:
+ {
+ break L726;
+ }
+ }
+ }
+ } while (0);
+ HEAP32[$p_0 + 4 >> 2] = $227 | 1;
+ HEAP32[$189 + $227 >> 2] = $227;
+ if (($p_0 | 0) != (HEAP32[25] | 0)) {
+ $psize_1 = $227;
+ break;
}
+ HEAP32[22] = $227;
+ HEAP32[sp + 656 >> 2] = 5;
+ break OL;
+ } else {
+ HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = $194 & -2;
+ HEAP32[$p_0 + 4 >> 2] = $psize_0 | 1;
+ HEAP32[$189 + $psize_0 >> 2] = $psize_0;
+ $psize_1 = $psize_0;
}
} while (0);
$390 = $psize_1 >>> 3;
@@ -640,7 +610,7 @@ function _free$2(sp) {
HEAP32[$F16_0 + 12 >> 2] = $p_0;
HEAP32[$p_0 + 8 >> 2] = $F16_0;
HEAP32[$p_0 + 12 >> 2] = 120 + ($390 << 1 << 2) | 0;
- HEAP32[sp + 672 >> 2] = 5;
+ HEAP32[sp + 656 >> 2] = 5;
break OL;
}
$414 = $p_0;
@@ -727,7 +697,7 @@ function _free$2(sp) {
if (($501 | 0) == 0) {
$sp_0_in_i = 536;
} else {
- HEAP32[sp + 672 >> 2] = 5;
+ HEAP32[sp + 656 >> 2] = 5;
break OL;
}
while (1) {
@@ -740,7 +710,7 @@ function _free$2(sp) {
}
HEAP32[28] = -1;
STACKTOP = sp;
- HEAP32[sp + 672 >> 2] = 5;
+ HEAP32[sp + 656 >> 2] = 5;
break OL;
} while (0);
}