diff options
-rwxr-xr-x | em++ | 2 | ||||
-rwxr-xr-x | emcc | 37 | ||||
-rw-r--r-- | src/jsifier.js | 30 | ||||
-rw-r--r-- | src/library.js | 25 | ||||
-rw-r--r-- | src/settings.js | 6 | ||||
-rwxr-xr-x | tests/runner.py | 94 | ||||
-rw-r--r-- | tools/js-optimizer.js | 63 | ||||
-rw-r--r-- | tools/shared.py | 2 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1-output.js | 349 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline2-output.js | 594 |
10 files changed, 586 insertions, 616 deletions
@@ -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:])) @@ -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); } |