diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-03-15 18:21:34 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-03-15 18:21:34 -0700 |
commit | b22f6fbbbebb5df55ceb8fdc9f7c4d111c902c5e (patch) | |
tree | c568136b2cf95d897d128b362720602a3b401244 | |
parent | 8c9a37a40a164dba330390af2eabf5ad05625001 (diff) | |
parent | 27d1a249622d33ab8aff2814d13569507336873b (diff) |
Merge branch 'incoming'
81 files changed, 10815 insertions, 881 deletions
@@ -52,4 +52,6 @@ a license to everyone to use it as detailed in LICENSE.) * Roger Braun <roger@rogerbraun.net> * Vladimir Vukicevic <vladimir@pobox.com> (copyright owned by Mozilla Foundation) * Lorant Pinter <lorant.pinter@prezi.com> +* Tobias Doerffel <tobias.doerffel@gmail.com> +* Martin von Gagern <martin@von-gagern.net> @@ -75,7 +75,7 @@ emcc can be influenced by a few environment variables: EMMAKEN_COMPILER - The compiler to be used, if you don't want the default clang. ''' -import os, sys, shutil, tempfile, subprocess, shlex, time +import os, sys, shutil, tempfile, subprocess, shlex, time, re from subprocess import PIPE, STDOUT from tools import shared from tools.shared import Compression, execute, suffix, unsuffixed, unsuffixed_basename @@ -129,8 +129,8 @@ while response_file: for index in range(1, len(sys.argv)): if sys.argv[index][0] == '@': # found one, loop again next time - print >>sys.stderr, 'emcc: using response file: %s' % response_file response_file = sys.argv[index][1:] + print >>sys.stderr, 'emcc: using response file: %s' % response_file if not os.path.exists(response_file): print >>sys.stderr, 'emcc: error: Response file not found: %s' % response_file exit(1) @@ -215,6 +215,20 @@ Options that are modified or new in %s include: (without the external "s in either of those, you would get an error) + You can also specify a file from which the + value would be read, for example, + + -s DEAD_FUNCTIONS=@/path/to/file + + The contents of /path/to/file will be read, + JSON.parsed and set into DEAD_FUNCTIONS (so + the file could contain + + ["_func1", "func2"] + + ). Note that the path must be absolute, not + relative. + -g Use debug info. Note that you need this during the last compilation phase from bitcode to JavaScript, or else we will remove it by @@ -332,13 +346,11 @@ Options that are modified or new in %s include: output HTML but with suffix .data.compress --minify <on> 0: Do not minify the generated JavaScript's - whitespace (default if closure compiler - will not be run) + whitespace (default in -O0, -O1, or if + -g is used) 1: Minify the generated JavaScript's - whitespace (default if closure compiler - will be run). Note that this by itself - will not minify the code (closure does - that) + whitespace (default in -O2+, assuming + -g is not used) --split <size> Splits the resulting javascript file into pieces to ease debugging. This option only works if @@ -451,6 +463,13 @@ Options that are modified or new in %s include: the bootstrapped relooper. After the cache is cleared, this process will exit. + --save-bc PATH When compiling to JavaScript or HTML, this + option will save a copy of the bitcode to + the specified path. The bitcode will include + all files being linked, including standard + libraries, and after any link-time optimizations + (if any). + The target file, if specified (-o <target>), defines what will be generated: @@ -696,6 +715,8 @@ try: keep_js_debug = False bind = False jcache = False + save_bc = False + if use_cxx: default_cxx_std = '-std=c++03' # Enforce a consistent C++ standard when compiling .cpp files, if user does not specify one on the cmdline. else: @@ -706,19 +727,21 @@ try: absolute_warning_shown = False + settings_changes = [] + for i in range(len(newargs)): newargs[i] = newargs[i].strip() # On Windows Vista (and possibly others), excessive spaces in the command line leak into the items in this array, so trim e.g. 'foo.cpp ' -> 'foo.cpp' if newargs[i].startswith('-O'): # Let -O default to -O2, which is what gcc does. requested_level = newargs[i][2:] or '2' if requested_level == 's': - print >> sys.stderr, 'emcc: warning: -Os is ignored (use -O0, -O1, -O2)' - else: - try: - opt_level = int(requested_level) - assert 0 <= opt_level <= 3 - except: - raise Exception('Invalid optimization level: ' + newargs[i]) + requested_level = 2 + settings_changes.append('INLINING_LIMIT=50') + try: + opt_level = int(requested_level) + assert 0 <= opt_level <= 3 + except: + raise Exception('Invalid optimization level: ' + newargs[i]) newargs[i] = '' elif newargs[i].startswith('--llvm-opts'): check_bad_eq(newargs[i]) @@ -821,6 +844,11 @@ try: print >> sys.stderr, 'emcc: clearing cache' shared.Cache.erase() sys.exit(0) + elif newargs[i] == '--save-bc': + check_bad_eq(newargs[i]) + save_bc = newargs[i+1] + newargs[i] = '' + newargs[i+1] = '' elif newargs[i].startswith(('-I/', '-L/')): if not absolute_warning_shown: print >> sys.stderr, 'emcc: warning: -I or -L of an absolute path encountered. If this is to a local system header/library, it may cause problems (local system files make sense for compiling natively on your system, but not necessarily to JavaScript)' # Of course an absolute path to a non-system-specific library or header is fine, and you can ignore this warning. The danger are system headers that are e.g. x86 specific and nonportable. The emscripten bundled headers are modified to be portable, local system ones are generally not @@ -842,7 +870,6 @@ try: if closure: assert os.path.exists(shared.CLOSURE_COMPILER), 'emcc: fatal: Closure compiler (%s) does not exist' % shared.CLOSURE_COMPILER - settings_changes = [] for i in range(len(newargs)): if newargs[i] == '-s': if is_minus_s_for_emcc(newargs, i): @@ -960,6 +987,8 @@ try: # Apply -s settings in newargs here (after optimization levels, so they can override them) for change in settings_changes: key, value = change.split('=') + if value[0] == '@': + value = '"' + value + '"' exec('shared.Settings.' + key + ' = ' + value) # Apply effects from settings @@ -973,6 +1002,7 @@ try: if shared.Settings.CORRECT_OVERFLOWS != 1: print >> sys.stderr, 'emcc: warning: setting CORRECT_OVERFLOWS to 1 for asm.js code generation' shared.Settings.CORRECT_OVERFLOWS = 1 + assert not shared.Settings.PGO, 'cannot run PGO in ASM_JS mode' if shared.Settings.CORRECT_SIGNS >= 2 or shared.Settings.CORRECT_OVERFLOWS >= 2 or shared.Settings.CORRECT_ROUNDINGS >= 2: keep_llvm_debug = True # must keep debug info to do line-by-line operations @@ -982,7 +1012,7 @@ try: closure = False if minify_whitespace is None: - minify_whitespace = closure # if closure is run, minify whitespace + minify_whitespace = opt_level >= 2 and not keep_js_debug ## Compile source code to bitcode @@ -1068,10 +1098,29 @@ try: def create_libc(): if DEBUG: print >> sys.stderr, 'emcc: building libc for cache' o_s = [] - for src in ['dlmalloc.c', os.path.join('libcxx', 'new.cpp')]: + libc_files = [ + 'dlmalloc.c', + os.path.join('libcxx', 'new.cpp'), + os.path.join('libc', 'stdlib', 'getopt_long.c'), + os.path.join('libc', 'gen', 'err.c'), + os.path.join('libc', 'gen', 'errx.c'), + os.path.join('libc', 'gen', 'warn.c'), + os.path.join('libc', 'gen', 'warnx.c'), + os.path.join('libc', 'gen', 'verr.c'), + os.path.join('libc', 'gen', 'verrx.c'), + os.path.join('libc', 'gen', 'vwarn.c'), + os.path.join('libc', 'gen', 'vwarnx.c'), + os.path.join('libc', 'stdlib', 'strtod.c'), + ]; + + prev_cxx = os.environ.get('EMMAKEN_CXX') + if prev_cxx: os.environ['EMMAKEN_CXX'] = '' + for src in libc_files: o = in_temp(os.path.basename(src) + '.o') execute([shared.PYTHON, shared.EMCC, shared.path_from_root('system', 'lib', src), '-o', o], stdout=stdout, stderr=stderr) o_s.append(o) + if prev_cxx: os.environ['EMMAKEN_CXX'] = prev_cxx + shared.Building.link(o_s, in_temp('libc.bc')) return in_temp('libc.bc') @@ -1219,6 +1268,9 @@ try: shared.Building.llvm_opt(in_temp(target_basename + '.bc'), link_opts) if DEBUG: save_intermediate('linktime', 'bc') + if save_bc: + shutil.copyfile(final, save_bc) + # Prepare .ll for Emscripten if not LEAVE_INPUTS_RAW: final = shared.Building.llvm_dis(final, final + '.ll') @@ -1331,14 +1383,15 @@ try: if DEBUG: print >> sys.stderr, 'emcc: running closure' final = shared.Building.closure_compiler(final) if DEBUG: save_intermediate('closure') - elif shared.Settings.RELOOP and not closure and not keep_js_debug: - # do this if closure is not enabled (it gives similar speedups), and we do not need to keep debug info around - js_optimizer_queue += ['registerize'] if opt_level >= 1: if DEBUG: print >> sys.stderr, 'emcc: running post-closure post-opts' js_optimizer_queue += ['simplifyExpressionsPost'] + if not closure and shared.Settings.RELOOP and not keep_js_debug: + # do this if closure is not enabled (it gives similar speedups), and we do not need to keep debug info around + js_optimizer_queue += ['registerize'] + if minify_whitespace: js_optimizer_queue += ['compress'] @@ -1346,6 +1399,11 @@ try: 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() + src = re.sub(r'\n+[ \n]*\n+', '\n', src) + open(final, 'w').write(src) + # If we were asked to also generate HTML, do that if final_suffix == 'html': if DEBUG: print >> sys.stderr, 'emcc: generating HTML' diff --git a/emscripten.py b/emscripten.py index 0b9244c2..0698c783 100755 --- a/emscripten.py +++ b/emscripten.py @@ -33,16 +33,22 @@ NUM_CHUNKS_PER_CORE = 1.25 MIN_CHUNK_SIZE = 1024*1024 MAX_CHUNK_SIZE = float(os.environ.get('EMSCRIPT_MAX_CHUNK_SIZE') or 'inf') # configuring this is just for debugging purposes -def process_funcs((i, funcs, meta, settings_file, compiler, forwarded_file, libraries, compiler_engine, temp_files)): - ll = ''.join(funcs) + '\n' + meta +def process_funcs((i, funcs, meta, settings_file, compiler, forwarded_file, libraries, compiler_engine, temp_files, DEBUG)): funcs_file = temp_files.get('.func_%d.ll' % i).name - open(funcs_file, 'w').write(ll) + f = open(funcs_file, 'w') + f.write(funcs) + funcs = None + f.write('\n') + f.write(meta) + f.close() out = jsrun.run_js( compiler, engine=compiler_engine, args=[settings_file, funcs_file, 'funcs', forwarded_file] + libraries, - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, + cwd=path_from_root('src')) tempfiles.try_delete(funcs_file) + if DEBUG: print >> sys.stderr, '.' return out def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, @@ -153,7 +159,8 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, if out and DEBUG: print >> sys.stderr, ' loading pre from jcache' if not out: open(pre_file, 'w').write(pre_input) - out = jsrun.run_js(compiler, compiler_engine, [settings_file, pre_file, 'pre'] + libraries, stdout=subprocess.PIPE) + out = jsrun.run_js(compiler, compiler_engine, [settings_file, pre_file, 'pre'] + libraries, stdout=subprocess.PIPE, + cwd=path_from_root('src')) if jcache: if DEBUG: print >> sys.stderr, ' saving pre to jcache' jcache.set(shortkey, keys, out) @@ -185,6 +192,8 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, funcs, chunk_size, jcache.get_cachename('emscript_files') if jcache else None) + funcs = None + if jcache: # load chunks from cache where we can # TODO: ignore small chunks cached_outputs = [] @@ -211,7 +220,7 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, if DEBUG: print >> sys.stderr, ' emscript: phase 2 working on %d chunks %s (intended chunk size: %.2f MB, meta: %.2f MB, forwarded: %.2f MB, total: %.2f MB)' % (len(chunks), ('using %d cores' % cores) if len(chunks) > 1 else '', chunk_size/(1024*1024.), len(meta)/(1024*1024.), len(forwarded_data)/(1024*1024.), total_ll_size/(1024*1024.)) commands = [ - (i, chunk, meta, settings_file, compiler, forwarded_file, libraries, compiler_engine, temp_files) + (i, chunk, meta, settings_file, compiler, forwarded_file, libraries, compiler_engine, temp_files, DEBUG) for i, chunk in enumerate(chunks) ] @@ -220,6 +229,9 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, outputs = pool.map(process_funcs, commands, chunksize=1) elif len(chunks) == 1: outputs = [process_funcs(commands[0])] + + commands = None + else: outputs = [] @@ -232,11 +244,13 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, jcache.set(shortkey, keys, outputs[i]) if out and DEBUG and len(chunks) > 0: print >> sys.stderr, ' saving %d funcchunks to jcache' % len(chunks) + chunks = None + if jcache: outputs += cached_outputs # TODO: preserve order outputs = [output.split('//FORWARDED_DATA:') for output in outputs] for output in outputs: - assert len(output) == 2, 'Did not receive forwarded data in an output - process failed? We only got: ' + output[0] + assert len(output) == 2, 'Did not receive forwarded data in an output - process failed? We only got: ' + output[0][-3000:] if DEBUG: print >> sys.stderr, ' emscript: phase 2 took %s seconds' % (time.time() - t) if DEBUG: t = time.time() @@ -265,7 +279,7 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, if len(parts) > 1: pre = parts[0] outputs.append([parts[1]]) - funcs_js = ''.join([output[0] for output in outputs]) + funcs_js = [''.join([output[0] for output in outputs])] # this will be a list of things, so we do not do string appending as we add more outputs = None if DEBUG: print >> sys.stderr, ' emscript: phase 2b took %s seconds' % (time.time() - t) @@ -304,11 +318,16 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, if DEBUG: t = time.time() post_file = temp_files.get('.post.ll').name open(post_file, 'w').write('\n') # no input, just processing of forwarded data - out = jsrun.run_js(compiler, compiler_engine, [settings_file, post_file, 'post', forwarded_file] + libraries, stdout=subprocess.PIPE) + out = jsrun.run_js(compiler, compiler_engine, [settings_file, post_file, 'post', forwarded_file] + libraries, stdout=subprocess.PIPE, + cwd=path_from_root('src')) post, last_forwarded_data = out.split('//FORWARDED_DATA:') # if this fails, perhaps the process failed prior to printing forwarded data? last_forwarded_json = json.loads(last_forwarded_data) if settings.get('ASM_JS'): + post_funcs, post_rest = post.split('// EMSCRIPTEN_END_FUNCS\n') + post = post_rest + funcs_js += ['\n' + post_funcs + '// EMSCRIPTEN_END_FUNCS\n'] + simple = os.environ.get('EMCC_SIMPLE_ASM') class Counter: i = 0 @@ -316,11 +335,12 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, del last_forwarded_json['Functions']['tables']['pre'] # Find function table calls without function tables generated for them - for use in set(re.findall(r'{{{ FTM_[\w\d_$]+ }}}', funcs_js)): - sig = use[8:len(use)-4] - if sig not in last_forwarded_json['Functions']['tables']: - if DEBUG: print >> sys.stderr, 'add empty function table', sig - last_forwarded_json['Functions']['tables'][sig] = 'var FUNCTION_TABLE_' + sig + ' = [0,0];\n' + for funcs_js_item in funcs_js: + for use in set(re.findall(r'{{{ FTM_[\w\d_$]+ }}}', funcs_js_item)): + sig = use[8:len(use)-4] + if sig not in last_forwarded_json['Functions']['tables']: + if DEBUG: print >> sys.stderr, 'add empty function table', sig + last_forwarded_json['Functions']['tables'][sig] = 'var FUNCTION_TABLE_' + sig + ' = [0,0];\n' def make_table(sig, raw): i = Counter.i @@ -329,14 +349,14 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, params = ','.join(['p%d' % p for p in range(len(sig)-1)]) coercions = ';'.join(['p%d = %sp%d%s' % (p, '+' if sig[p+1] != 'i' else '', p, '' if sig[p+1] != 'i' else '|0') for p in range(len(sig)-1)]) + ';' ret = '' if sig[0] == 'v' else ('return %s0' % ('+' if sig[0] != 'i' else '')) - return ('function %s(%s) { %s abort(%d); %s };' % (bad, params, coercions, i, ret), raw.replace('[0,', '[' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0]', ',' + bad + ']').replace(',0]', ',' + bad + ']').replace(',0\n', ',' + bad + '\n')) + return ('function %s(%s) { %s abort(%d); %s }' % (bad, params, coercions, i, ret), raw.replace('[0,', '[' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0]', ',' + bad + ']').replace(',0]', ',' + bad + ']').replace(',0\n', ',' + bad + '\n')) infos = [make_table(sig, raw) for sig, raw in last_forwarded_json['Functions']['tables'].iteritems()] - function_tables_defs = '\n'.join([info[0] for info in infos] + [info[1] for info in infos]) + function_tables_defs = '\n'.join([info[0] for info in infos]) + '\n// EMSCRIPTEN_END_FUNCS\n' + '\n'.join([info[1] for info in infos]) asm_setup = '' maths = ['Math.' + func for func in ['floor', 'abs', 'sqrt', 'pow', 'cos', 'sin', 'tan', 'acos', 'asin', 'atan', 'atan2', 'exp', 'log', 'ceil', 'imul']] fundamentals = ['Math', 'Int8Array', 'Int16Array', 'Int32Array', 'Uint8Array', 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'] - math_envs = ['Runtime.bitshift64', 'Math.min'] # TODO: move min to maths + math_envs = ['Math.min'] # TODO: move min to maths asm_setup += '\n'.join(['var %s = %s;' % (f.replace('.', '_'), f) for f in math_envs]) basic_funcs = ['abort', 'assert', 'asmPrintInt', 'asmPrintFloat', 'copyTempDouble', 'copyTempFloat'] + [m.replace('.', '_') for m in math_envs] if settings['SAFE_HEAP']: basic_funcs += ['SAFE_HEAP_LOAD', 'SAFE_HEAP_STORE', 'SAFE_HEAP_CLEAR'] @@ -404,8 +424,12 @@ var i64Math_modulo = function(a, b, c, d, e) { i64Math.modulo(a, b, c, d, e) }; receiving = ';\n'.join(['var ' + s + ' = Module["' + s + '"] = asm.' + s for s in exported_implemented_functions + function_tables]) else: receiving = 'var _main = Module["_main"] = asm;' + # finalize - funcs_js = ''' + + if DEBUG: print >> sys.stderr, 'asm text sizes', map(len, funcs_js), len(asm_setup), len(asm_global_vars), len(asm_global_funcs), len(pre_tables), len('\n'.join(function_tables_impls)), len(function_tables_defs.replace('\n', '\n ')), len(exports), len(the_global), len(sending), len(receiving) + + funcs_js = [''' %s function asmPrintInt(x, y) { Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack); @@ -413,6 +437,7 @@ function asmPrintInt(x, y) { function asmPrintFloat(x, y) { Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack); } +// EMSCRIPTEN_START_ASM var asm = (function(global, env, buffer) { 'use asm'; var HEAP8 = new global.Int8Array(buffer); @@ -429,6 +454,7 @@ var asm = (function(global, env, buffer) { var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0; ''' + ''.join([''' var tempRet%d = 0;''' % i for i in range(10)]) + '\n' + asm_global_funcs + ''' +// EMSCRIPTEN_START_FUNCS function stackAlloc(size) { size = size|0; var ret = 0; @@ -453,17 +479,18 @@ var asm = (function(global, env, buffer) { value = value|0; tempRet%d = value; } -''' % (i, i) for i in range(10)]) + funcs_js + ''' - +''' % (i, i) for i in range(10)])] + funcs_js + [''' %s return %s; -})(%s, %s, buffer); +}) +// EMSCRIPTEN_END_ASM +(%s, %s, buffer); %s; Runtime.stackAlloc = function(size) { return asm.stackAlloc(size) }; Runtime.stackSave = function() { return asm.stackSave() }; Runtime.stackRestore = function(top) { asm.stackRestore(top) }; -''' % (pre_tables + '\n'.join(function_tables_impls) + '\n' + function_tables_defs.replace('\n', '\n '), exports, the_global, sending, receiving) +''' % (pre_tables + '\n'.join(function_tables_impls) + '\n' + function_tables_defs.replace('\n', '\n '), exports, the_global, sending, receiving)] # Set function table masks def function_table_maskize(js): @@ -476,11 +503,20 @@ Runtime.stackRestore = function(top) { asm.stackRestore(top) }; sig = m.groups(0)[0] return masks[sig] return re.sub(r'{{{ FTM_([\w\d_$]+) }}}', lambda m: fix(m), js) # masks[m.groups(0)[0]] - funcs_js = function_table_maskize(funcs_js) + funcs_js = map(function_table_maskize, funcs_js) else: function_tables_defs = '\n'.join([table for table in last_forwarded_json['Functions']['tables'].itervalues()]) outfile.write(function_tables_defs) - outfile.write(blockaddrsize(indexize(funcs_js))) + funcs_js = [''' +// EMSCRIPTEN_START_FUNCS +'''] + funcs_js + [''' +// EMSCRIPTEN_END_FUNCS +'''] + + for funcs_js_item in funcs_js: # do this loop carefully to save memory + funcs_js_item = indexize(funcs_js_item) + funcs_js_item = blockaddrsize(funcs_js_item) + outfile.write(funcs_js_item) funcs_js = None outfile.write(indexize(post)) diff --git a/src/analyzer.js b/src/analyzer.js index ecb5ea6b..92b7d8cf 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -18,7 +18,7 @@ function recomputeLines(func) { // Handy sets var BRANCH_INVOKE = set('branch', 'invoke'); -var LABEL_ENDERS = set('branch', 'return'); +var LABEL_ENDERS = set('branch', 'return', 'switch'); var SIDE_EFFECT_CAUSERS = set('call', 'invoke', 'atomic'); var UNUNFOLDABLE = set('value', 'structvalue', 'type', 'phiparam'); @@ -231,9 +231,10 @@ function analyzer(data, sidePass) { } if (isIllegalType(item.valueType) || isIllegalType(item.type)) { isIllegal = true; - } - if ((item.intertype == 'load' || item.intertype == 'store') && isStructType(item.valueType)) { + } else if ((item.intertype == 'load' || item.intertype == 'store') && isStructType(item.valueType)) { isIllegal = true; // storing an entire structure is illegal + } else if (item.intertype == 'mathop' && item.op == 'trunc' && isIllegalType(item.params[1].ident)) { // trunc stores target value in second ident + isIllegal = true; } }); if (!isIllegal) { @@ -290,7 +291,7 @@ function analyzer(data, sidePass) { var elements = getLegalParams([item.value], bits)[0]; var j = 0; elements.forEach(function(element) { - var tempVar = '$st$' + i + '$' + j; + var tempVar = '$st$' + (tempId++) + '$' + j; toAdd.push({ intertype: 'getelementptr', assignTo: tempVar, @@ -401,7 +402,7 @@ function analyzer(data, sidePass) { var j = 0; var toAdd = []; elements.forEach(function(element) { - var tempVar = '$st$' + i + '$' + j; + var tempVar = '$ld$' + (tempId++) + '$' + j; toAdd.push({ intertype: 'getelementptr', assignTo: tempVar, @@ -652,13 +653,14 @@ function analyzer(data, sidePass) { if (!isNumber(shifts)) { // We can't statically legalize this, do the operation at runtime TODO: optimize assert(sourceBits == 64, 'TODO: handle nonconstant shifts on != 64 bits'); + assert(PRECISE_I64_MATH, 'Must have precise i64 math for non-constant 64-bit shifts'); + Types.preciseI64MathUsed = 1; value.intertype = 'value'; - value.ident = 'Runtime' + (ASM_JS ? '_' : '.') + 'bitshift64(' + + value.ident = 'var ' + value.assignTo + '$0 = _bitshift64' + value.op[0].toUpperCase() + value.op.substr(1) + '(' + asmCoercion(sourceElements[0].ident, 'i32') + ',' + asmCoercion(sourceElements[1].ident, 'i32') + ',' + - Runtime['BITSHIFT64_' + value.op.toUpperCase()] + ',' + asmCoercion(value.params[1].ident + '$0', 'i32') + ');' + - 'var ' + value.assignTo + '$0 = ' + makeGetTempDouble(0, 'i32') + ', ' + value.assignTo + '$1 = ' + makeGetTempDouble(1, 'i32') + ';'; + 'var ' + value.assignTo + '$1 = tempRet0;'; value.assignTo = null; i++; continue; @@ -952,6 +954,7 @@ function analyzer(data, sidePass) { // Function parameters func.params.forEach(function(param) { if (param.intertype !== 'varargs') { + if (func.variables[param.ident]) warn('cannot have duplicate variable names: ' + param.ident); // toNiceIdent collisions? func.variables[param.ident] = { ident: param.ident, type: param.type, @@ -965,6 +968,7 @@ function analyzer(data, sidePass) { // Normal variables func.lines.forEach(function(item, i) { if (item.assignTo) { + if (func.variables[item.assignTo]) warn('cannot have duplicate variable names: ' + item.assignTo); // toNiceIdent collisions? var variable = func.variables[item.assignTo] = { ident: item.assignTo, type: item.type, @@ -1380,7 +1384,7 @@ function analyzer(data, sidePass) { var label = func.labels[i]; for (var j = 0; j < label.lines.length; j++) { var line = label.lines[j]; - if (line.intertype == 'call' && line.ident == setjmp) { + if ((line.intertype == 'call' || line.intertype == 'invoke') && line.ident == setjmp) { // Add a new label var oldIdent = label.ident; var newIdent = func.labelIdCounter++; diff --git a/src/compiler.js b/src/compiler.js index 3047daf1..bb72c7dd 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -141,8 +141,13 @@ if (phase == 'pre') { if (settings_file) { var settings = JSON.parse(read(settings_file)); - for (setting in settings) { - eval(setting + ' = ' + JSON.stringify(settings[setting])); + for (key in settings) { + var value = settings[key]; + if (value[0] == '@') { + // response file type thing, workaround for large inputs: value is @path-to-file + value = JSON.parse(read(value.substr(1))); + } + eval(key + ' = ' + JSON.stringify(value)); } } @@ -163,6 +168,7 @@ if (SAFE_HEAP >= 2) { EXPORTED_FUNCTIONS = set(EXPORTED_FUNCTIONS); EXPORTED_GLOBALS = set(EXPORTED_GLOBALS); EXCEPTION_CATCHING_WHITELIST = set(EXCEPTION_CATCHING_WHITELIST); +DEAD_FUNCTIONS = numberedSet(DEAD_FUNCTIONS); RUNTIME_DEBUG = LIBRARY_DEBUG || GL_DEBUG; diff --git a/src/experimental/allow_loopvars_from_memsetcpy_inasm.diff b/src/experimental/allow_loopvars_from_memsetcpy_inasm.diff new file mode 100644 index 00000000..a2dde7da --- /dev/null +++ b/src/experimental/allow_loopvars_from_memsetcpy_inasm.diff @@ -0,0 +1,97 @@ +commit a61ef3dbbaf7333ad67fca29c0aad5bcc99b653a +Author: Alon Zakai <alonzakai@gmail.com> +Date: Wed Mar 6 18:18:03 2013 -0800 + + handle new vars in asm code, such as the loop vars from memset/memcpy loops + +diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js +index f2dc516..65059e8 100644 +--- a/tools/js-optimizer.js ++++ b/tools/js-optimizer.js +@@ -1321,7 +1321,7 @@ function normalizeAsm(func) { + var name = v[0]; + var value = v[1]; + if (!(name in data.vars)) { +- assert(value[0] == 'num' || (value[0] == 'unary-prefix' && value[2][0] == 'num')); // must be valid coercion no-op ++ if (!(value[0] == 'num' || (value[0] == 'unary-prefix' && value[2][0] == 'num'))) break outer; // must be valid coercion no-op + data.vars[name] = detectAsmCoercion(value); + v.length = 1; // make an un-assigning var + } else { +@@ -1331,6 +1331,7 @@ function normalizeAsm(func) { + i++; + } + // finally, look for other var definitions and collect them ++ var extra = []; + while (i < stats.length) { + traverse(stats[i], function(node, type) { + if (type == 'var') { +@@ -1340,6 +1341,7 @@ function normalizeAsm(func) { + var value = v[1]; + if (!(name in data.vars)) { + data.vars[name] = detectAsmCoercion(value); ++ extra.push(['var', [[name]]]); // add a 'var' for normal JS + } + } + unVarify(node[1], node); +@@ -1353,6 +1355,7 @@ function normalizeAsm(func) { + }); + i++; + } ++ if (extra.length > 0) stats.splice.apply(stats, [0, 0].concat(extra)); + //printErr('normalized \n\n' + astToSrc(func) + '\n\nwith: ' + JSON.stringify(data)); + return data; + } +diff --git a/tools/test-js-optimizer-asm-regs-output.js b/tools/test-js-optimizer-asm-regs-output.js +index 99bccd2..f84b8d5 100644 +--- a/tools/test-js-optimizer-asm-regs-output.js ++++ b/tools/test-js-optimizer-asm-regs-output.js +@@ -9,6 +9,18 @@ function asm(d1, i2) { + d4 = d1 * 5; + return d4; + } ++function asm2(d1, i2) { ++ d1 = +d1; ++ i2 = i2 | 0; ++ var i3 = 0, d4 = +0; ++ i3 = i2; ++ i2 = d1 + i3 | 0; ++ d1 = d(Math_max(10, Math_min(5, f()))); ++ i3 = i2 + 2 | 0; ++ print(i3); ++ d4 = d1 * 5; ++ return d4; ++} + function _doit(i1, i2, i3) { + i1 = i1 | 0; + i2 = i2 | 0; +diff --git a/tools/test-js-optimizer-asm-regs.js b/tools/test-js-optimizer-asm-regs.js +index 0afced2..fbaa7c4 100644 +--- a/tools/test-js-optimizer-asm-regs.js ++++ b/tools/test-js-optimizer-asm-regs.js +@@ -10,6 +10,19 @@ function asm(x, y) { + double2 = double1*5; + return double2; + } ++function asm2(x, y) { ++ x = +x; ++ y = y | 0; ++ var int1 = 0, int2 = 0; // do not mix the types! ++ var double1 = +0, double2 = +0; ++ var tempy = y; ++ int1 = (x+tempy)|0; ++ double1 = d(Math.max(10, Math_min(5, f()))); ++ int2 = (int1+2)|0; ++ print(int2); ++ double2 = double1*5; ++ return double2; ++} + function _doit($x, $y$0, $y$1) { + $x = $x | 0; + $y$0 = $y$0 | 0; +@@ -41,5 +54,5 @@ function retf() { + } + // missing final return, need it as a float + } +-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "rett", "ret2t", "retf"] ++// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "asm2", "_doit", "rett", "ret2t", "retf"] + diff --git a/src/experimental/simplifyGeneratedFunctionsDetection.diff b/src/experimental/simplifyGeneratedFunctionsDetection.diff new file mode 100644 index 00000000..09e0ebcd --- /dev/null +++ b/src/experimental/simplifyGeneratedFunctionsDetection.diff @@ -0,0 +1,336 @@ +diff --git a/emscripten.py b/emscripten.py +index b698654..a7843c7 100755 +--- a/emscripten.py ++++ b/emscripten.py +@@ -294,8 +294,6 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, + outfile.write(blockaddrsize(indexize(pre))) + pre = None + +- #if DEBUG: outfile.write('// funcs\n') +- + # forward + forwarded_data = json.dumps(forwarded_json) + forwarded_file = temp_files.get('.2.json').name +@@ -483,9 +481,14 @@ Runtime.stackRestore = function(top) { asm.stackRestore(top) }; + else: + function_tables_defs = '\n'.join([table for table in last_forwarded_json['Functions']['tables'].itervalues()]) + outfile.write(function_tables_defs) ++ ++ outfile.write('// EMSCRIPTEN_START_FUNCS\n') ++ + outfile.write(blockaddrsize(indexize(funcs_js))) + funcs_js = None + ++ outfile.write('// EMSCRIPTEN_END_FUNCS\n') ++ + outfile.write(indexize(post)) + if DEBUG: print >> sys.stderr, ' emscript: phase 3 took %s seconds' % (time.time() - t) + +diff --git a/src/jsifier.js b/src/jsifier.js +index ff58ece..d6aa110 100644 +--- a/src/jsifier.js ++++ b/src/jsifier.js +@@ -1587,12 +1587,6 @@ function JSify(data, functionsOnly, givenFunctions) { + + var shellParts = read(shellFile).split('{{BODY}}'); + print(shellParts[1]); +- // Print out some useful metadata (for additional optimizations later, like the eliminator) +- if (EMIT_GENERATED_FUNCTIONS) { +- print('// EMSCRIPTEN_GENERATED_FUNCTIONS: ' + JSON.stringify(keys(Functions.implementedFunctions).filter(function(func) { +- return IGNORED_FUNCTIONS.indexOf(func.ident) < 0; +- })) + '\n'); +- } + + PassManager.serialize(); + +diff --git a/src/settings.js b/src/settings.js +index 1bfcf92..99c83f4 100644 +--- a/src/settings.js ++++ b/src/settings.js +@@ -336,8 +336,6 @@ var EXPLICIT_ZEXT = 0; // If 1, generate an explicit conversion of zext i1 to i3 + + var NECESSARY_BLOCKADDRS = []; // List of (function, block) for all block addresses that are taken. + +-var EMIT_GENERATED_FUNCTIONS = 0; // whether to emit the list of generated functions, needed for external JS optimization passes +- + // Compiler debugging options + var DEBUG_TAGS_SHOWING = []; + // Some useful items: +diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js +index f2dc516..9fa038c 100644 +--- a/tools/js-optimizer.js ++++ b/tools/js-optimizer.js +@@ -140,16 +140,6 @@ var UNDEFINED_NODE = ['unary-prefix', 'void', ['num', 0]]; + var TRUE_NODE = ['unary-prefix', '!', ['num', 0]]; + var FALSE_NODE = ['unary-prefix', '!', ['num', 1]]; + +-var GENERATED_FUNCTIONS_MARKER = '// EMSCRIPTEN_GENERATED_FUNCTIONS:'; +-var generatedFunctions = null; +-function setGeneratedFunctions(metadata) { +- var start = metadata.indexOf(GENERATED_FUNCTIONS_MARKER); +- generatedFunctions = set(eval(metadata.substr(start + GENERATED_FUNCTIONS_MARKER.length))); +-} +-function isGenerated(ident) { +- return ident in generatedFunctions; +-} +- + function srcToAst(src) { + return uglify.parser.parse(src); + } +@@ -212,21 +202,9 @@ function traverse(node, pre, post, stack) { + return result; + } + +-// Only walk through the generated functions +-function traverseGenerated(ast, pre, post, stack) { +- assert(generatedFunctions); +- traverse(ast, function(node) { +- if (node[0] == 'defun' && isGenerated(node[1])) { +- traverse(node, pre, post, stack); +- return null; +- } +- }); +-} +- +-function traverseGeneratedFunctions(ast, callback) { +- assert(generatedFunctions); ++function traverseFunctions(ast, callback) { + traverse(ast, function(node) { +- if (node[0] == 'defun' && isGenerated(node[1])) { ++ if (node[0] == 'defun') { + callback(node); + return null; + } +@@ -418,7 +396,7 @@ function simplifyExpressionsPre(ast) { + var rerun = true; + while (rerun) { + rerun = false; +- traverseGenerated(ast, function process(node, type, stack) { ++ traverse(ast, function process(node, type, stack) { + if (type == 'binary' && node[1] == '|') { + if (node[2][0] == 'num' && node[3][0] == 'num') { + return ['num', node[2][1] | node[3][1]]; +@@ -455,7 +433,7 @@ function simplifyExpressionsPre(ast) { + } + + // &-related optimizations +- traverseGenerated(ast, function(node, type) { ++ traverse(ast, function(node, type) { + if (type == 'binary' && node[1] == '&' && node[3][0] == 'num') { + if (node[2][0] == 'num') return ['num', node[2][1] & node[3][1]]; + var input = node[2]; +@@ -489,7 +467,7 @@ function simplifyExpressionsPre(ast) { + + if (asm) { + // optimize num >> num, in asm we need this here since we do not run optimizeShifts +- traverseGenerated(ast, function(node, type) { ++ traverse(ast, function(node, type) { + if (type == 'binary' && node[1] == '>>' && node[2][0] == 'num' && node[3][0] == 'num') { + node[0] = 'num'; + node[1] = node[2][1] >> node[3][1]; +@@ -505,7 +483,7 @@ function simplifyExpressionsPre(ast) { + var rerun = true; + while (rerun) { + rerun = false; +- traverseGenerated(ast, function(node, type) { ++ traverse(ast, function(node, type) { + if (type == 'binary' && node[1] == '+') { + if (node[2][0] == 'num' && node[3][0] == 'num') { + rerun = true; +@@ -528,7 +506,7 @@ function simplifyExpressionsPre(ast) { + + // if (x == 0) can be if (!x), etc. + function simplifyZeroComp(ast) { +- traverseGenerated(ast, function(node, type) { ++ traverse(ast, function(node, type) { + var binary; + if (type == 'if' && (binary = node[1])[0] == 'binary') { + if ((binary[1] == '!=' || binary[1] == '!==') && binary[3][0] == 'num' && binary[3][1] == 0) { +@@ -554,7 +532,7 @@ function simplifyExpressionsPre(ast) { + // TODO: when shifting a variable, if there are other uses, keep an unshifted version too, to prevent slowdowns? + function optimizeShiftsInternal(ast, conservative) { + var MAX_SHIFTS = 3; +- traverseGeneratedFunctions(ast, function(fun) { ++ traverseFunctions(ast, function(fun) { + var funMore = true; + var funFinished = {}; + while (funMore) { +@@ -999,7 +977,7 @@ function vacuum(ast) { + } break; + } + } +- traverseGeneratedFunctions(ast, function(node) { ++ traverseFunctions(ast, function(node) { + vacuumInternal(node); + simplifyNotComps(node); + }); +@@ -1021,7 +999,7 @@ function getStatements(node) { + // if (condition) { label == x } else .. + // We can hoist the multiple block into the condition, thus removing code and one 'if' check + function hoistMultiples(ast) { +- traverseGeneratedFunctions(ast, function(node) { ++ traverseFunctions(ast, function(node) { + traverse(node, function(node, type) { + var statements = getStatements(node); + if (!statements) return; +@@ -1135,7 +1113,7 @@ function hoistMultiples(ast) { + // if (..) { .. break|continue } else { .. } + // to + // if (..) { .. break|continue } .. +- traverseGenerated(ast, function(container, type) { ++ traverse(ast, function(container, type) { + var statements = getStatements(container); + if (!statements) return; + for (var i = 0; i < statements.length; i++) { +@@ -1168,7 +1146,7 @@ function loopOptimizer(ast) { + function passTwo(ast) { + var neededDos = []; + // Find unneeded labels +- traverseGenerated(ast, function(node, type, stack) { ++ traverse(ast, function(node, type, stack) { + if (type == 'label' && node[2][0] in LOOP) { + // this is a labelled loop. we don't know if it's needed yet. Mark its label for removal for now now. + stack.push(node); +@@ -1212,7 +1190,7 @@ function loopOptimizer(ast) { + // We return whether another pass is necessary + var more = false; + // Remove unneeded labels +- traverseGenerated(ast, function(node, type) { ++ traverse(ast, function(node, type) { + if (type == 'label' && node[1][0] == '+') { + more = true; + var ident = node[1].substr(1); +@@ -1227,13 +1205,13 @@ function loopOptimizer(ast) { + }); + // Remove unneeded one-time loops. We need such loops if (1) they have a label, or (2) they have a direct break so they are in neededDos. + // First, add all labeled loops of this nature to neededDos +- traverseGenerated(ast, function(node, type) { ++ traverse(ast, function(node, type) { + if (type == 'label' && node[2][0] == 'do') { + neededDos.push(node[2]); + } + }); + // Remove unneeded dos, we know who they are now +- traverseGenerated(ast, function(node, type) { ++ traverse(ast, function(node, type) { + if (type == 'do' && neededDos.indexOf(node) < 0) { + assert(jsonCompare(node[1], ['num', 0]), 'Trying to remove a one-time do loop that is not one of our generated ones.;'); + more = true; +@@ -1407,7 +1385,7 @@ function denormalizeAsm(func, data) { + // we still need the eliminator? Closure? And in what order? Perhaps just + // closure simple? + function registerize(ast) { +- traverseGeneratedFunctions(ast, function(fun) { ++ traverseFunctions(ast, function(fun) { + if (asm) var asmData = normalizeAsm(fun); + // Add parameters as a first (fake) var (with assignment), so they get taken into consideration + var params = {}; // note: params are special, they can never share a register between them (see later) +@@ -1671,7 +1649,7 @@ var ABORTING_ELIMINATOR_SCAN_NODES = set('new', 'object', 'function', 'defun', ' + + function eliminate(ast, memSafe) { + // Find variables that have a single use, and if they can be eliminated, do so +- traverseGeneratedFunctions(ast, function(func, type) { ++ traverseFunctions(ast, function(func, type) { + if (asm) var asmData = normalizeAsm(func); + //printErr('eliminate in ' + func[1]); + +@@ -2218,9 +2196,6 @@ var passes = { + var src = read(arguments_[0]); + var ast = srcToAst(src); + //printErr(JSON.stringify(ast)); throw 1; +-var metadata = src.split('\n').filter(function(line) { return line.indexOf(GENERATED_FUNCTIONS_MARKER) >= 0 })[0]; +-//assert(metadata, 'Must have EMSCRIPTEN_GENERATED_FUNCTIONS metadata'); +-if (metadata) setGeneratedFunctions(metadata); + + arguments_.slice(1).forEach(function(arg) { + passes[arg](ast); +diff --git a/tools/js_optimizer.py b/tools/js_optimizer.py +index 2fd2211..a253afb 100644 +--- a/tools/js_optimizer.py ++++ b/tools/js_optimizer.py +@@ -41,17 +41,17 @@ def run_on_js(filename, passes, js_engine, jcache): + if os.linesep != '\n': + js = js.replace(os.linesep, '\n') # we assume \n in the splitting code + +- # Find suffix +- suffix_marker = '// EMSCRIPTEN_GENERATED_FUNCTIONS' +- suffix_start = js.find(suffix_marker) +- suffix = '' +- if suffix_start >= 0: +- suffix = js[suffix_start:js.find('\n', suffix_start)] + '\n' +- # if there is metadata, we will run only on the generated functions. If there isn't, we will run on everything. +- generated = set(eval(suffix[len(suffix_marker)+1:])) +- +- if not suffix and jcache: +- # JCache cannot be used without metadata, since it might reorder stuff, and that's dangerous since only generated can be reordered ++ # Find markers ++ start_marker = '// EMSCRIPTEN_START_FUNCS\n' ++ end_marker = '// EMSCRIPTEN_END_FUNCS\n' ++ start = js.find(start_marker) ++ end = js.find(end_marker) ++ assert (start >= 0) == (end >= 0), 'must have both markers or neither' ++ have_markers = start >= 0 ++ # if there are markers, we will run only on the generated functions. If there isn't, we will run on everything. ++ ++ if not have_markers and jcache: ++ # JCache cannot be used without markers, since it might reorder stuff, and that's dangerous since only generated can be reordered + # This means jcache does not work after closure compiler runs, for example. But you won't get much benefit from jcache with closure + # anyhow (since closure is likely the longest part of the build). + if DEBUG: print >>sys.stderr, 'js optimizer: no metadata, so disabling jcache' +@@ -59,27 +59,10 @@ def run_on_js(filename, passes, js_engine, jcache): + + # If we process only generated code, find that and save the rest on the side + func_sig = re.compile('( *)function (_[\w$]+)\(') +- if suffix: +- pos = 0 +- gen_start = 0 +- gen_end = 0 +- while 1: +- m = func_sig.search(js, pos) +- if not m: break +- pos = m.end() +- indent = m.group(1) +- ident = m.group(2) +- if ident in generated: +- if not gen_start: +- gen_start = m.start() +- assert gen_start +- gen_end = js.find('\n%s}\n' % indent, m.end()) + (3 + len(indent)) +- assert gen_end > gen_start +- pre = js[:gen_start] +- post = js[gen_end:] +- if 'last' in passes: +- post = post.replace(suffix, '') # no need to write out the metadata - nothing after us needs it +- js = js[gen_start:gen_end] ++ if have_markers: ++ pre = js[:start + len(start_marker)] # includes start marker ++ post = js[end:] # includes end marker ++ js = js[start + len(start_marker):end] + else: + pre = '' + post = '' +@@ -95,7 +78,7 @@ def run_on_js(filename, passes, js_engine, jcache): + if m: + ident = m.group(2) + else: +- if suffix: continue # ignore whitespace ++ if have_markers: continue # ignore whitespace + ident = 'anon_%d' % i + assert ident + funcs.append((ident, func)) +@@ -131,7 +114,6 @@ def run_on_js(filename, passes, js_engine, jcache): + temp_file = temp_files.get('.jsfunc_%d.js' % i).name + f = open(temp_file, 'w') + f.write(chunk) +- f.write(suffix) + f.close() + return temp_file + filenames = [write_chunk(chunks[i], i) for i in range(len(chunks))] +@@ -169,7 +151,6 @@ def run_on_js(filename, passes, js_engine, jcache): + f.write(cached); # TODO: preserve order + f.write('\n') + f.write(post); +- # No need to write suffix: if there was one, it is inside post which exists when suffix is there + f.write('\n') + f.close() + diff --git a/src/headless.js b/src/headless.js index 8e847d27..d81fb5a3 100644 --- a/src/headless.js +++ b/src/headless.js @@ -537,7 +537,7 @@ var document = { case /* GL_MAX_FRAGMENT_UNIFORM_VECTORS */ 0x8DFD: return 4096; case /* GL_MAX_VARYING_VECTORS */ 0x8DFC: return 32; case /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */ 0x8B4D: return 32; - default: throw 'getParameter ' + pname; + default: console.log('getParameter ' + pname + '?'); return 0; } }, getSupportedExtensions: function() { @@ -686,6 +686,7 @@ var document = { document.callEventListeners('pointerlockchange'); }); }, + exitPointerLock: function(){}, style: {}, eventListeners: {}, addEventListener: document.addEventListener, @@ -748,6 +749,8 @@ var document = { body: { appendChild: function(){}, }, + exitPointerLock: function(){}, + cancelFullScreen: function(){}, }; var alert = function(x) { print(x); diff --git a/src/intertyper.js b/src/intertyper.js index 2103ecfa..57e3011d 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -122,16 +122,19 @@ function intertyper(data, sidePass, baseLineNums) { SKIP_STACK_IN_SMALL = 0; } - unparsedBundles.push({ - intertype: 'unparsedFunction', - // We need this early, to know basic function info - ident, params, varargs - ident: toNiceIdent(func.ident), - params: func.params, - returnType: func.returnType, - hasVarArgs: func.hasVarArgs, - lineNum: currFunctionLineNum, - lines: currFunctionLines - }); + var ident = toNiceIdent(func.ident); + if (!(ident in DEAD_FUNCTIONS)) { + unparsedBundles.push({ + intertype: 'unparsedFunction', + // We need this early, to know basic function info - ident, params, varargs + ident: ident, + params: func.params, + returnType: func.returnType, + hasVarArgs: func.hasVarArgs, + lineNum: currFunctionLineNum, + lines: currFunctionLines + }); + } currFunctionLines = []; } } diff --git a/src/jsifier.js b/src/jsifier.js index ff58ece2..4263618a 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -397,6 +397,20 @@ function JSify(data, functionsOnly, givenFunctions) { } }); + function processLibraryFunction(snippet, ident) { + snippet = snippet.toString(); + assert(snippet.indexOf('XXX missing C define') == -1, + 'Trying to include a library function with missing C defines: ' + ident + ' | ' + snippet); + + // name the function; overwrite if it's already named + snippet = snippet.replace(/function(?:\s+([^(]+))?\s*\(/, 'function _' + ident + '('); + if (LIBRARY_DEBUG) { + snippet = snippet.replace('{', '{ var ret = (function() { if (Runtime.debug) Module.printErr("[library call:' + ident + ': " + Array.prototype.slice.call(arguments).map(Runtime.prettyPrint) + "]"); '); + snippet = snippet.substr(0, snippet.length-1) + '}).apply(this, arguments); if (Runtime.debug && typeof ret !== "undefined") Module.printErr(" [ return:" + Runtime.prettyPrint(ret)); return ret; \n}'; + } + return snippet; + } + // functionStub substrate.addActor('FunctionStub', { processItem: function(item) { @@ -434,16 +448,7 @@ function JSify(data, functionsOnly, givenFunctions) { snippet = stringifyWithFunctions(snippet); } else if (typeof snippet === 'function') { isFunction = true; - snippet = snippet.toString(); - assert(snippet.indexOf('XXX missing C define') == -1, - 'Trying to include a library function with missing C defines: ' + ident + ' | ' + snippet); - - // name the function; overwrite if it's already named - snippet = snippet.replace(/function(?:\s+([^(]+))?\s*\(/, 'function _' + ident + '('); - if (LIBRARY_DEBUG) { - snippet = snippet.replace('{', '{ var ret = (function() { if (Runtime.debug) Module.printErr("[library call:' + ident + ': " + Array.prototype.slice.call(arguments).map(Runtime.prettyPrint) + "]"); '); - snippet = snippet.substr(0, snippet.length-1) + '}).apply(this, arguments); if (Runtime.debug && typeof ret !== "undefined") Module.printErr(" [ return:" + Runtime.prettyPrint(ret)); return ret; \n}'; - } + snippet = processLibraryFunction(snippet, ident); if (ASM_JS) Functions.libraryFunctions[ident] = 1; } @@ -600,6 +605,10 @@ function JSify(data, functionsOnly, givenFunctions) { func.JS += 'function ' + func.ident + '(' + paramIdents.join(', ') + ') {\n'; + if (PGO) { + func.JS += ' PGOMonitor.called["' + func.ident + '"] = 1;\n'; + } + if (ASM_JS) { // spell out argument types func.params.forEach(function(param) { @@ -731,7 +740,7 @@ function JSify(data, functionsOnly, givenFunctions) { return indent + ' case ' + getLabelId(label.ident) + ': ' + (SHOW_LABELS ? '// ' + getOriginalLabelId(label.ident) : '') + '\n' + getLabelLines(label, indent + ' '); }).join('\n') + '\n'; - if (ASSERTIONS) ret += indent + ' default: assert(0, "bad label: " + label);\n'; + if (ASSERTIONS) ret += indent + ' default: assert(0' + (ASM_JS ? '' : ', "bad label: " + label') + ');\n'; ret += indent + '}\n'; if (func.setjmpTable) { ret += ' } catch(e) { if (!e.longjmp || !(e.id in mySetjmpIds)) throw(e); setjmpTable[setjmpLabels[e.id]](e.value) }'; @@ -1312,6 +1321,8 @@ function JSify(data, functionsOnly, givenFunctions) { } else { callIdent = ident; } + if (callIdent == '0') return 'abort(-2)'; + var args = []; var argsTypes = []; var varargs = []; @@ -1414,6 +1425,12 @@ function JSify(data, functionsOnly, givenFunctions) { returnType = getReturnType(type); } + if (callIdent in DEAD_FUNCTIONS) { + var ret = 'abort(' + DEAD_FUNCTIONS[callIdent] + ')'; + if (ASM_JS) ret = asmCoercion(ret, returnType); + return ret; + } + if (byPointer) { var sig = Functions.getSignature(returnType, argsTypes, hasVarArgs); if (ASM_JS) { @@ -1443,7 +1460,7 @@ function JSify(data, functionsOnly, givenFunctions) { makeFuncLineActor('unreachable', function(item) { if (ASSERTIONS) { - return 'throw "Reached an unreachable!"'; + return ASM_JS ? 'abort()' : 'throw "Reached an unreachable!"'; } else { return ';'; } @@ -1552,16 +1569,25 @@ function JSify(data, functionsOnly, givenFunctions) { // This is the main 'post' pass. Print out the generated code that we have here, together with the // rest of the output that we started to print out earlier (see comment on the // "Final shape that will be created"). - if (CORRUPTION_CHECK) { - assert(!ASM_JS); // cannot monkeypatch asm! - print(processMacros(read('corruptionCheck.js'))); - } if (PRECISE_I64_MATH && Types.preciseI64MathUsed) { + if (!INCLUDE_FULL_LIBRARY) { + ['i64Add', 'bitshift64Shl', 'bitshift64Lshr', 'bitshift64Ashr'].forEach(function(func) { + print(processLibraryFunction(LibraryManager.library[func], func)); // must be first to be close to generated code + Functions.implementedFunctions['_' + func] = LibraryManager.library[func + '__sig']; + }); + } + print('// EMSCRIPTEN_END_FUNCS\n'); print(read('long.js')); } else { + print('// EMSCRIPTEN_END_FUNCS\n'); print('// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included'); print('var i64Math = null;'); } + + if (CORRUPTION_CHECK) { + assert(!ASM_JS); // cannot monkeypatch asm! + print(processMacros(read('corruptionCheck.js'))); + } if (HEADLESS) { print('if (!ENVIRONMENT_IS_WEB) {'); print(read('headless.js').replace("'%s'", "'http://emscripten.org'").replace("'?%s'", "''").replace('%s,', 'null,').replace('%d', '0')); @@ -1587,11 +1613,17 @@ function JSify(data, functionsOnly, givenFunctions) { var shellParts = read(shellFile).split('{{BODY}}'); print(shellParts[1]); - // Print out some useful metadata (for additional optimizations later, like the eliminator) - if (EMIT_GENERATED_FUNCTIONS) { - print('// EMSCRIPTEN_GENERATED_FUNCTIONS: ' + JSON.stringify(keys(Functions.implementedFunctions).filter(function(func) { + // Print out some useful metadata + if (EMIT_GENERATED_FUNCTIONS || PGO) { + var generatedFunctions = JSON.stringify(keys(Functions.implementedFunctions).filter(function(func) { return IGNORED_FUNCTIONS.indexOf(func.ident) < 0; - })) + '\n'); + })); + if (PGO) { + print('PGOMonitor.allGenerated = ' + generatedFunctions + ';\nremoveRunDependency("pgo");\n'); + } + if (EMIT_GENERATED_FUNCTIONS) { + print('// EMSCRIPTEN_GENERATED_FUNCTIONS: ' + generatedFunctions + '\n'); + } } PassManager.serialize(); diff --git a/src/library.js b/src/library.js index 1cd7e3f5..45187d8d 100644 --- a/src/library.js +++ b/src/library.js @@ -504,7 +504,7 @@ LibraryManager.library = { } var utf8 = new Runtime.UTF8Processor(); function simpleOutput(val) { - if (val === null || val === '\n'.charCodeAt(0)) { + if (val === null || val === {{{ charCode('\n') }}}) { output.printer(output.buffer.join('')); output.buffer = []; } else { @@ -600,8 +600,8 @@ LibraryManager.library = { quit: function() { if (!FS.init.initialized) return; // Flush any partially-printed lines in stdout and stderr. Careful, they may have been closed - if (FS.streams[2] && FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output('\n'.charCodeAt(0)); - if (FS.streams[3] && FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output('\n'.charCodeAt(0)); + if (FS.streams[2] && FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output({{{ charCode('\n') }}}); + if (FS.streams[3] && FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output({{{ charCode('\n') }}}); }, // Standardizes a path. Useful for making comparisons of pathnames work in a consistent manner. @@ -828,11 +828,11 @@ LibraryManager.library = { // Null or empty results in '.'. var me = ___libgenSplitName; if (!me.ret) { - me.ret = allocate(['.'.charCodeAt(0), 0], 'i8', ALLOC_NORMAL); + me.ret = allocate([{{{ charCode('.') }}}, 0], 'i8', ALLOC_NORMAL); } return [me.ret, -1]; } else { - var slash = '/'.charCodeAt(0); + var slash = {{{ charCode('/') }}}; var allSlashes = true; var slashPositions = []; for (var i = 0; {{{ makeGetValue('path', 'i', 'i8') }}} !== 0; i++) { @@ -1730,7 +1730,12 @@ LibraryManager.library = { } var contents = stream.object.contents; var size = Math.min(contents.length - offset, nbyte); - if (contents.subarray || contents.slice) { // typed array or normal array +#if USE_TYPED_ARRAYS == 2 + if (contents.subarray) { // typed array + HEAPU8.set(contents.subarray(offset, offset+size), buf); + } else +#endif + if (contents.slice) { // normal array for (var i = 0; i < size; i++) { {{{ makeSetValue('buf', 'i', 'contents[offset + i]', 'i8') }}} } @@ -2403,6 +2408,7 @@ LibraryManager.library = { case {{{ cDefine('_SC_STREAM_MAX') }}}: return 16; case {{{ cDefine('_SC_TZNAME_MAX') }}}: return 6; case {{{ cDefine('_SC_THREAD_DESTRUCTOR_ITERATIONS') }}}: return 4; + case {{{ cDefine('_SC_NPROCESSORS_ONLN') }}}: return 1; } ___setErrNo(ERRNO_CODES.EINVAL); return -1; @@ -2451,9 +2457,9 @@ LibraryManager.library = { _scanString: function(format, get, unget, varargs) { if (!__scanString.whiteSpace) { __scanString.whiteSpace = {}; - __scanString.whiteSpace[' '.charCodeAt(0)] = 1; - __scanString.whiteSpace['\t'.charCodeAt(0)] = 1; - __scanString.whiteSpace['\n'.charCodeAt(0)] = 1; + __scanString.whiteSpace[{{{ charCode(' ') }}}] = 1; + __scanString.whiteSpace[{{{ charCode('\t') }}}] = 1; + __scanString.whiteSpace[{{{ charCode('\n') }}}] = 1; __scanString.whiteSpace[' '] = 1; __scanString.whiteSpace['\t'] = 1; __scanString.whiteSpace['\n'] = 1; @@ -2513,8 +2519,8 @@ LibraryManager.library = { if (format[formatIndex] === '%') { formatIndex++; var maxSpecifierStart = formatIndex; - while (format[formatIndex].charCodeAt(0) >= '0'.charCodeAt(0) && - format[formatIndex].charCodeAt(0) <= '9'.charCodeAt(0)) { + while (format[formatIndex].charCodeAt(0) >= {{{ charCode('0') }}} && + format[formatIndex].charCodeAt(0) <= {{{ charCode('9') }}}) { formatIndex++; } var max_; @@ -2560,11 +2566,11 @@ LibraryManager.library = { while ((curr < max_ || isNaN(max_)) && next > 0) { if (!(next in __scanString.whiteSpace) && // stop on whitespace (type == 's' || - ((type === 'd' || type == 'u' || type == 'i') && ((next >= '0'.charCodeAt(0) && next <= '9'.charCodeAt(0)) || - (first && next == '-'.charCodeAt(0)))) || - (type === 'x' && (next >= '0'.charCodeAt(0) && next <= '9'.charCodeAt(0) || - next >= 'a'.charCodeAt(0) && next <= 'f'.charCodeAt(0) || - next >= 'A'.charCodeAt(0) && next <= 'F'.charCodeAt(0)))) && + ((type === 'd' || type == 'u' || type == 'i') && ((next >= {{{ charCode('0') }}} && next <= {{{ charCode('9') }}}) || + (first && next == {{{ charCode('-') }}}))) || + (type === 'x' && (next >= {{{ charCode('0') }}} && next <= {{{ charCode('9') }}} || + next >= {{{ charCode('a') }}} && next <= {{{ charCode('f') }}} || + next >= {{{ charCode('A') }}} && next <= {{{ charCode('F') }}}))) && (formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up buffer.push(String.fromCharCode(next)); next = get(); @@ -2669,7 +2675,7 @@ LibraryManager.library = { curr = {{{ makeGetValue(0, 'textIndex', 'i8') }}}; if (curr === 0) break; next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}}; - if (curr == '%'.charCodeAt(0)) { + if (curr == {{{ charCode('%') }}}) { // Handle flags. var flagAlwaysSigned = false; var flagLeftAlign = false; @@ -2677,16 +2683,16 @@ LibraryManager.library = { var flagZeroPad = false; flagsLoop: while (1) { switch (next) { - case '+'.charCodeAt(0): + case {{{ charCode('+') }}}: flagAlwaysSigned = true; break; - case '-'.charCodeAt(0): + case {{{ charCode('-') }}}: flagLeftAlign = true; break; - case '#'.charCodeAt(0): + case {{{ charCode('#') }}}: flagAlternative = true; break; - case '0'.charCodeAt(0): + case {{{ charCode('0') }}}: if (flagZeroPad) { break flagsLoop; } else { @@ -2702,13 +2708,13 @@ LibraryManager.library = { // Handle width. var width = 0; - if (next == '*'.charCodeAt(0)) { + if (next == {{{ charCode('*') }}}) { width = getNextArg('i32'); textIndex++; next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}}; } else { - while (next >= '0'.charCodeAt(0) && next <= '9'.charCodeAt(0)) { - width = width * 10 + (next - '0'.charCodeAt(0)); + while (next >= {{{ charCode('0') }}} && next <= {{{ charCode('9') }}}) { + width = width * 10 + (next - {{{ charCode('0') }}}); textIndex++; next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}}; } @@ -2716,20 +2722,20 @@ LibraryManager.library = { // Handle precision. var precisionSet = false; - if (next == '.'.charCodeAt(0)) { + if (next == {{{ charCode('.') }}}) { var precision = 0; precisionSet = true; textIndex++; next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}}; - if (next == '*'.charCodeAt(0)) { + if (next == {{{ charCode('*') }}}) { precision = getNextArg('i32'); textIndex++; } else { while(1) { var precisionChr = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}}; - if (precisionChr < '0'.charCodeAt(0) || - precisionChr > '9'.charCodeAt(0)) break; - precision = precision * 10 + (precisionChr - '0'.charCodeAt(0)); + if (precisionChr < {{{ charCode('0') }}} || + precisionChr > {{{ charCode('9') }}}) break; + precision = precision * 10 + (precisionChr - {{{ charCode('0') }}}); textIndex++; } } @@ -2743,7 +2749,7 @@ LibraryManager.library = { switch (String.fromCharCode(next)) { case 'h': var nextNext = {{{ makeGetValue(0, 'textIndex+2', 'i8') }}}; - if (nextNext == 'h'.charCodeAt(0)) { + if (nextNext == {{{ charCode('h') }}}) { textIndex++; argSize = 1; // char (actually i32 in varargs) } else { @@ -2752,7 +2758,7 @@ LibraryManager.library = { break; case 'l': var nextNext = {{{ makeGetValue(0, 'textIndex+2', 'i8') }}}; - if (nextNext == 'l'.charCodeAt(0)) { + if (nextNext == {{{ charCode('l') }}}) { textIndex++; argSize = 8; // long long } else { @@ -2778,7 +2784,7 @@ LibraryManager.library = { // Handle type specifier. if (['d', 'i', 'u', 'o', 'x', 'X', 'p'].indexOf(String.fromCharCode(next)) != -1) { // Integer. - var signed = next == 'd'.charCodeAt(0) || next == 'i'.charCodeAt(0); + var signed = next == {{{ charCode('d') }}} || next == {{{ charCode('i') }}}; argSize = argSize || 4; var currArg = getNextArg('i' + (argSize * 8)); #if PRECISE_I64_MATH @@ -2788,7 +2794,7 @@ LibraryManager.library = { #if USE_TYPED_ARRAYS == 2 // Flatten i64-1 [low, high] into a (slightly rounded) double if (argSize == 8) { - currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 'u'.charCodeAt(0)); + currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == {{{ charCode('u') }}}); } #endif // Truncate to requested size. @@ -2799,20 +2805,20 @@ LibraryManager.library = { // Format the number. var currAbsArg = Math.abs(currArg); var prefix = ''; - if (next == 'd'.charCodeAt(0) || next == 'i'.charCodeAt(0)) { + if (next == {{{ charCode('d') }}} || next == {{{ charCode('i') }}}) { #if PRECISE_I64_MATH if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else #endif argText = reSign(currArg, 8 * argSize, 1).toString(10); - } else if (next == 'u'.charCodeAt(0)) { + } else if (next == {{{ charCode('u') }}}) { #if PRECISE_I64_MATH if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else #endif argText = unSign(currArg, 8 * argSize, 1).toString(10); currArg = Math.abs(currArg); - } else if (next == 'o'.charCodeAt(0)) { + } else if (next == {{{ charCode('o') }}}) { argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8); - } else if (next == 'x'.charCodeAt(0) || next == 'X'.charCodeAt(0)) { + } else if (next == {{{ charCode('x') }}} || next == {{{ charCode('X') }}}) { prefix = flagAlternative ? '0x' : ''; #if PRECISE_I64_MATH if (argSize == 8 && i64Math) argText = (origArg[1]>>>0).toString(16) + (origArg[0]>>>0).toString(16); else @@ -2830,11 +2836,11 @@ LibraryManager.library = { } else { argText = currAbsArg.toString(16); } - if (next == 'X'.charCodeAt(0)) { + if (next == {{{ charCode('X') }}}) { prefix = prefix.toUpperCase(); argText = argText.toUpperCase(); } - } else if (next == 'p'.charCodeAt(0)) { + } else if (next == {{{ charCode('p') }}}) { if (currAbsArg === 0) { argText = '(nil)'; } else { @@ -2892,27 +2898,27 @@ LibraryManager.library = { // Convert g/G to f/F or e/E, as per: // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html - if (next == 'g'.charCodeAt(0) || next == 'G'.charCodeAt(0)) { + if (next == {{{ charCode('g') }}} || next == {{{ charCode('G') }}}) { isGeneral = true; precision = precision || 1; var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10); if (precision > exponent && exponent >= -4) { - next = ((next == 'g'.charCodeAt(0)) ? 'f' : 'F').charCodeAt(0); + next = ((next == {{{ charCode('g') }}}) ? 'f' : 'F').charCodeAt(0); precision -= exponent + 1; } else { - next = ((next == 'g'.charCodeAt(0)) ? 'e' : 'E').charCodeAt(0); + next = ((next == {{{ charCode('g') }}}) ? 'e' : 'E').charCodeAt(0); precision--; } effectivePrecision = Math.min(precision, 20); } - if (next == 'e'.charCodeAt(0) || next == 'E'.charCodeAt(0)) { + if (next == {{{ charCode('e') }}} || next == {{{ charCode('E') }}}) { argText = currArg.toExponential(effectivePrecision); // Make sure the exponent has at least 2 digits. if (/[eE][-+]\d$/.test(argText)) { argText = argText.slice(0, -1) + '0' + argText.slice(-1); } - } else if (next == 'f'.charCodeAt(0) || next == 'F'.charCodeAt(0)) { + } else if (next == {{{ charCode('f') }}} || next == {{{ charCode('F') }}}) { argText = currArg.toFixed(effectivePrecision); } @@ -2932,7 +2938,7 @@ LibraryManager.library = { argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : ''); // Capitalize 'E' if needed. - if (next == 'E'.charCodeAt(0)) argText = argText.toUpperCase(); + if (next == {{{ charCode('E') }}}) argText = argText.toUpperCase(); // Add sign. if (flagAlwaysSigned && currArg >= 0) { @@ -2954,20 +2960,20 @@ LibraryManager.library = { } // Adjust case. - if (next < 'a'.charCodeAt(0)) argText = argText.toUpperCase(); + if (next < {{{ charCode('a') }}}) argText = argText.toUpperCase(); // Insert the result into the buffer. argText.split('').forEach(function(chr) { ret.push(chr.charCodeAt(0)); }); - } else if (next == 's'.charCodeAt(0)) { + } else if (next == {{{ charCode('s') }}}) { // String. var arg = getNextArg('i8*') || nullString; var argLength = _strlen(arg); if (precisionSet) argLength = Math.min(argLength, precision); if (!flagLeftAlign) { while (argLength < width--) { - ret.push(' '.charCodeAt(0)); + ret.push({{{ charCode(' ') }}}); } } for (var i = 0; i < argLength; i++) { @@ -2975,21 +2981,21 @@ LibraryManager.library = { } if (flagLeftAlign) { while (argLength < width--) { - ret.push(' '.charCodeAt(0)); + ret.push({{{ charCode(' ') }}}); } } - } else if (next == 'c'.charCodeAt(0)) { + } else if (next == {{{ charCode('c') }}}) { // Character. if (flagLeftAlign) ret.push(getNextArg('i8')); while (--width > 0) { - ret.push(' '.charCodeAt(0)); + ret.push({{{ charCode(' ') }}}); } if (!flagLeftAlign) ret.push(getNextArg('i8')); - } else if (next == 'n'.charCodeAt(0)) { + } else if (next == {{{ charCode('n') }}}) { // Write the length written so far to the next parameter. var ptr = getNextArg('i32*'); {{{ makeSetValue('ptr', '0', 'ret.length', 'i32') }}} - } else if (next == '%'.charCodeAt(0)) { + } else if (next == {{{ charCode('%') }}}) { // Literal percent sign. ret.push(curr); } else { @@ -3138,7 +3144,7 @@ LibraryManager.library = { var streamObj = FS.streams[stream]; if (streamObj.error || streamObj.eof) return 0; var byte_; - for (var i = 0; i < n - 1 && byte_ != '\n'.charCodeAt(0); i++) { + for (var i = 0; i < n - 1 && byte_ != {{{ charCode('\n') }}}; i++) { byte_ = _fgetc(stream); if (byte_ == -1) { if (streamObj.error) return 0; @@ -3244,7 +3250,7 @@ LibraryManager.library = { if (ret < 0) { return ret; } else { - var newlineRet = _fputc('\n'.charCodeAt(0), stdout); + var newlineRet = _fputc({{{ charCode('\n') }}}, stdout); return (newlineRet < 0) ? -1 : ret + 1; } }, @@ -3370,8 +3376,8 @@ LibraryManager.library = { var stdout = {{{ makeGetValue(makeGlobalUse('_stdout'), '0', 'void*') }}}; if (s) { _fputs(s, stdout); - _fputc(':'.charCodeAt(0), stdout); - _fputc(' '.charCodeAt(0), stdout); + _fputc({{{ charCode(':') }}}, stdout); + _fputc({{{ charCode(' ') }}}, stdout); } var errnum = {{{ makeGetValue('___errno_location()', '0', 'i32') }}}; _puts(_strerror(errnum)); @@ -3669,6 +3675,17 @@ LibraryManager.library = { abs: 'Math.abs', labs: 'Math.abs', +#if USE_TYPED_ARRAYS == 2 + llabs__deps: [function() { Types.preciseI64MathUsed = 1 }], + llabs: function(lo, hi) { + i64Math.abs(lo, hi); + {{{ makeStructuralReturn([makeGetTempDouble(0, 'i32'), makeGetTempDouble(1, 'i32')]) }}}; + }, +#else + llabs: function(lo, hi) { + throw 'unsupported llabs'; + }, +#endif exit__deps: ['_exit'], exit: function(status) { @@ -3726,93 +3743,6 @@ LibraryManager.library = { return ret; }, - strtod__deps: ['isspace', 'isdigit'], - strtod: function(str, endptr) { - var origin = str; - - // Skip space. - while (_isspace({{{ makeGetValue('str', 0, 'i8') }}})) str++; - - // Check for a plus/minus sign. - var multiplier = 1; - if ({{{ makeGetValue('str', 0, 'i8') }}} == '-'.charCodeAt(0)) { - multiplier = -1; - str++; - } else if ({{{ makeGetValue('str', 0, 'i8') }}} == '+'.charCodeAt(0)) { - str++; - } - - var chr; - var ret = 0; - - // Get whole part. - var whole = false; - while(1) { - chr = {{{ makeGetValue('str', 0, 'i8') }}}; - if (!_isdigit(chr)) break; - whole = true; - ret = ret*10 + chr - '0'.charCodeAt(0); - str++; - } - - // Get fractional part. - var fraction = false; - if ({{{ makeGetValue('str', 0, 'i8') }}} == '.'.charCodeAt(0)) { - str++; - var mul = 1/10; - while(1) { - chr = {{{ makeGetValue('str', 0, 'i8') }}}; - if (!_isdigit(chr)) break; - fraction = true; - ret += mul*(chr - '0'.charCodeAt(0)); - mul /= 10; - str++; - } - } - - if (!whole && !fraction) { - if (endptr) { - {{{ makeSetValue('endptr', 0, 'origin', '*') }}} - } - return 0; - } - - // Get exponent part. - chr = {{{ makeGetValue('str', 0, 'i8') }}}; - if (chr == 'e'.charCodeAt(0) || chr == 'E'.charCodeAt(0)) { - str++; - var exponent = 0; - var expNegative = false; - chr = {{{ makeGetValue('str', 0, 'i8') }}}; - if (chr == '-'.charCodeAt(0)) { - expNegative = true; - str++; - } else if (chr == '+'.charCodeAt(0)) { - str++; - } - chr = {{{ makeGetValue('str', 0, 'i8') }}}; - while(1) { - if (!_isdigit(chr)) break; - exponent = exponent*10 + chr - '0'.charCodeAt(0); - str++; - chr = {{{ makeGetValue('str', 0, 'i8') }}}; - } - if (expNegative) exponent = -exponent; - ret *= Math.pow(10, exponent); - } - - // Set end pointer. - if (endptr) { - {{{ makeSetValue('endptr', 0, 'str', '*') }}} - } - - return ret * multiplier; - }, - strtod_l: 'strtod', // no locale support yet - strtold: 'strtod', // XXX add real support for long double - strtold_l: 'strtold', // no locale support yet - strtof: 'strtod', // use stdtod to handle strtof - _parseInt__deps: ['isspace', '__setErrNo', '$ERRNO_CODES'], _parseInt: function(str, endptr, base, min, max, bits, unsign) { // Skip space. @@ -3820,19 +3750,19 @@ LibraryManager.library = { // Check for a plus/minus sign. var multiplier = 1; - if ({{{ makeGetValue('str', 0, 'i8') }}} == '-'.charCodeAt(0)) { + if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('-') }}}) { multiplier = -1; str++; - } else if ({{{ makeGetValue('str', 0, 'i8') }}} == '+'.charCodeAt(0)) { + } else if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('+') }}}) { str++; } // Find base. var finalBase = base; if (!finalBase) { - if ({{{ makeGetValue('str', 0, 'i8') }}} == '0'.charCodeAt(0)) { - if ({{{ makeGetValue('str+1', 0, 'i8') }}} == 'x'.charCodeAt(0) || - {{{ makeGetValue('str+1', 0, 'i8') }}} == 'X'.charCodeAt(0)) { + if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('0') }}}) { + if ({{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('x') }}} || + {{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('X') }}}) { finalBase = 16; str += 2; } else { @@ -3896,9 +3826,9 @@ LibraryManager.library = { while (_isspace({{{ makeGetValue('str', 0, 'i8') }}})) str++; // Check for a plus/minus sign. - if ({{{ makeGetValue('str', 0, 'i8') }}} == '-'.charCodeAt(0)) { + if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('-') }}}) { str++; - } else if ({{{ makeGetValue('str', 0, 'i8') }}} == '+'.charCodeAt(0)) { + } else if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('+') }}}) { str++; } @@ -3906,9 +3836,9 @@ LibraryManager.library = { var ok = false; var finalBase = base; if (!finalBase) { - if ({{{ makeGetValue('str', 0, 'i8') }}} == '0'.charCodeAt(0)) { - if ({{{ makeGetValue('str+1', 0, 'i8') }}} == 'x'.charCodeAt(0) || - {{{ makeGetValue('str+1', 0, 'i8') }}} == 'X'.charCodeAt(0)) { + if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('0') }}}) { + if ({{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('x') }}} || + {{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('X') }}}) { finalBase = 16; str += 2; } else { @@ -3971,11 +3901,6 @@ LibraryManager.library = { }, strtoull_l: 'strtoull', // no locale support yet - atof__deps: ['strtod'], - atof: function(ptr) { - return _strtod(ptr, null); - }, - atoi__deps: ['strtol'], atoi: function(ptr) { return _strtol(ptr, null, 10); @@ -4235,13 +4160,15 @@ LibraryManager.library = { memcpy__inline: function (dest, src, num, align) { var ret = ''; #if ASSERTIONS +#if ASM_JS == 0 ret += "assert(" + num + " % 1 === 0);"; //, 'memcpy given ' + " + num + " + ' bytes to copy. Problem with quantum=1 corrections perhaps?');"; #endif +#endif ret += makeCopyValues(dest, src, num, 'null', null, align); return ret; }, - memcpy__asm: 'true', + memcpy__asm: true, memcpy__sig: 'iiii', memcpy: function (dest, src, num) { dest = dest|0; src = src|0; num = num|0; @@ -4314,7 +4241,7 @@ LibraryManager.library = { ptr = ptr|0; value = value|0; num = num|0; var stop = 0, value4 = 0, stop4 = 0, unaligned = 0; stop = (ptr + num)|0; - if ((num|0) >= {{{ SEEK_OPTIMAL_ALIGN_MIN }}}) { + if ((num|0) >= {{{ Math.round(2.5*UNROLL_LOOP_MAX) }}}) { // This is unaligned, but quite large, so work hard to get to aligned settings value = value & 0xff; unaligned = ptr & 3; @@ -4402,14 +4329,18 @@ LibraryManager.library = { } }, + strcpy__asm: true, + strcpy__sig: 'iii', strcpy: function(pdest, psrc) { + pdest = pdest|0; psrc = psrc|0; var i = 0; do { - {{{ makeCopyValues('pdest+i', 'psrc+i', 1, 'i8', null, 1) }}}; - i ++; - } while ({{{ makeGetValue('psrc', 'i-1', 'i8') }}} != 0); - return pdest; + {{{ makeCopyValues('(pdest+i)|0', '(psrc+i)|0', 1, 'i8', null, 1) }}}; + i = (i+1)|0; + } while (({{{ makeGetValue('psrc', 'i-1', 'i8') }}})|0 != 0); + return pdest|0; }, + stpcpy: function(pdest, psrc) { var i = 0; do { @@ -4419,14 +4350,18 @@ LibraryManager.library = { return pdest + i - 1; }, + strncpy__asm: true, + strncpy__sig: 'iiii', strncpy: function(pdest, psrc, num) { - var padding = false, curr; - for (var i = 0; i < num; i++) { - curr = padding ? 0 : {{{ makeGetValue('psrc', 'i', 'i8') }}}; + pdest = pdest|0; psrc = psrc|0; num = num|0; + var padding = 0, curr = 0, i = 0; + while ((i|0) < (num|0)) { + curr = padding ? 0 : {{{ makeGetValueAsm('psrc', 'i', 'i8') }}}; {{{ makeSetValue('pdest', 'i', 'curr', 'i8') }}} - padding = padding || {{{ makeGetValue('psrc', 'i', 'i8') }}} == 0; + padding = padding ? 1 : ({{{ makeGetValueAsm('psrc', 'i', 'i8') }}} == 0); + i = (i+1)|0; } - return pdest; + return pdest|0; }, strlwr__deps:['tolower'], @@ -4451,15 +4386,18 @@ LibraryManager.library = { } }, + strcat__asm: true, + strcat__sig: 'iii', strcat__deps: ['strlen'], strcat: function(pdest, psrc) { - var len = _strlen(pdest); + pdest = pdest|0; psrc = psrc|0; var i = 0; + pdest = (pdest + _strlen(pdest))|0; do { - {{{ makeCopyValues('pdest+len+i', 'psrc+i', 1, 'i8', null, 1) }}}; - i ++; - } while ({{{ makeGetValue('psrc', 'i-1', 'i8') }}} != 0); - return pdest; + {{{ makeCopyValues('pdest+i', 'psrc+i', 1, 'i8', null, 1) }}}; + i = (i+1)|0; + } while ({{{ makeGetValueAsm('psrc', 'i-1', 'i8') }}} != 0); + return pdest|0; }, strncat__deps: ['strlen'], @@ -4485,9 +4423,12 @@ LibraryManager.library = { // We always assume ASCII locale. strcoll: 'strcmp', + strcasecmp__asm: true, + strcasecmp__sig: 'iii', strcasecmp__deps: ['strncasecmp'], strcasecmp: function(px, py) { - return _strncasecmp(px, py, TOTAL_MEMORY); + px = px|0; py = py|0; + return _strncasecmp(px, py, -1)|0; }, strncmp: function(px, py, n) { @@ -4508,26 +4449,29 @@ LibraryManager.library = { return 0; }, + strncasecmp__asm: true, + strncasecmp__sig: 'iiii', strncasecmp__deps: ['tolower'], strncasecmp: function(px, py, n) { - var i = 0; - while (i < n) { - var x = _tolower({{{ makeGetValue('px', 'i', 'i8', 0, 1) }}}); - var y = _tolower({{{ makeGetValue('py', 'i', 'i8', 0, 1) }}}); - if (x == y && x == 0) return 0; - if (x == 0) return -1; - if (y == 0) return 1; - if (x == y) { - i ++; + px = px|0; py = py|0; n = n|0; + var i = 0, x = 0, y = 0; + while ((i>>>0) < (n>>>0)) { + x = _tolower({{{ makeGetValueAsm('px', 'i', 'i8', 0, 1) }}}); + y = _tolower({{{ makeGetValueAsm('py', 'i', 'i8', 0, 1) }}}); + if (((x|0) == (y|0)) & ((x|0) == 0)) return 0; + if ((x|0) == 0) return -1; + if ((y|0) == 0) return 1; + if ((x|0) == (y|0)) { + i = (i + 1)|0; continue; } else { - return x > y ? 1 : -1; + return ((x>>>0) > (y>>>0) ? 1 : -1)|0; } } return 0; }, - memcmp__asm: 'true', + memcmp__asm: true, memcmp__sig: 'iiii', memcmp: function(p1, p2, num) { p1 = p1|0; p2 = p2|0; num = num|0; @@ -4729,58 +4673,61 @@ LibraryManager.library = { return chr & 0x7F; }, toupper: function(chr) { - if (chr >= 'a'.charCodeAt(0) && chr <= 'z'.charCodeAt(0)) { - return chr - 'a'.charCodeAt(0) + 'A'.charCodeAt(0); + if (chr >= {{{ charCode('a') }}} && chr <= {{{ charCode('z') }}}) { + return chr - {{{ charCode('a') }}} + {{{ charCode('A') }}}; } else { return chr; } }, _toupper: 'toupper', + + tolower__asm: true, + tolower__sig: 'ii', tolower: function(chr) { - if (chr >= 'A'.charCodeAt(0) && chr <= 'Z'.charCodeAt(0)) { - return chr - 'A'.charCodeAt(0) + 'a'.charCodeAt(0); - } else { - return chr; - } + chr = chr|0; + if ((chr|0) < {{{ charCode('A') }}}) return chr|0; + if ((chr|0) > {{{ charCode('Z') }}}) return chr|0; + return (chr - {{{ charCode('A') }}} + {{{ charCode('a') }}})|0; }, _tolower: 'tolower', + // The following functions are defined as macros in glibc. islower: function(chr) { - return chr >= 'a'.charCodeAt(0) && chr <= 'z'.charCodeAt(0); + return chr >= {{{ charCode('a') }}} && chr <= {{{ charCode('z') }}}; }, isupper: function(chr) { - return chr >= 'A'.charCodeAt(0) && chr <= 'Z'.charCodeAt(0); + return chr >= {{{ charCode('A') }}} && chr <= {{{ charCode('Z') }}}; }, isalpha: function(chr) { - return (chr >= 'a'.charCodeAt(0) && chr <= 'z'.charCodeAt(0)) || - (chr >= 'A'.charCodeAt(0) && chr <= 'Z'.charCodeAt(0)); + return (chr >= {{{ charCode('a') }}} && chr <= {{{ charCode('z') }}}) || + (chr >= {{{ charCode('A') }}} && chr <= {{{ charCode('Z') }}}); }, isdigit: function(chr) { - return chr >= '0'.charCodeAt(0) && chr <= '9'.charCodeAt(0); + return chr >= {{{ charCode('0') }}} && chr <= {{{ charCode('9') }}}; }, isdigit_l: 'isdigit', // no locale support yet isxdigit: function(chr) { - return (chr >= '0'.charCodeAt(0) && chr <= '9'.charCodeAt(0)) || - (chr >= 'a'.charCodeAt(0) && chr <= 'f'.charCodeAt(0)) || - (chr >= 'A'.charCodeAt(0) && chr <= 'F'.charCodeAt(0)); + return (chr >= {{{ charCode('0') }}} && chr <= {{{ charCode('9') }}}) || + (chr >= {{{ charCode('a') }}} && chr <= {{{ charCode('f') }}}) || + (chr >= {{{ charCode('A') }}} && chr <= {{{ charCode('F') }}}); }, isxdigit_l: 'isxdigit', // no locale support yet isalnum: function(chr) { - return (chr >= '0'.charCodeAt(0) && chr <= '9'.charCodeAt(0)) || - (chr >= 'a'.charCodeAt(0) && chr <= 'z'.charCodeAt(0)) || - (chr >= 'A'.charCodeAt(0) && chr <= 'Z'.charCodeAt(0)); + return (chr >= {{{ charCode('0') }}} && chr <= {{{ charCode('9') }}}) || + (chr >= {{{ charCode('a') }}} && chr <= {{{ charCode('z') }}}) || + (chr >= {{{ charCode('A') }}} && chr <= {{{ charCode('Z') }}}); }, ispunct: function(chr) { - return (chr >= '!'.charCodeAt(0) && chr <= '/'.charCodeAt(0)) || - (chr >= ':'.charCodeAt(0) && chr <= '@'.charCodeAt(0)) || - (chr >= '['.charCodeAt(0) && chr <= '`'.charCodeAt(0)) || - (chr >= '{'.charCodeAt(0) && chr <= '~'.charCodeAt(0)); + return (chr >= {{{ charCode('!') }}} && chr <= {{{ charCode('/') }}}) || + (chr >= {{{ charCode(':') }}} && chr <= {{{ charCode('@') }}}) || + (chr >= {{{ charCode('[') }}} && chr <= {{{ charCode('`') }}}) || + (chr >= {{{ charCode('{') }}} && chr <= {{{ charCode('~') }}}); }, isspace: function(chr) { return chr in { 32: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0 }; }, isblank: function(chr) { - return chr == ' '.charCodeAt(0) || chr == '\t'.charCodeAt(0); + return chr == {{{ charCode(' ') }}} || chr == {{{ charCode('\t') }}}; }, iscntrl: function(chr) { return (0 <= chr && chr <= 0x1F) || chr === 0x7F; @@ -4976,6 +4923,20 @@ LibraryManager.library = { #endif }, + llvm_ctpop_i32: function(x) { + var ret = 0; + while (x) { + if (x&1) ret++; + x >>= 1; + } + return ret; + }, + + llvm_ctpop_i64__deps: ['llvm_ctpop_i32'], + llvm_ctpop_i64: function(l, h) { + return _llvm_ctpop_i32(l) + _llvm_ctpop_i32(h); + }, + llvm_trap: function() { throw 'trap! ' + new Error().stack; }, @@ -5270,13 +5231,6 @@ LibraryManager.library = { {{{ makeStructuralReturn(['(x*y)>>>0', 'x*y > 4294967295']) }}}; }, - llvm_uadd_with_overflow_i64__deps: [function() { Types.preciseI64MathUsed = 1 }], - llvm_uadd_with_overflow_i64: function(xl, xh, yl, yh) { - i64Math.add(xl, xh, yl, yh); - {{{ makeStructuralReturn([makeGetTempDouble(0, 'i32'), makeGetTempDouble(1, 'i32'), '0']) }}}; - // XXX Need to hack support for second param in long.js - }, - llvm_umul_with_overflow_i64__deps: [function() { Types.preciseI64MathUsed = 1 }], llvm_umul_with_overflow_i64: function(xl, xh, yl, yh) { i64Math.multiply(xl, xh, yl, yh); @@ -5506,6 +5460,14 @@ LibraryManager.library = { return -a; }, copysignf: 'copysign', + __signbit__deps: ['copysign'], + __signbit: function(x) { + // We implement using copysign so that we get support + // for negative zero (once copysign supports that). + return _copysign(1.0, x) < 0; + }, + __signbitf: '__signbit', + __signbitd: '__signbit', hypot: function(a, b) { return Math.sqrt(a*a + b*b); }, @@ -6064,6 +6026,15 @@ LibraryManager.library = { __timespec_struct_layout: Runtime.generateStructInfo([ ['i32', 'tv_sec'], ['i32', 'tv_nsec']]), + nanosleep__deps: ['usleep', '__timespec_struct_layout'], + nanosleep: function(rqtp, rmtp) { + // int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); + var seconds = {{{ makeGetValue('rqtp', '___timespec_struct_layout.tv_sec', 'i32') }}}; + var nanoseconds = {{{ makeGetValue('rqtp', '___timespec_struct_layout.tv_nsec', 'i32') }}}; + {{{ makeSetValue('rmtp', '___timespec_struct_layout.tv_sec', '0', 'i32') }}} + {{{ makeSetValue('rmtp', '___timespec_struct_layout.tv_nsec', '0', 'i32') }}} + return _usleep((seconds * 1e6) + (nanoseconds / 1000)); + }, // TODO: Implement these for real. clock_gettime__deps: ['__timespec_struct_layout'], clock_gettime: function(clk_id, tp) { @@ -6170,7 +6141,7 @@ LibraryManager.library = { setjmp__inline: function(env) { // Save the label - return '(tempInt = setjmpId++, mySetjmpIds[tempInt] = 1, setjmpLabels[tempInt] = label,' + makeSetValue(env, '0', 'tempInt', 'i32') + ', 0)'; + return '(tempInt = setjmpId++, mySetjmpIds[tempInt] = 1, setjmpLabels[tempInt] = label,' + makeSetValue(env, '0', 'tempInt', 'i32', undefined, undefined, undefined, undefined, ',') + ', 0)'; }, longjmp: function(env, value) { @@ -6693,6 +6664,13 @@ LibraryManager.library = { }, // ========================================================================== + // sched.h (stubs only - no thread support yet!) + // ========================================================================== + sched_yield: function() { + return 0; + }, + + // ========================================================================== // pthread.h (stubs for mutexes only - no thread support yet!) // ========================================================================== @@ -6708,8 +6686,15 @@ LibraryManager.library = { }, pthread_cond_init: function() {}, pthread_cond_destroy: function() {}, - pthread_cond_broadcast: function() {}, - pthread_cond_wait: function() {}, + pthread_cond_broadcast: function() { + return 0; + }, + pthread_cond_wait: function() { + return 0; + }, + pthread_cond_timedwait: function() { + return 0; + }, pthread_self: function() { //FIXME: assumes only a single thread return 0; @@ -7385,6 +7370,81 @@ LibraryManager.library = { Module.print(intArrayToString(__formatString(_emscripten_jcache_printf_.buffer, varargs + i*4)).replace('\\n', '')); Runtime.stackAlloc(-4*i); // free up the stack space we know is ok to free }, + + //============================ + // i64 math + //============================ + + i64Add__asm: true, + i64Add__sig: 'iiiii', + i64Add: function(a, b, c, d) { + /* + x = a + b*2^32 + y = c + d*2^32 + result = l + h*2^32 + */ + a = a|0; b = b|0; c = c|0; d = d|0; + var l = 0, h = 0; + l = (a + c)>>>0; + h = (b + d)>>>0; + if ((l>>>0) < (a>>>0)) { // iff we overflowed + h = (h+1)>>>0; + } + {{{ makeStructuralReturn(['l|0', 'h'], true) }}}; + }, + llvm_uadd_with_overflow_i64__asm: true, + llvm_uadd_with_overflow_i64__sig: 'iiiii', + llvm_uadd_with_overflow_i64: function(a, b, c, d) { + a = a|0; b = b|0; c = c|0; d = d|0; + var l = 0, h = 0, overflow = 0; + l = (a + c)>>>0; + h = (b + d)>>>0; + if ((l>>>0) < (a>>>0)) { // iff we overflowed + h = (h+1)>>>0; + overflow = 1; + } + {{{ makeStructuralReturn(['l|0', 'h', 'overflow'], true) }}}; + }, + + bitshift64Shl__asm: true, + bitshift64Shl__sig: 'iiii', + bitshift64Shl: function(low, high, bits) { + low = low|0; high = high|0; bits = bits|0; + var ander = 0; + if ((bits|0) < 32) { + ander = ((1 << bits) - 1)|0; + tempRet0 = (high << bits) | ((low&(ander << (32 - bits))) >>> (32 - bits)); + return low << bits; + } + tempRet0 = low << (bits - 32); + return 0; + }, + bitshift64Ashr__asm: true, + bitshift64Ashr__sig: 'iiii', + bitshift64Ashr: function(low, high, bits) { + low = low|0; high = high|0; bits = bits|0; + var ander = 0; + if ((bits|0) < 32) { + ander = ((1 << bits) - 1)|0; + tempRet0 = high >> bits; + return (low >>> bits) | ((high&ander) << (32 - bits)); + } + tempRet0 = (high|0) < 0 ? -1 : 0; + return (high >> (bits - 32))|0; + }, + bitshift64Lshr__asm: true, + bitshift64Lshr__sig: 'iiii', + bitshift64Lshr: function(low, high, bits) { + low = low|0; high = high|0; bits = bits|0; + var ander = 0; + if ((bits|0) < 32) { + ander = ((1 << bits) - 1)|0; + tempRet0 = high >>> bits; + return (low >>> bits) | ((high&ander) << (32 - bits)); + } + tempRet0 = 0; + return (high >>> (bits - 32))|0; + }, }; function autoAddDeps(object, name) { @@ -7396,3 +7456,4 @@ function autoAddDeps(object, name) { } } + diff --git a/src/library_browser.js b/src/library_browser.js index 5b19a360..bdd94bac 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -3,7 +3,7 @@ // Utilities for browser environments mergeInto(LibraryManager.library, { - $Browser__postset: 'Module["requestFullScreen"] = function() { Browser.requestFullScreen() };\n' + // exports + $Browser__postset: 'Module["requestFullScreen"] = function(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n' + // exports 'Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };\n' + 'Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };\n' + 'Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };\n', @@ -40,6 +40,7 @@ mergeInto(LibraryManager.library, { } } }, + isFullScreen: false, pointerLock: false, moduleContextCreatedCallbacks: [], workers: [], @@ -205,10 +206,10 @@ mergeInto(LibraryManager.library, { try { if (useWebGL) { ctx = canvas.getContext('experimental-webgl', { - alpha: false, #if GL_TESTING - preserveDrawingBuffer: true + preserveDrawingBuffer: true, #endif + alpha: false }); } else { ctx = canvas.getContext('2d'); @@ -273,36 +274,60 @@ mergeInto(LibraryManager.library, { } return ctx; }, + destroyContext: function(canvas, useWebGL, setInModule) {}, - requestFullScreen: function() { + + fullScreenHandlersInstalled: false, + lockPointer: undefined, + resizeCanvas: undefined, + requestFullScreen: function(lockPointer, resizeCanvas) { + this.lockPointer = lockPointer; + this.resizeCanvas = resizeCanvas; + if (typeof this.lockPointer === 'undefined') this.lockPointer = true; + if (typeof this.resizeCanvas === 'undefined') this.resizeCanvas = false; + var canvas = Module['canvas']; function fullScreenChange() { - var isFullScreen = false; + Browser.isFullScreen = false; if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] || document['mozFullScreenElement'] || document['mozFullscreenElement'] || document['fullScreenElement'] || document['fullscreenElement']) === canvas) { canvas.requestPointerLock = canvas['requestPointerLock'] || canvas['mozRequestPointerLock'] || canvas['webkitRequestPointerLock']; - canvas.requestPointerLock(); - isFullScreen = true; + canvas.exitPointerLock = document['exitPointerLock'] || + document['mozExitPointerLock'] || + document['webkitExitPointerLock']; + canvas.exitPointerLock = canvas.exitPointerLock.bind(document); + canvas.cancelFullScreen = document['cancelFullScreen'] || + document['mozCancelFullScreen'] || + document['webkitCancelFullScreen']; + canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document); + if (Browser.lockPointer) canvas.requestPointerLock(); + Browser.isFullScreen = true; + if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize(); + } else if (Browser.resizeCanvas){ + Browser.setWindowedCanvasSize(); } - if (Module['onFullScreen']) Module['onFullScreen'](isFullScreen); + if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen); } - document.addEventListener('fullscreenchange', fullScreenChange, false); - document.addEventListener('mozfullscreenchange', fullScreenChange, false); - document.addEventListener('webkitfullscreenchange', fullScreenChange, false); - function pointerLockChange() { Browser.pointerLock = document['pointerLockElement'] === canvas || document['mozPointerLockElement'] === canvas || document['webkitPointerLockElement'] === canvas; } - document.addEventListener('pointerlockchange', pointerLockChange, false); - document.addEventListener('mozpointerlockchange', pointerLockChange, false); - document.addEventListener('webkitpointerlockchange', pointerLockChange, false); + if (!this.fullScreenHandlersInstalled) { + this.fullScreenHandlersInstalled = true; + document.addEventListener('fullscreenchange', fullScreenChange, false); + document.addEventListener('mozfullscreenchange', fullScreenChange, false); + document.addEventListener('webkitfullscreenchange', fullScreenChange, false); + + document.addEventListener('pointerlockchange', pointerLockChange, false); + document.addEventListener('mozpointerlockchange', pointerLockChange, false); + document.addEventListener('webkitpointerlockchange', pointerLockChange, false); + } canvas.requestFullScreen = canvas['requestFullScreen'] || canvas['mozRequestFullScreen'] || @@ -380,7 +405,32 @@ mergeInto(LibraryManager.library, { canvas.width = width; canvas.height = height; if (!noUpdates) Browser.updateResizeListeners(); + }, + + windowedWidth: 0, + windowedHeight: 0, + setFullScreenCanvasSize: function() { + var canvas = Module['canvas']; + this.windowedWidth = canvas.width; + this.windowedHeight = canvas.height; + canvas.width = screen.width; + canvas.height = screen.height; + var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}}; + flags = flags | 0x00800000; // set SDL_FULLSCREEN flag + {{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}} + Browser.updateResizeListeners(); + }, + + setWindowedCanvasSize: function() { + var canvas = Module['canvas']; + canvas.width = this.windowedWidth; + canvas.height = this.windowedHeight; + var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}}; + flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag + {{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}} + Browser.updateResizeListeners(); } + }, emscripten_async_wget: function(url, file, onload, onerror) { diff --git a/src/library_gl.js b/src/library_gl.js index 4977d2e9..9e12e4ee 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -21,7 +21,6 @@ var LibraryGL = { #if FULL_ES2 clientBuffers: [], - enabledClientBuffers: [], #endif currArrayBuffer: 0, currElementArrayBuffer: 0, @@ -59,6 +58,65 @@ var LibraryGL = { return ret; }, + // Temporary buffers + MAX_TEMP_BUFFER_SIZE: {{{ GL_MAX_TEMP_BUFFER_SIZE }}}, + tempBufferIndexLookup: null, + tempVertexBuffers: null, + tempIndexBuffers: null, + tempQuadIndexBuffer: null, + + generateTempBuffers: function(quads) { + this.tempBufferIndexLookup = new Uint8Array(this.MAX_TEMP_BUFFER_SIZE+1); + this.tempVertexBuffers = []; + this.tempIndexBuffers = []; + var last = -1, curr = -1; + var size = 1; + for (var i = 0; i <= this.MAX_TEMP_BUFFER_SIZE; i++) { + if (i > size) { + size <<= 1; + } + if (size != last) { + curr++; + this.tempVertexBuffers[curr] = Module.ctx.createBuffer(); + Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, this.tempVertexBuffers[curr]); + Module.ctx.bufferData(Module.ctx.ARRAY_BUFFER, size, Module.ctx.DYNAMIC_DRAW); + Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, null); + this.tempIndexBuffers[curr] = Module.ctx.createBuffer(); + Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, this.tempIndexBuffers[curr]); + Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER, size, Module.ctx.DYNAMIC_DRAW); + Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, null); + last = size; + } + this.tempBufferIndexLookup[i] = curr; + } + + if (quads) { + // GL_QUAD indexes can be precalculated + this.tempQuadIndexBuffer = Module.ctx.createBuffer(); + Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, this.tempQuadIndexBuffer); + var numIndexes = this.MAX_TEMP_BUFFER_SIZE >> 1; + var quadIndexes = new Uint16Array(numIndexes); + var i = 0, v = 0; + while (1) { + quadIndexes[i++] = v; + if (i >= numIndexes) break; + quadIndexes[i++] = v+1; + if (i >= numIndexes) break; + quadIndexes[i++] = v+2; + if (i >= numIndexes) break; + quadIndexes[i++] = v; + if (i >= numIndexes) break; + quadIndexes[i++] = v+2; + if (i >= numIndexes) break; + quadIndexes[i++] = v+3; + if (i >= numIndexes) break; + v += 4; + } + Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER, quadIndexes, Module.ctx.STATIC_DRAW); + Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, null); + } + }, + // Linear lookup in one of the tables (buffers, programs, etc.). TODO: consider using a weakmap to make this faster, if it matters scan: function(table, object) { for (var item in table) { @@ -207,20 +265,35 @@ var LibraryGL = { return size * typeSize * count; }, + usedTempBuffers: [], + preDrawHandleClientVertexAttribBindings: function(count) { GL.resetBufferBinding = false; + + var used = GL.usedTempBuffers; + used.length = 0; + + // TODO: initial pass to detect ranges we need to upload, might not need an upload per attrib for (var i = 0; i < GL.maxVertexAttribs; ++i) { - if (!GL.enabledClientBuffers[i] || !GL.clientBuffers[i]) continue; - - GL.resetBufferBinding = true; - var cb = GL.clientBuffers[i]; - - var buf = Module.ctx.createBuffer(); + if (!cb.clientside || !cb.enabled) continue; + + GL.resetBufferBinding = true; + + var size = GL.calcBufLength(cb.size, cb.type, cb.stride, count); + var index = GL.tempBufferIndexLookup[size]; + var buf; + do { +#if ASSERTIONS + assert(index < GL.tempVertexBuffers.length); +#endif + buf = GL.tempVertexBuffers[index++]; + } while (used.indexOf(buf) >= 0); + used.push(buf); Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, buf); - Module.ctx.bufferData(Module.ctx.ARRAY_BUFFER, - HEAPU8.subarray(cb.ptr, cb.ptr + GL.calcBufLength(cb.size, cb.type, cb.stride, count)), - Module.ctx.DYNAMIC_DRAW); + Module.ctx.bufferSubData(Module.ctx.ARRAY_BUFFER, + 0, + HEAPU8.subarray(cb.ptr, cb.ptr + size)); Module.ctx.vertexAttribPointer(i, cb.size, cb.type, cb.normalized, cb.stride, 0); } }, @@ -239,6 +312,13 @@ var LibraryGL = { if (!Module.useWebGL) return; // an app might link both gl and 2d backends GL.maxVertexAttribs = Module.ctx.getParameter(Module.ctx.MAX_VERTEX_ATTRIBS); +#if FULL_ES2 + for (var i = 0; i < GL.maxVertexAttribs; i++) { + GL.clientBuffers[i] = { enabled: false, clientside: false, size: 0, type: 0, normalized: 0, stride: 0, ptr: 0 }; + } + + GL.generateTempBuffers(); +#endif GL.compressionExt = Module.ctx.getExtension('WEBGL_compressed_texture_s3tc') || Module.ctx.getExtension('MOZ_WEBGL_compressed_texture_s3tc') || @@ -612,7 +692,7 @@ var LibraryGL = { glGetVertexAttribfv: function(index, pname, params) { #if FULL_ES2 - if (GL.clientBuffers[index]) { + if (GL.clientBuffers[index].enabled) { Module.printErr("glGetVertexAttribfv on client-side array: not supported, bad data returned"); } #endif @@ -628,7 +708,7 @@ var LibraryGL = { glGetVertexAttribiv: function(index, pname, params) { #if FULL_ES2 - if (GL.clientBuffers[index]) { + if (GL.clientBuffers[index].enabled) { Module.printErr("glGetVertexAttribiv on client-side array: not supported, bad data returned"); } #endif @@ -644,7 +724,7 @@ var LibraryGL = { glGetVertexAttribPointerv: function(index, pname, pointer) { #if FULL_ES2 - if (GL.clientBuffers[index]) { + if (GL.clientBuffers[index].enabled) { Module.printErr("glGetVertexAttribPointer on client-side array: not supported, bad data returned"); } #endif @@ -1693,62 +1773,6 @@ var LibraryGL = { this.modifiedClientAttributes = true; }, - // Temporary buffers - MAX_TEMP_BUFFER_SIZE: {{{ GL_MAX_TEMP_BUFFER_SIZE }}}, - tempBufferIndexLookup: null, - tempVertexBuffers: null, - tempIndexBuffers: null, - tempQuadIndexBuffer: null, - - generateTempBuffers: function() { - this.tempBufferIndexLookup = new Uint8Array(this.MAX_TEMP_BUFFER_SIZE+1); - this.tempVertexBuffers = []; - this.tempIndexBuffers = []; - var last = -1, curr = -1; - var size = 1; - for (var i = 0; i <= this.MAX_TEMP_BUFFER_SIZE; i++) { - if (i > size) { - size <<= 1; - } - if (size != last) { - curr++; - this.tempVertexBuffers[curr] = Module.ctx.createBuffer(); - Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, this.tempVertexBuffers[curr]); - Module.ctx.bufferData(Module.ctx.ARRAY_BUFFER, size, Module.ctx.DYNAMIC_DRAW); - Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, null); - this.tempIndexBuffers[curr] = Module.ctx.createBuffer(); - Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, this.tempIndexBuffers[curr]); - Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER, size, Module.ctx.DYNAMIC_DRAW); - Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, null); - last = size; - } - this.tempBufferIndexLookup[i] = curr; - } - // GL_QUAD indexes can be precalculated - this.tempQuadIndexBuffer = Module.ctx.createBuffer(); - Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, this.tempQuadIndexBuffer); - var numIndexes = this.MAX_TEMP_BUFFER_SIZE >> 1; - var quadIndexes = new Uint16Array(numIndexes); - var i = 0, v = 0; - while (1) { - quadIndexes[i++] = v; - if (i >= numIndexes) break; - quadIndexes[i++] = v+1; - if (i >= numIndexes) break; - quadIndexes[i++] = v+2; - if (i >= numIndexes) break; - quadIndexes[i++] = v; - if (i >= numIndexes) break; - quadIndexes[i++] = v+2; - if (i >= numIndexes) break; - quadIndexes[i++] = v+3; - if (i >= numIndexes) break; - v += 4; - } - Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER, quadIndexes, Module.ctx.STATIC_DRAW); - Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, null); - }, - // Renderers addRendererComponent: function(name, size, type) { if (!this.rendererComponents[name]) { @@ -1969,8 +1993,8 @@ var LibraryGL = { if (!GL.currArrayBuffer) { var start = GL.immediate.firstVertex*GL.immediate.stride; var end = GL.immediate.lastVertex*GL.immediate.stride; - assert(end <= GL.immediate.MAX_TEMP_BUFFER_SIZE, 'too much vertex data'); - arrayBuffer = GL.immediate.tempVertexBuffers[GL.immediate.tempBufferIndexLookup[end]]; + assert(end <= GL.MAX_TEMP_BUFFER_SIZE, 'too much vertex data'); + arrayBuffer = GL.tempVertexBuffers[GL.tempBufferIndexLookup[end]]; // TODO: consider using the last buffer we bound, if it was larger. downside is larger buffer, but we might avoid rebinding and preparing } else { arrayBuffer = GL.currArrayBuffer; @@ -2161,12 +2185,12 @@ var LibraryGL = { this.rendererCache = this.rendererCacheItemTemplate.slice(); // Buffers for data - this.tempData = new Float32Array(this.MAX_TEMP_BUFFER_SIZE >> 2); - this.indexData = new Uint16Array(this.MAX_TEMP_BUFFER_SIZE >> 1); + this.tempData = new Float32Array(GL.MAX_TEMP_BUFFER_SIZE >> 2); + this.indexData = new Uint16Array(GL.MAX_TEMP_BUFFER_SIZE >> 1); this.vertexDataU8 = new Uint8Array(this.tempData.buffer); - this.generateTempBuffers(); + GL.generateTempBuffers(true); this.clientColor = new Float32Array([1, 1, 1, 1]); }, @@ -2209,7 +2233,7 @@ var LibraryGL = { #if ASSERTIONS Runtime.warnOnce('Unpacking/restriding attributes, this is not fast'); #endif - if (!GL.immediate.restrideBuffer) GL.immediate.restrideBuffer = _malloc(GL.immediate.MAX_TEMP_BUFFER_SIZE); + if (!GL.immediate.restrideBuffer) GL.immediate.restrideBuffer = _malloc(GL.MAX_TEMP_BUFFER_SIZE); start = GL.immediate.restrideBuffer; #if ASSERTIONS assert(start % 4 == 0); @@ -2224,7 +2248,7 @@ var LibraryGL = { bytes += size; } #if ASSERTIONS - assert(count*bytes <= GL.immediate.MAX_TEMP_BUFFER_SIZE); + assert(count*bytes <= GL.MAX_TEMP_BUFFER_SIZE); #endif // copy out the data (we need to know the stride for that, and define attribute.pointer for (var i = 0; i < attributes.length; i++) { @@ -2298,8 +2322,8 @@ var LibraryGL = { } if (!GL.currElementArrayBuffer) { // If no element array buffer is bound, then indices is a literal pointer to clientside data - assert(numProvidedIndexes << 1 <= GL.immediate.MAX_TEMP_BUFFER_SIZE, 'too many immediate mode indexes (a)'); - var indexBuffer = GL.immediate.tempIndexBuffers[GL.immediate.tempBufferIndexLookup[numProvidedIndexes << 1]]; + assert(numProvidedIndexes << 1 <= GL.MAX_TEMP_BUFFER_SIZE, 'too many immediate mode indexes (a)'); + var indexBuffer = GL.tempIndexBuffers[GL.tempBufferIndexLookup[numProvidedIndexes << 1]]; Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, indexBuffer); Module.ctx.bufferSubData(Module.ctx.ELEMENT_ARRAY_BUFFER, 0, {{{ makeHEAPView('U16', 'ptr', 'ptr + (numProvidedIndexes << 1)') }}}); ptr = 0; @@ -2314,8 +2338,8 @@ var LibraryGL = { ptr = GL.immediate.firstVertex*3; var numQuads = numVertexes / 4; numIndexes = numQuads * 6; // 0 1 2, 0 2 3 pattern - assert(ptr + (numIndexes << 1) <= GL.immediate.MAX_TEMP_BUFFER_SIZE, 'too many immediate mode indexes (b)'); - Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, this.tempQuadIndexBuffer); + assert(ptr + (numIndexes << 1) <= GL.MAX_TEMP_BUFFER_SIZE, 'too many immediate mode indexes (b)'); + Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, GL.tempQuadIndexBuffer); emulatedElementArrayBuffer = true; } @@ -2369,7 +2393,7 @@ var LibraryGL = { GL.immediate.vertexData[GL.immediate.vertexCounter++] = y; GL.immediate.vertexData[GL.immediate.vertexCounter++] = z || 0; #if ASSERTIONS - assert(GL.immediate.vertexCounter << 2 < GL.immediate.MAX_TEMP_BUFFER_SIZE); + assert(GL.immediate.vertexCounter << 2 < GL.MAX_TEMP_BUFFER_SIZE); #endif GL.immediate.addRendererComponent(GL.immediate.VERTEX, 3, Module.ctx.FLOAT); }, @@ -2849,15 +2873,25 @@ var LibraryGL = { glShadeModel: function() { Runtime.warnOnce('TODO: glShadeModel') }, + // GLES2 emulation + glVertexAttribPointer__sig: 'viiiiii', glVertexAttribPointer: function(index, size, type, normalized, stride, ptr) { #if FULL_ES2 + var cb = GL.clientBuffers[index]; +#if ASSERTIONS + assert(cb, index); +#endif if (!GL.currArrayBuffer) { - GL.clientBuffers[index] = { size: size, type: type, normalized: normalized, stride: stride, ptr: ptr }; + cb.size = size; + cb.type = type; + cb.normalized = normalized; + cb.stride = stride; + cb.ptr = ptr; + cb.clientside = true; return; } - - GL.clientBuffers[index] = null; + cb.clientside = false; #endif Module.ctx.vertexAttribPointer(index, size, type, normalized, stride, ptr); }, @@ -2865,7 +2899,11 @@ var LibraryGL = { glEnableVertexAttribArray__sig: 'vi', glEnableVertexAttribArray: function(index) { #if FULL_ES2 - GL.enabledClientBuffers[index] = true; + var cb = GL.clientBuffers[index]; +#if ASSERTIONS + assert(cb, index); +#endif + cb.enabled = true; #endif Module.ctx.enableVertexAttribArray(index); }, @@ -2873,7 +2911,11 @@ var LibraryGL = { glDisableVertexAttribArray__sig: 'vi', glDisableVertexAttribArray: function(index) { #if FULL_ES2 - GL.enabledClientBuffers[index] = false; + var cb = GL.clientBuffers[index]; +#if ASSERTIONS + assert(cb, index); +#endif + cb.enabled = false; #endif Module.ctx.disableVertexAttribArray(index); }, @@ -2881,7 +2923,7 @@ var LibraryGL = { glDrawArrays: function(mode, first, count) { #if FULL_ES2 // bind any client-side buffers - GL.preDrawHandleClientVertexAttribBindings(count); + GL.preDrawHandleClientVertexAttribBindings(first + count); #endif Module.ctx.drawArrays(mode, first, count); @@ -2895,11 +2937,12 @@ var LibraryGL = { #if FULL_ES2 var buf; if (!GL.currElementArrayBuffer) { - buf = Module.ctx.createBuffer(); + var size = GL.calcBufLength(1, type, 0, count); + buf = GL.tempIndexBuffers[GL.tempBufferIndexLookup[size]]; Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, buf); - Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER, - HEAPU8.subarray(indices, indices + GL.calcBufLength(1, type, 0, count)), - Module.ctx.DYNAMIC_DRAW); + Module.ctx.bufferSubData(Module.ctx.ELEMENT_ARRAY_BUFFER, + 0, + HEAPU8.subarray(indices, indices + size)); // the index is now 0 indices = 0; } @@ -2915,17 +2958,18 @@ var LibraryGL = { if (!GL.currElementArrayBuffer) { Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, null); - Module.ctx.deleteBuffer(buf); } #endif }, // signatures of simple pass-through functions, see later + glActiveTexture__sig: 'vi', glCheckFramebufferStatus__sig: 'ii', glRenderbufferStorage__sig: 'viiii', // Open GLES1.1 compatibility + glGenFramebuffersOES : 'glGenFramebuffers', glGenRenderbuffersOES : 'glGenRenderbuffers', glBindFramebufferOES : 'glBindFramebuffer', diff --git a/src/library_openal.js b/src/library_openal.js new file mode 100644 index 00000000..5511ccb7 --- /dev/null +++ b/src/library_openal.js @@ -0,0 +1,471 @@ +//"use strict"; + +var LibraryOpenAL = { + $AL__deps: ['$Browser'], + $AL: { + contexts: [], + currentContext: null, + }, + + alcProcessContext: function(context) {}, + alcSuspendContext: function(context) {}, + + alcMakeContextCurrent: function(context) { + if (context == 0) { + AL.currentContext = null; + } else { + AL.currentContext = AL.contexts[context - 1]; + } + }, + + alcDestroyContext: function(context) { + // Stop playback, etc + }, + + alcCloseDevice: function(device) { + // Stop playback, etc + }, + + alcOpenDevice: function(deviceName) { + if (typeof(AudioContext) == "function" || + typeof(webkitAudioContext) == "function") { + return 1; // non-null pointer -- we just simulate one device + } else { + return 0; + } + }, + + alcCreateContext: function(device, attrList) { + if (device != 1) { + return 0; + } + + if (attrList) { + console.log("The attrList argument of alcCreateContext is not supported yet"); + return 0; + } + + var ctx; + try { + ctx = new AudioContext(); + } catch (e) { + try { + ctx = new webkitAudioContext(); + } catch (e) {} + } + + if (ctx) { + AL.contexts.push({ctx: ctx, err: 0, src: [], buf: []}); + return AL.contexts.length; + } else { + return 0; + } + }, + + alGetError: function() { + if (!AL.currentContext) { + return 0xA004 /* AL_INVALID_OPERATION */; + } else { + return AL.currentContext.err; + } + }, + + alDeleteSources: function(count, sources) + { + if (!AL.currentContext) { + console.error("alDeleteSources called without a valid context"); + return; + } + for (var i = 0; i < count; ++i) { + var sourceIdx = {{{ makeGetValue('sources', 'i', 'i32') }}} - 1; + delete AL.currentContext.src[sourceIdx]; + } + }, + + alGenSources: function(count, sources) { + if (!AL.currentContext) { + console.error("alGenSources called without a valid context"); + return; + } + for (var i = 0; i < count; ++i) { + var gain = AL.currentContext.ctx.createGain(); + var panner = AL.currentContext.ctx.createPanner(); + if (typeof(webkitAudioContext) == 'function') { + gain.connect(panner); + panner.connect(AL.currentContext.ctx.destination); + } else { + // Work around a Firefox bug (bug 849916) + gain.connect(AL.currentContext.ctx.destination); + } + gain.gain.value = 1; // work around a Firefox bug (bug 850970) + AL.currentContext.src.push({ + loop: false, + buffer: null, + gain: gain, + panner: panner, + paused: false, + playTime: -1, + pausedTime: 0 + }); + {{{ makeSetValue('sources', 'i', 'AL.currentContext.src.length', 'i32') }}}; + } + }, + + alSourcei: function(source, param, value) { + if (!AL.currentContext) { + console.error("alSourcei called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourcei called with an invalid source"); + return; + } + switch (param) { + case 0x1007 /* AL_LOOPING */: + AL.currentContext.src[source - 1].loop = (value != 0 /* AL_FALSE */); + break; + case 0x1009 /* AL_BUFFER */: + if (value == 0) { + AL.currentContext.src[source - 1].buffer = null; + } else { + AL.currentContext.src[source - 1].buffer = AL.currentContext.buf[value - 1].buf; + } + break; + default: + console.log("alSourcei with param " + param + " not implemented yet"); + break; + } + }, + + alSourcef: function(source, param, value) { + if (!AL.currentContext) { + consoue.error("alSourcef called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourcef called with an invalid source"); + return; + } + switch (param) { + case 0x100A /* AL_GAIN */: + AL.currentContext.src[source - 1].gain.gain.value = value; + break; + case 0x1003 /* AL_PITCH */: + console.log("alSourcef was called with AL_PITCH, but Web Audio does not support static pitch changes"); + break; + default: + console.log("alSourcef with param " + param + " not implemented yet"); + break; + } + }, + + alSourcefv: function(source, param, value) { + if (!AL.currentContext) { + consoue.error("alSourcefv called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourcefv called with an invalid source"); + return; + } + switch (param) { + case 0x1004 /* AL_POSITION */: + AL.currentContext.src[source - 1].panner.setPosition( + {{{ makeGetValue('value', '0', 'float') }}}, + {{{ makeGetValue('value', '1', 'float') }}}, + {{{ makeGetValue('value', '2', 'float') }}} + ); + break; + case 0x1006 /* AL_VELOCITY */: + AL.currentContext.src[source - 1].panner.setVelocity( + {{{ makeGetValue('value', '0', 'float') }}}, + {{{ makeGetValue('value', '1', 'float') }}}, + {{{ makeGetValue('value', '2', 'float') }}} + ); + break; + default: + console.log("alSourcefv with param " + param + " not implemented yet"); + break; + } + }, + + alSourceQueueBuffers: function(source, count, buffers) { + if (!AL.currentContext) { + console.error("alSourceQueueBuffers called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourceQueueBuffers called with an invalid source"); + return; + } + if (count != 1) { + console.error("Queuing multiple buffers using alSourceQueueBuffers is not supported yet"); + return; + } + for (var i = 0; i < count; ++i) { + var buffer = {{{ makeGetValue('buffers', 'i', 'i32') }}}; + if (buffer > AL.currentContext.buf.length) { + console.error("alSourceQueueBuffers called with an invalid buffer"); + return; + } + AL.currentContext.src[source - 1].buffer = AL.currentContext.buf[buffer - 1].buf; + } + }, + + alSourceUnqueueBuffers: function(source, count, buffers) + { + if (!AL.currentContext) { + console.error("alSourceUnqueueBuffers called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourceUnqueueBuffers called with an invalid source"); + return; + } + if (count != 1) { + console.error("Queuing multiple buffers using alSourceUnqueueBuffers is not supported yet"); + return; + } + for (var i = 0; i < count; ++i) { + var buffer = AL.currentContext.src[source - 1].buffer; + for (var j = 0; j < AL.currentContext.buf.length; ++j) { + if (buffer == AL.currentContext.buf[j].buf) { + {{{ makeSetValue('buffers', 'i', 'j+1', 'i32') }}}; + AL.currentContext.src[source - 1].buffer = null; + break; + } + } + } + }, + + alDeleteBuffers: function(count, buffers) + { + if (!AL.currentContext) { + console.error("alDeleteBuffers called without a valid context"); + return; + } + for (var i = 0; i < count; ++i) { + var bufferIdx = {{{ makeGetValue('buffers', 'i', 'i32') }}} - 1; + var buffer = AL.currentContext.buf[bufferIdx].buf; + for (var j = 0; j < AL.currentContext.src.length; ++j) { + if (buffer == AL.currentContext.src[j].buffer) { + AL.currentContext.err = 0xA004 /* AL_INVALID_OPERATION */; + return; + } + } + delete AL.currentContext.buf[bufferIdx]; + } + }, + + alGenBuffers: function(count, buffers) { + if (!AL.currentContext) { + console.error("alGenBuffers called without a valid context"); + return; + } + for (var i = 0; i < count; ++i) { + AL.currentContext.buf.push({buf: null}); + {{{ makeSetValue('buffers', 'i', 'AL.currentContext.buf.length', 'i32') }}}; + } + }, + + alBufferData: function(buffer, format, data, size, freq) { + if (!AL.currentContext) { + console.error("alBufferData called without a valid context"); + return; + } + if (buffer > AL.currentContext.buf.length) { + console.error("alBufferData called with an invalid buffer"); + return; + } + var channels, bytes; + switch (format) { + case 0x1100 /* AL_FORMAT_MONO8 */: + bytes = 1; + channels = 1; + break; + case 0x1101 /* AL_FORMAT_MONO16 */: + bytes = 2; + channels = 1; + break; + case 0x1102 /* AL_FORMAT_STEREO8 */: + bytes = 1; + channels = 2; + break; + case 0x1103 /* AL_FORMAT_STEREO16 */: + bytes = 2; + channels = 2; + break; + default: + console.error("alBufferData called with invalid format " + format); + return; + } + AL.currentContext.buf[buffer - 1].buf = AL.currentContext.ctx.createBuffer(channels, size / (bytes * channels), freq); + var buf = new Array(channels); + for (var i = 0; i < channels; ++i) { + buf[i] = AL.currentContext.buf[buffer - 1].buf.getChannelData(i); + } + for (var i = 0; i < size / (bytes * channels); ++i) { + for (var j = 0; j < channels; ++j) { + switch (bytes) { + case 1: + var val = {{{ makeGetValue('data', 'i*channels+j', 'i8') }}}; + buf[j][i] = -1.0 + val * (2/256); + break; + case 2: + var val = {{{ makeGetValue('data', '2*(i*channels+j)', 'i16') }}}; + buf[j][i] = val/32768; + break; + } + } + } + }, + + alSourcePlay__deps: ["alSourceStop"], + alSourcePlay: function(source) { + if (!AL.currentContext) { + console.error("alSourcePlay called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourcePlay called with an invalid source"); + return; + } + var offset = 0; + if ("src" in AL.currentContext.src[source - 1]) { + // If the source is already playing, we need to resume from beginning. + // We do that by stopping the current source and replaying it. + _alSourceStop(source); + } else if (AL.currentContext.src[source - 1].paused) { + // So now we have to resume playback, remember the offset here. + offset = AL.currentContext.src[source - 1].pausedTime - + AL.currentContext.src[source - 1].playTime; + } + var src = AL.currentContext.ctx.createBufferSource(); + src.loop = AL.currentContext.src[source - 1].loop; + src.buffer = AL.currentContext.src[source - 1].buffer; + src.connect(AL.currentContext.src[source - 1].gain); + src.start(0, offset); + // Work around Firefox bug 851338 + AL.currentContext.src[source - 1].playTime = AL.currentContext.ctx.currentTime || 0; + AL.currentContext.src[source - 1].paused = false; + AL.currentContext.src[source - 1]['src'] = src; + }, + + alSourceStop: function(source) { + if (!AL.currentContext) { + console.error("alSourceStop called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourceStop called with an invalid source"); + return; + } + if ("src" in AL.currentContext.src[source - 1]) { + AL.currentContext.src[source - 1]["src"].stop(0); + delete AL.currentContext.src[source - 1]["src"]; + } + }, + + alSourcePause: function(source) { + if (!AL.currentContext) { + console.error("alSourcePause called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alSourcePause called with an invalid source"); + return; + } + if ("src" in AL.currentContext.src[source - 1] && + !AL.currentContext.src[source - 1].paused) { + AL.currentContext.src[source - 1].paused = true; + // Work around Firefox bug 851338 + AL.currentContext.src[source - 1].pausedTime = AL.currentContext.ctx.currentTime || 0; + AL.currentContext.src[source - 1]["src"].stop(0); + delete AL.currentContext.src[source - 1].src; + } + }, + + alGetSourcei: function(source, param, value) { + if (!AL.currentContext) { + console.error("alGetSourcei called without a valid context"); + return; + } + if (source > AL.currentContext.src.length) { + console.error("alGetSourcei called with an invalid source"); + return; + } + switch (param) { + case 0x202 /* AL_SOURCE_RELATIVE */: + // Always return 1 + {{{ makeSetValue('value', '0', '1', 'i32') }}}; + break; + case 0x1009 /* AL_BUFFER */: + if (AL.currentContext.src[source - 1].buffer == null) { + {{{ makeSetValue('value', '0', '0', 'i32') }}}; + } else { + var buf = AL.currentContext.src[source - 1].buffer; + for (var i = 0; i < AL.currentContext.buf.length; ++i) { + if (buf == AL.currentContext.buf[i].buf) { + {{{ makeSetValue('value', '0', 'i+1', 'i32') }}}; + return; + } + } + {{{ makeSetValue('value', '0', '0', 'i32') }}}; + } + break; + case 0x1010 /* AL_SOURCE_STATE */: + if ("src" in AL.currentContext.src[source - 1]) { + {{{ makeSetValue('value', '0', '0x1012', 'i32') }}} /* AL_PLAYING */; + } else if (AL.currentContext.src[source - 1].paused) { + {{{ makeSetValue('value', '0', '0x1013', 'i32') }}} /* AL_PAUSED */; + } else if (AL.currentContext.src[source - 1].playTime == -1) { + {{{ makeSetValue('value', '0', '0x1011', 'i32') }}} /* AL_INITIAL */; + } else { + {{{ makeSetValue('value', '0', '0x1014', 'i32') }}} /* AL_STOPPED */; + } + break; + case 0x1015 /* AL_BUFFERS_QUEUED */: + if (AL.currentContext.src[source - 1].buffer) { + {{{ makeSetValue('value', '0', '1', 'i32') }}} + } else { + {{{ makeSetValue('value', '0', '0', 'i32') }}} + } + break; + case 0x1016 /* AL_BUFFERS_PROCESSED */: + // Always return 1 + {{{ makeSetValue('value', '0', '1', 'i32') }}} + break; + } + }, + + alDistanceModel: function(model) { + if (model != 0 /* AL_NONE */) { + console.log("Only alDistanceModel(AL_NONE) is currently supported"); + } + }, + + alListenerfv: function(param, values) { + console.log("alListenerfv is not supported yet"); + }, + + alIsExtensionPresent: function(extName) { + return 0; + }, + + alcIsExtensionPresent: function(device, extName) { + return 0; + }, + + alGetProcAddress: function(fname) { + return 0; + }, + + alcGetProcAddress: function(device, fname) { + return 0; + }, + +}; + +autoAddDeps(LibraryOpenAL, '$AL'); +mergeInto(LibraryManager.library, LibraryOpenAL); + diff --git a/src/library_sdl.js b/src/library_sdl.js index 96ae6fa2..9fc979d2 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -35,6 +35,7 @@ var LibrarySDL = { mixerFormat: 0x8010, // AUDIO_S16LSB mixerNumChannels: 2, mixerChunkSize: 1024, + channelMinimumNumber: 0, GL: false, // Set to true if we call SDL_SetVideoMode with SDL_OPENGL, and if so, we do not create 2D canvases&contexts for blitting // Note that images loaded before SDL_SetVideoMode will not get this optimization @@ -661,8 +662,8 @@ var LibrarySDL = { {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*0', '0', '0', 'i32') }}} // TODO {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*1', '0', '0', 'i32') }}} // TODO {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*2', '0', '0', 'void*') }}} - {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*3', '0', 'SDL.defaults.width', 'i32') }}} - {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*4', '0', 'SDL.defaults.height', 'i32') }}} + {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*3', '0', 'Module["canvas"].width', 'i32') }}} + {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*4', '0', 'Module["canvas"].height', 'i32') }}} return ret; }, @@ -919,7 +920,26 @@ var LibrarySDL = { }, SDL_ShowCursor: function(toggle) { - // TODO + switch (toggle) { + case 0: // SDL_DISABLE + if (Browser.isFullScreen) { // only try to lock the pointer when in full screen mode + Module['canvas'].requestPointerLock(); + return 0; + } else { // else return SDL_ENABLE to indicate the failure + return 1; + } + break; + case 1: // SDL_ENABLE + Module['canvas'].exitPointerLock(); + return 1; + break; + case -1: // SDL_QUERY + return !Browser.pointerLock; + break; + default: + console.log( "SDL_ShowCursor called with unknown toggle parameter value: " + toggle + "." ); + break; + } }, SDL_GetError: function() { @@ -1075,6 +1095,15 @@ var LibrarySDL = { }, SDL_WM_GrabInput: function() {}, + + SDL_WM_ToggleFullScreen: function(surf) { + if (Browser.isFullScreen) { + Module['canvas'].cancelFullScreen(); + return 1; + } else { + return 0; + } + }, // SDL_Image @@ -1289,7 +1318,9 @@ var LibrarySDL = { Mix_FreeChunk: function(id) { SDL.audios[id] = null; }, - + Mix_ReserveChannels: function(num) { + SDL.channelMinimumNumber = num; + }, Mix_PlayChannel: function(channel, id, loops) { // TODO: handle loops @@ -1302,8 +1333,8 @@ var LibrarySDL = { // If the user asks us to allocate a channel automatically, get the first // free one. if (channel == -1) { - channel = 0; - for (var i = 0; i < SDL.numChannels; i++) { + channel = SDL.channelMinimumNumber; + for (var i = SDL.channelMinimumNumber; i < SDL.numChannels; i++) { if (!SDL.channels[i].audio) { channel = i; break; @@ -1375,6 +1406,7 @@ var LibrarySDL = { audio.play(); } audio.volume = channelInfo.volume; + audio.paused = false; return channel; }, Mix_PlayChannelTimed: 'Mix_PlayChannel', // XXX ignore Timing @@ -1463,10 +1495,71 @@ var LibrarySDL = { return (SDL.music.audio && !SDL.music.audio.paused) ? 1 : 0; }, + // http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_38.html#SEC38 + // "Note: Does not check if the channel has been paused." + Mix_Playing: function(channel) { + if (channel === -1) { + var count = 0; + for (var i = 0; i < SDL.channels.length; i++) { + count += _Mix_Playing(i); + } + return count; + } + var info = SDL.channels[channel]; + if (info && info.audio && !info.audio.paused) { + return 1; + } + return 0; + }, + + Mix_Pause: function(channel) { + if (channel === -1) { + for (var i = 0; i<SDL.channels.length;i++) { + _Mix_Pause(i); + } + return; + } + var info = SDL.channels[channel]; + if (info && info.audio) { + info.audio.pause(); + info.audio.paused = true; + } + }, + + // http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_39.html#SEC39 + Mix_Paused: function(channel) { + if (channel === -1) { + var pausedCount = 0; + for (var i = 0; i<SDL.channels.length;i++) { + pausedCount += _Mix_Paused(i); + } + return pausedCount; + } + var info = SDL.channels[channel]; + if (info && info.audio && info.audio.paused) { + return 1; + } + return 0; + }, + Mix_PausedMusic: function() { return (SDL.music.audio && SDL.music.audio.paused) ? 1 : 0; }, + // http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_33.html#SEC33 + Mix_Resume: function(channel) { + if (channel === -1) { + for (var i = 0; i<SDL.channels.length;i++) { + _Mix_Resume(i); + } + return; + } + var info = SDL.channels[channel]; + if (info && info.audio) { + info.audio.play(); + } + }, + // SDL TTF TTF_Init: function() { return 0 }, diff --git a/src/long.js b/src/long.js index c3b0e605..6d0e873d 100644 --- a/src/long.js +++ b/src/long.js @@ -1530,13 +1530,6 @@ var i64Math = (function() { // Emscripten wrapper // Emscripten wrapper var Wrapper = { - add: function(xl, xh, yl, yh) { - var x = new goog.math.Long(xl, xh); - var y = new goog.math.Long(yl, yh); - var ret = x.add(y); - HEAP32[tempDoublePtr>>2] = ret.low_; - HEAP32[tempDoublePtr+4>>2] = ret.high_; - }, subtract: function(xl, xh, yl, yh) { var x = new goog.math.Long(xl, xh); var y = new goog.math.Long(yl, yh); @@ -1551,6 +1544,17 @@ var i64Math = (function() { // Emscripten wrapper HEAP32[tempDoublePtr>>2] = ret.low_; HEAP32[tempDoublePtr+4>>2] = ret.high_; }, + abs: function(l, h) { + var x = new goog.math.Long(l, h); + var ret; + if (x.isNegative()) { + ret = x.negate(); + } else { + ret = x; + } + HEAP32[tempDoublePtr>>2] = ret.low_; + HEAP32[tempDoublePtr+4>>2] = ret.high_; + }, ensureTemps: function() { if (Wrapper.ensuredTemps) return; Wrapper.ensuredTemps = true; diff --git a/src/modules.js b/src/modules.js index afdbc21e..bda8a605 100644 --- a/src/modules.js +++ b/src/modules.js @@ -90,6 +90,7 @@ var Debugging = { lines[i] = ';'; continue; } + if (line[0] == '!') skipLine = true; lines[i] = skipLine ? ';' : line; } @@ -290,7 +291,7 @@ var Functions = { var sig = ASM_JS ? Functions.implementedFunctions[ident] || Functions.unimplementedFunctions[ident] || LibraryManager.library[ident.substr(1) + '__sig'] : 'x'; assert(sig, ident); if (!tables[sig]) tables[sig] = emptyTable(sig); // TODO: make them compact - tables[sig][this.indexedFunctions[ident]] = ident; + tables[sig][this.indexedFunctions[ident]] = ident in DEAD_FUNCTIONS ? '0' : ident; } var generated = false; var wrapped = {}; @@ -314,7 +315,7 @@ var Functions = { } if (ASM_JS) { var curr = table[i]; - if (curr && !Functions.implementedFunctions[curr]) { + if (curr && curr != '0' && !Functions.implementedFunctions[curr]) { // This is a library function, we can't just put it in the function table, need a wrapper if (!wrapped[curr]) { var args = '', arg_coercions = '', call = curr + '(', retPre = '', retPost = ''; @@ -373,7 +374,7 @@ var LibraryManager = { load: function() { if (this.library) return; - var libraries = ['library.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js'].concat(additionalLibraries); + var libraries = ['library.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js', 'library_openal.js'].concat(additionalLibraries); for (var i = 0; i < libraries.length; i++) { eval(processMacros(preprocess(read(libraries[i])))); } diff --git a/src/parseTools.js b/src/parseTools.js index 7f4f3a18..2664baed 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -172,6 +172,7 @@ function getBits(type) { } if (isStructType(type)) { var typeData = Types.types[type]; + if (typeData === undefined) return 0; return typeData.flatSize*8; } return 0; @@ -583,7 +584,7 @@ function cleanOutTokens(filterOut, tokens, indexes) { if (typeof indexes !== 'object') indexes = [indexes]; for (var i = indexes.length-1; i >=0; i--) { var index = indexes[i]; - while (tokens[index].text in filterOut) { + while (index < tokens.length && tokens[index].text in filterOut) { tokens.splice(index, 1); } } @@ -1248,7 +1249,6 @@ function makeSetValueAsm(ptr, pos, value, type, noNeedFirst, ignore, align, noSa return makeSetValue(ptr, pos, value, type, noNeedFirst, ignore, align, noSafe, sep, forcedAlign, true); } -var SEEK_OPTIMAL_ALIGN_MIN = 20; var UNROLL_LOOP_MAX = 8; function makeSetValues(ptr, pos, value, type, num, align) { @@ -1268,7 +1268,7 @@ function makeSetValues(ptr, pos, value, type, num, align) { } else { // USE_TYPED_ARRAYS == 2 // If we don't know how to handle this at compile-time, or handling it is best done in a large amount of code, call memset // TODO: optimize the case of numeric num but non-numeric value - if (!isNumber(num) || !isNumber(value) || (align < 4 && parseInt(num) >= SEEK_OPTIMAL_ALIGN_MIN)) { + if (!isNumber(num) || !isNumber(value) || (parseInt(num)/align >= UNROLL_LOOP_MAX)) { return '_memset(' + asmCoercion(getFastValue(ptr, '+', pos), 'i32') + ', ' + asmCoercion(value, 'i32') + ', ' + asmCoercion(num, 'i32') + ')'; } num = parseInt(num); @@ -1283,13 +1283,7 @@ function makeSetValues(ptr, pos, value, type, num, align) { [4, 2, 1].forEach(function(possibleAlign) { if (num == 0) return; if (align >= possibleAlign) { - if (num <= UNROLL_LOOP_MAX*possibleAlign || ASM_JS) { // XXX test asm performance - ret.push(unroll('i' + (possibleAlign*8), Math.floor(num/possibleAlign), possibleAlign, values[possibleAlign])); - } else { - ret.push('for (var $$dest = ' + getFastValue(ptr, '+', pos) + (possibleAlign > 1 ? '>>' + log2(possibleAlign) : '') + ', ' + - '$$stop = $$dest + ' + Math.floor(num/possibleAlign) + '; $$dest < $$stop; $$dest++) {\n' + - ' HEAP' + (possibleAlign*8) + '[$$dest] = ' + values[possibleAlign] + '\n}'); - } + ret.push(unroll('i' + (possibleAlign*8), Math.floor(num/possibleAlign), possibleAlign, values[possibleAlign])); pos = getFastValue(pos, '+', Math.floor(num/possibleAlign)*possibleAlign); num %= possibleAlign; } @@ -1326,7 +1320,7 @@ function makeCopyValues(dest, src, num, type, modifier, align, sep) { unroll(type, 1) + ' }'; } else { // USE_TYPED_ARRAYS == 2 // If we don't know how to handle this at compile-time, or handling it is best done in a large amount of code, call memset - if (!isNumber(num) || (align < 4 && parseInt(num) >= SEEK_OPTIMAL_ALIGN_MIN)) { + if (!isNumber(num) || (parseInt(num)/align >= UNROLL_LOOP_MAX)) { return '_memcpy(' + dest + ', ' + src + ', ' + num + ')'; } num = parseInt(num); @@ -1334,16 +1328,7 @@ function makeCopyValues(dest, src, num, type, modifier, align, sep) { [4, 2, 1].forEach(function(possibleAlign) { if (num == 0) return; if (align >= possibleAlign) { - // If we can unroll the loop, do so. Also do so if we must unroll it (we do not create real loops when inlined) - if (num <= UNROLL_LOOP_MAX*possibleAlign || sep == ',' || ASM_JS) { // XXX test asm performance - ret.push(unroll('i' + (possibleAlign*8), Math.floor(num/possibleAlign), possibleAlign)); - } else { - assert(sep == ';'); - ret.push('for (var $$src = ' + src + (possibleAlign > 1 ? '>>' + log2(possibleAlign) : '') + ', ' + - '$$dest = ' + dest + (possibleAlign > 1 ? '>>' + log2(possibleAlign) : '') + ', ' + - '$$stop = $$src + ' + Math.floor(num/possibleAlign) + '; $$src < $$stop; $$src++, $$dest++) {\n' + - ' HEAP' + (possibleAlign*8) + '[$$dest] = HEAP' + (possibleAlign*8) + '[$$src]\n}'); - } + ret.push(unroll('i' + (possibleAlign*8), Math.floor(num/possibleAlign), possibleAlign)); src = getFastValue(src, '+', Math.floor(num/possibleAlign)*possibleAlign); dest = getFastValue(dest, '+', Math.floor(num/possibleAlign)*possibleAlign); num %= possibleAlign; @@ -1739,13 +1724,14 @@ function makeLLVMStruct(values) { } } -function makeStructuralReturn(values) { +function makeStructuralReturn(values, inAsm) { if (USE_TYPED_ARRAYS == 2) { - var i = 0; - return 'return (' + values.slice(1).map(function(value) { - return ASM_JS ? 'asm.setTempRet' + (i++) + '(' + value + ')' + var i = -1; + return 'return ' + asmCoercion(values.slice(1).map(function(value) { + i++; + return ASM_JS ? (inAsm ? 'tempRet' + i + ' = ' + value : 'asm.setTempRet' + i + '(' + value + ')') : 'tempRet' + (i++) + ' = ' + value; - }).concat([values[0]]).join(',') + ')'; + }).concat([values[0]]).join(','), 'i32'); } else { var i = 0; return 'return { ' + values.map(function(value) { @@ -1986,6 +1972,10 @@ function processMathop(item) { return finish(['(i64Math' + (ASM_JS ? '_' : '.') + type + '(' + asmCoercion(low1, 'i32') + ',' + asmCoercion(high1, 'i32') + ',' + asmCoercion(low2, 'i32') + ',' + asmCoercion(high2, 'i32') + (lastArg ? ',' + asmCoercion(+lastArg, 'i32') : '') + '),' + makeGetValue('tempDoublePtr', 0, 'i32') + ')', makeGetValue('tempDoublePtr', Runtime.getNativeTypeSize('i32'), 'i32')]); } + function i64PreciseLib(type) { + Types.preciseI64MathUsed = true; + return finish(['_i64' + type[0].toUpperCase() + type.substr(1) + '(' + low1 + ',' + high1 + ',' + low2 + ',' + high2 + ')', 'tempRet0']); + } switch (op) { // basic integer ops case 'or': { @@ -2000,43 +1990,7 @@ function processMathop(item) { case 'shl': case 'ashr': case 'lshr': { - if (!isNumber(idents[1])) { - return '(Runtime' + (ASM_JS ? '_' : '.') + 'bitshift64(' + idents[0] + '[0], ' + idents[0] + '[1],' + Runtime['BITSHIFT64_' + op.toUpperCase()] + ',' + stripCorrections(idents[1]) + '[0]|0),' + - '[' + makeGetTempDouble(0, 'i32') + ',' + makeGetTempDouble(1, 'i32') + '])'; - } - bits = parseInt(idents[1]); - var ander = Math.pow(2, bits)-1; - if (bits < 32) { - switch (op) { - case 'shl': - return '[' + idents[0] + '[0] << ' + idents[1] + ', ' + - '('+idents[0] + '[1] << ' + idents[1] + ') | ((' + idents[0] + '[0]&(' + ander + '<<' + (32 - bits) + ')) >>> (32-' + idents[1] + '))]'; - case 'ashr': - return '[((('+idents[0] + '[0] >>> ' + idents[1] + ') | ((' + idents[0] + '[1]&' + ander + ')<<' + (32 - bits) + ')) >> 0) >>> 0,' + - '(' + idents[0] + '[1] >> ' + idents[1] + ') >>> 0]'; - case 'lshr': - return '[(('+idents[0] + '[0] >>> ' + idents[1] + ') | ((' + idents[0] + '[1]&' + ander + ')<<' + (32 - bits) + ')) >>> 0,' + - idents[0] + '[1] >>> ' + idents[1] + ']'; - } - } else if (bits == 32) { - switch (op) { - case 'shl': - return '[0, ' + idents[0] + '[0]]'; - case 'ashr': - return '[' + idents[0] + '[1], (' + idents[0] + '[1]|0) < 0 ? ' + ander + ' : 0]'; - case 'lshr': - return '[' + idents[0] + '[1], 0]'; - } - } else { // bits > 32 - switch (op) { - case 'shl': - return '[0, ' + idents[0] + '[0] << ' + (bits - 32) + ']'; - case 'ashr': - return '[(' + idents[0] + '[1] >> ' + (bits - 32) + ') >>> 0, (' + idents[0] + '[1]|0) < 0 ? ' + ander + ' : 0]'; - case 'lshr': - return '[' + idents[0] + '[1] >>> ' + (bits - 32) + ', 0]'; - } - } + throw 'shifts should have been legalized!'; } case 'uitofp': case 'sitofp': return RuntimeGenerator.makeBigInt(low1, high1, op[0] == 'u'); case 'fptoui': case 'fptosi': return finish(splitI64(idents[0], true)); @@ -2074,7 +2028,7 @@ function processMathop(item) { // Dangerous, rounded operations. TODO: Fully emulate case 'add': { if (PRECISE_I64_MATH) { - return i64PreciseOp('add'); + return i64PreciseLib('add'); } else { warnI64_1(); return finish(splitI64(mergeI64(idents[0]) + '+' + mergeI64(idents[1]), true)); @@ -2365,3 +2319,7 @@ function getImplementationType(varInfo) { return varInfo.type; } +function charCode(char) { + return char.charCodeAt(0); +} + diff --git a/src/preamble.js b/src/preamble.js index 9bc68d8f..6f3a969c 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -503,6 +503,7 @@ function allocate(slab, types, allocator, ptr) { Module['allocate'] = allocate; function Pointer_stringify(ptr, /* optional */ length) { +#if UTF_STRING_SUPPORT var utf8 = new Runtime.UTF8Processor(); var nullTerminated = typeof(length) == "undefined"; var ret = ""; @@ -519,18 +520,16 @@ function Pointer_stringify(ptr, /* optional */ length) { if (!nullTerminated && i == length) break; } return ret; +#else +#if USE_TYPED_ARRAYS == 2 + return String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + (length || _strlen(ptr)))); +#else + throw 'unsupported combination'; +#endif +#endif } Module['Pointer_stringify'] = Pointer_stringify; -function Array_stringify(array) { - var ret = ""; - for (var i = 0; i < array.length; i++) { - ret += String.fromCharCode(array[i]); - } - return ret; -} -Module['Array_stringify'] = Array_stringify; - // Memory management var PAGE_SIZE = 4096; @@ -848,5 +847,22 @@ Module['removeRunDependency'] = removeRunDependency; Module["preloadedImages"] = {}; // maps url to image data Module["preloadedAudios"] = {}; // maps url to audio data +#if PGO +var PGOMonitor = { + called: {}, + dump: function() { + var dead = []; + for (var i = 0; i < this.allGenerated.length; i++) { + var func = this.allGenerated[i]; + if (!this.called[func]) dead.push(func); + } + Module.print('-s DEAD_FUNCTIONS=\'' + JSON.stringify(dead) + '\'\n'); + } +}; +__ATEXIT__.push({ func: function() { PGOMonitor.dump() } }); +if (!Module.preRun) Module.preRun = []; +Module.preRun.push(function() { addRunDependency('pgo') }); +#endif + // === Body === diff --git a/src/relooper/Relooper.cpp b/src/relooper/Relooper.cpp index 1a7acc15..ae393de3 100644 --- a/src/relooper/Relooper.cpp +++ b/src/relooper/Relooper.cpp @@ -347,17 +347,25 @@ struct RelooperRecursor { RelooperRecursor(Relooper *ParentInit) : Parent(ParentInit) {} }; +typedef std::list<Block*> BlockList; + void Relooper::Calculate(Block *Entry) { // Scan and optimize the input struct PreOptimizer : public RelooperRecursor { PreOptimizer(Relooper *Parent) : RelooperRecursor(Parent) {} BlockSet Live; - void FindLive(Block *Curr) { - if (Live.find(Curr) != Live.end()) return; - Live.insert(Curr); - for (BlockBranchMap::iterator iter = Curr->BranchesOut.begin(); iter != Curr->BranchesOut.end(); iter++) { - FindLive(iter->first); + void FindLive(Block *Root) { + BlockList ToInvestigate; + ToInvestigate.push_back(Root); + while (ToInvestigate.size() > 0) { + Block *Curr = ToInvestigate.front(); + ToInvestigate.pop_front(); + if (Live.find(Curr) != Live.end()) continue; + Live.insert(Curr); + for (BlockBranchMap::iterator iter = Curr->BranchesOut.begin(); iter != Curr->BranchesOut.end(); iter++) { + ToInvestigate.push_back(iter->first); + } } } @@ -529,7 +537,6 @@ void Relooper::Calculate(Block *Entry) { // ignore directly reaching the entry itself by another entry. void FindIndependentGroups(BlockSet &Blocks, BlockSet &Entries, BlockBlockSetMap& IndependentGroups) { typedef std::map<Block*, Block*> BlockBlockMap; - typedef std::list<Block*> BlockList; struct HelperClass { BlockBlockSetMap& IndependentGroups; @@ -872,33 +879,38 @@ void Relooper::Calculate(Block *Entry) { // A flow operation is trivially unneeded if the shape we naturally get to by normal code // execution is the same as the flow forces us to. void RemoveUnneededFlows(Shape *Root, Shape *Natural=NULL) { - SHAPE_SWITCH(Root, { - // If there is a next block, we already know at Simple creation time to make direct branches, - // and we can do nothing more. If there is no next however, then Natural is where we will - // go to by doing nothing, so we can potentially optimize some branches to direct. - if (Simple->Next) { - RemoveUnneededFlows(Simple->Next, Natural); - } else { - for (BlockBranchMap::iterator iter = Simple->Inner->ProcessedBranchesOut.begin(); iter != Simple->Inner->ProcessedBranchesOut.end(); iter++) { - Block *Target = iter->first; - Branch *Details = iter->second; - if (Details->Type != Branch::Direct && Target->Parent == Natural) { - Details->Type = Branch::Direct; - if (MultipleShape *Multiple = Shape::IsMultiple(Details->Ancestor)) { - Multiple->NeedLoop--; + Shape *Next = Root; + while (Next) { + Root = Next; + Next = NULL; + SHAPE_SWITCH(Root, { + // If there is a next block, we already know at Simple creation time to make direct branches, + // and we can do nothing more. If there is no next however, then Natural is where we will + // go to by doing nothing, so we can potentially optimize some branches to direct. + if (Simple->Next) { + Next = Simple->Next; + } else { + for (BlockBranchMap::iterator iter = Simple->Inner->ProcessedBranchesOut.begin(); iter != Simple->Inner->ProcessedBranchesOut.end(); iter++) { + Block *Target = iter->first; + Branch *Details = iter->second; + if (Details->Type != Branch::Direct && Target->Parent == Natural) { + Details->Type = Branch::Direct; + if (MultipleShape *Multiple = Shape::IsMultiple(Details->Ancestor)) { + Multiple->NeedLoop--; + } } } } - } - }, { - for (BlockShapeMap::iterator iter = Multiple->InnerMap.begin(); iter != Multiple->InnerMap.end(); iter++) { - RemoveUnneededFlows(iter->second, Multiple->Next); - } - RemoveUnneededFlows(Multiple->Next, Natural); - }, { - RemoveUnneededFlows(Loop->Inner, Loop->Inner); - RemoveUnneededFlows(Loop->Next, Natural); - }); + }, { + for (BlockShapeMap::iterator iter = Multiple->InnerMap.begin(); iter != Multiple->InnerMap.end(); iter++) { + RemoveUnneededFlows(iter->second, Multiple->Next); + } + Next = Multiple->Next; + }, { + RemoveUnneededFlows(Loop->Inner, Loop->Inner); + Next = Loop->Next; + }); + } } // After we know which loops exist, we can calculate which need to be labeled diff --git a/src/relooper/fuzzer.py b/src/relooper/fuzzer.py index 887eab3b..96929028 100644 --- a/src/relooper/fuzzer.py +++ b/src/relooper/fuzzer.py @@ -98,14 +98,14 @@ int main() { open('fuzz.slow.js', 'w').write(slow) open('fuzz.cpp', 'w').write(fast) print '_' - slow_out = subprocess.Popen(['/home/alon/Dev/mozilla-central/js/src/fast/js', '-m', '-n', 'fuzz.slow.js'], stdout=subprocess.PIPE).communicate()[0] + slow_out = subprocess.Popen(['/home/alon/Dev/odinmonkey/js/src/fast/js', '-m', '-n', 'fuzz.slow.js'], stdout=subprocess.PIPE).communicate()[0] print '.' subprocess.call(['g++', 'fuzz.cpp', 'Relooper.o', '-o', 'fuzz', '-g']) print '*' subprocess.call(['./fuzz'], stdout=open('fuzz.fast.js', 'w')) print '-' - fast_out = subprocess.Popen(['/home/alon/Dev/mozilla-central/js/src/fast/js', '-m', '-n', 'fuzz.fast.js'], stdout=subprocess.PIPE).communicate()[0] + fast_out = subprocess.Popen(['/home/alon/Dev/odinmonkey/js/src/fast/js', '-m', '-n', 'fuzz.fast.js'], stdout=subprocess.PIPE).communicate()[0] print if slow_out != fast_out: diff --git a/src/relooper/test.txt b/src/relooper/test.txt index b7c8794d..12d0ef39 100644 --- a/src/relooper/test.txt +++ b/src/relooper/test.txt @@ -54,7 +54,7 @@ while(1) { // code 2 if (!($2)) { var $x_1 = $x_0; - label = 19; + label = 18; break; } // code 3 @@ -64,7 +64,7 @@ while(1) { var $i_0 = $7;var $x_0 = $5; } } -if (label == 19) { +if (label == 18) { // code 7 } // code 4 diff --git a/src/runtime.js b/src/runtime.js index 7f97da35..2a26db28 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -27,7 +27,7 @@ var RuntimeGenerator = { // The stack is always QUANTUM SIZE aligned, so we may not need to force alignment here var ret = RuntimeGenerator.alloc(size, 'STACK', false, sep, USE_TYPED_ARRAYS != 2 || (isNumber(size) && parseInt(size) % {{{ QUANTUM_SIZE }}} == 0)); if (ASSERTIONS) { - ret += sep + 'assert(STACKTOP|0 < STACK_MAX|0)'; + ret += sep + 'assert(' + asmCoercion('(STACKTOP|0) < (STACK_MAX|0)', 'i32') + ')'; } return ret; }, @@ -38,12 +38,12 @@ var RuntimeGenerator = { if (initial > 0) ret += '; STACKTOP = (STACKTOP + ' + initial + ')|0'; if (USE_TYPED_ARRAYS == 2) { assert(initial % QUANTUM_SIZE == 0); - if (ASSERTIONS) { - ret += '; assert(STACKTOP|0 % {{{ QUANTUM_SIZE }}} == 0)'; + if (ASSERTIONS && QUANTUM_SIZE == 4) { + ret += '; assert(' + asmCoercion('!(STACKTOP&3)', 'i32') + ')'; } } if (ASSERTIONS) { - ret += '; assert(STACKTOP < STACK_MAX)'; + ret += '; assert(' + asmCoercion('(STACKTOP|0) < (STACK_MAX|0)', 'i32') + ')'; } if (false) { ret += '; _memset(' + asmCoercion('__stackBase__', 'i32') + ', 0, ' + initial + ')'; @@ -87,7 +87,7 @@ var RuntimeGenerator = { }; function unInline(name_, params) { - var src = '(function ' + name_ + '(' + params + ') { var ret = ' + RuntimeGenerator[name_].apply(null, params) + '; return ret; })'; + var src = '(function(' + params + ') { var ret = ' + RuntimeGenerator[name_].apply(null, params) + '; return ret; })'; var ret = eval(src); return ret; } @@ -122,57 +122,6 @@ var Runtime = { INT_TYPES: set('i1', 'i8', 'i16', 'i32', 'i64'), FLOAT_TYPES: set('float', 'double'), - // Mirrors processMathop's treatment of constants (which we optimize directly) - BITSHIFT64_SHL: 0, - BITSHIFT64_ASHR: 1, - BITSHIFT64_LSHR: 2, - bitshift64: function(low, high, op, bits) { - var ret; - var ander = Math.pow(2, bits)-1; - if (bits < 32) { - switch (op) { - case Runtime.BITSHIFT64_SHL: - ret = [low << bits, (high << bits) | ((low&(ander << (32 - bits))) >>> (32 - bits))]; - break; - case Runtime.BITSHIFT64_ASHR: - ret = [(((low >>> bits ) | ((high&ander) << (32 - bits))) >> 0) >>> 0, (high >> bits) >>> 0]; - break; - case Runtime.BITSHIFT64_LSHR: - ret = [((low >>> bits) | ((high&ander) << (32 - bits))) >>> 0, high >>> bits]; - break; - } - } else if (bits == 32) { - switch (op) { - case Runtime.BITSHIFT64_SHL: - ret = [0, low]; - break; - case Runtime.BITSHIFT64_ASHR: - ret = [high, (high|0) < 0 ? ander : 0]; - break; - case Runtime.BITSHIFT64_LSHR: - ret = [high, 0]; - break; - } - } else { // bits > 32 - switch (op) { - case Runtime.BITSHIFT64_SHL: - ret = [0, low << (bits - 32)]; - break; - case Runtime.BITSHIFT64_ASHR: - ret = [(high >> (bits - 32)) >>> 0, (high|0) < 0 ? ander : 0]; - break; - case Runtime.BITSHIFT64_LSHR: - ret = [high >>> (bits - 32) , 0]; - break; - } - } -#if ASSERTIONS - assert(ret); -#endif - HEAP32[tempDoublePtr>>2] = ret[0]; // cannot use utility functions since we are in runtime itself - HEAP32[tempDoublePtr+4>>2] = ret[1]; - }, - // Imprecise bitops utilities or64: function(x, y) { var l = (x | 0) | (y | 0); @@ -365,6 +314,11 @@ var Runtime = { return ret; }, + removeFunction: function(index) { + var table = FUNCTION_TABLE; // TODO: support asm + table[index] = null; + }, + warnOnce: function(text) { if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; if (!Runtime.warnOnce.shown[text]) { diff --git a/src/settings.js b/src/settings.js index 1bfcf92a..36f53c3c 100644 --- a/src/settings.js +++ b/src/settings.js @@ -15,7 +15,7 @@ var QUANTUM_SIZE = 4; // This is the size of an individual field in a structure. // the normal value of 4 means all fields take 4 memory addresses, // as per the norm on a 32-bit machine. // - // 1 is somewhat faster than 4, but dangerous. + // Changing this from the default of 4 is deprecated. var CORRECT_SIGNS = 1; // Whether we make sure to convert unsigned values to signed values. // Decreases performance with additional runtime checks. Might not be @@ -63,7 +63,7 @@ var RELOOPER = 'relooper.js'; // Loads the relooper from this path relative to c var USE_TYPED_ARRAYS = 2; // Use typed arrays for the heap. See https://github.com/kripken/emscripten/wiki/Code-Generation-Modes/ // 0 means no typed arrays are used. // 1 has two heaps, IHEAP (int32) and FHEAP (double), - // and addresses there are a match for normal addresses. + // and addresses there are a match for normal addresses. This is deprecated. // 2 is a single heap, accessible through views as int8, int32, etc. This is // the recommended mode both for performance and for compatibility. var USE_FHEAP = 1; // Relevant in USE_TYPED_ARRAYS == 1. If this is disabled, only IHEAP will be used, and FHEAP @@ -171,6 +171,8 @@ var GL_UNSAFE_OPTS = 1; // Enables some potentially-unsafe optimizations in GL e var FULL_ES2 = 0; // Forces support for all GLES2 features, not just the WebGL-friendly subset. var FORCE_GL_EMULATION = 0; // Forces inclusion of full GL emulation code. +var UTF_STRING_SUPPORT = 1; // Perform utf-8 conversion between C and JS strings (adds overhead in such conversions) + var DISABLE_EXCEPTION_CATCHING = 0; // Disables generating code to actually catch exceptions. If the code you // are compiling does not actually rely on catching exceptions (but the // compiler generates code for it, maybe because of stdlibc++ stuff), @@ -230,13 +232,14 @@ var EXPORTED_FUNCTIONS = ['_main']; // Functions that are explicitly exported. T // the generated code even after running closure compiler (on "Module"). // Note the necessary prefix of "_". -var DEFAULT_LIBRARY_FUNCS_TO_INCLUDE = ['memcpy', 'memset', 'malloc', 'free', '$Browser']; // JS library functions (C functions implemented in JS) - // that we include by default. If you want to make sure - // something is included by the JS compiler, add it here. - // For example, if you do not use some emscripten_* - // C API call from C, but you want to call it from JS, - // add it here (and in EXPORTED FUNCTIONS with prefix - // "_", for closure). +// JS library functions (C functions implemented in JS) +// that we include by default. If you want to make sure +// something is included by the JS compiler, add it here. +// For example, if you do not use some emscripten_* +// C API call from C, but you want to call it from JS, +// add it here (and in EXPORTED FUNCTIONS with prefix +// "_", for closure). +var DEFAULT_LIBRARY_FUNCS_TO_INCLUDE = ['memcpy', 'memset', 'malloc', 'free', 'strlen', '$Browser']; var LIBRARY_DEPS_TO_AUTOEXPORT = ['memcpy']; // This list is also used to determine // auto-exporting of library dependencies (i.e., functions that @@ -332,6 +335,14 @@ var ASM_JS = 0; // If 1, generate code in asm.js format. XXX This is highly expe // and will not work on most codebases yet. It is NOT recommended that you // try this yet. +var PGO = 0; // Enables profile-guided optimization in the form of runtime checks for + // which functions are actually called. Emits a list during shutdown that you + // can pass to DEAD_FUNCTIONS (you can also emit the list manually by + // calling PGOMonitor.dump()); +var DEAD_FUNCTIONS = []; // A list of functions that no code will be emitted for, and + // a runtime abort will happen if they are called + // TODO: options to lazily load such functions + var EXPLICIT_ZEXT = 0; // If 1, generate an explicit conversion of zext i1 to i32, using ?: var NECESSARY_BLOCKADDRS = []; // List of (function, block) for all block addresses that are taken. diff --git a/src/shell.html b/src/shell.html index 4f39b26a..8743d403 100644 --- a/src/shell.html +++ b/src/shell.html @@ -19,7 +19,14 @@ </div> <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas> <hr/> - <div class="emscripten"><input type="button" value="fullscreen" onclick="Module.requestFullScreen()"></div> + <div class="emscripten"> + <input type="checkbox" id="resize">Resize canvas + <input type="checkbox" id="pointerLock" checked>Lock/hide mouse pointer + + <input type="button" value="Fullscreen" onclick="Module.requestFullScreen(document.getElementById('pointerLock').checked, + document.getElementById('resize').checked)"> + </div> + <hr/> <textarea class="emscripten" id="output" rows="8"></textarea> <hr> diff --git a/src/utility.js b/src/utility.js index 8db37c61..19444675 100644 --- a/src/utility.js +++ b/src/utility.js @@ -267,6 +267,15 @@ function set() { } var unset = keys; +function numberedSet() { + var args = typeof arguments[0] === 'object' ? arguments[0] : arguments; + var ret = {}; + for (var i = 0; i < args.length; i++) { + ret[args[i]] = i; + } + return ret; +} + function setSub(x, y) { var ret = set(keys(x)); for (yy in y) { diff --git a/system/include/AL/al.h b/system/include/AL/al.h new file mode 100644 index 00000000..d7234e32 --- /dev/null +++ b/system/include/AL/al.h @@ -0,0 +1,172 @@ +#ifndef OPENAL_AL_H__ +#define OPENAL_AL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define AL_BITS 0x2002 +#define AL_BUFFER 0x1009 +#define AL_BUFFERS_PROCESSED 0x1016 +#define AL_BUFFERS_QUEUED 0x1015 +#define AL_BYTE_OFFSET 0x1026 +#define AL_CHANNELS 0x2003 +#define AL_CONE_INNER_ANGLE 0x1001 +#define AL_CONE_OUTER_ANGLE 0x1002 +#define AL_CONE_OUTER_GAIN 0x1022 +#define AL_DIRECTION 0x1005 +#define AL_DISTANCE_MODEL 0xD000 +#define AL_DOPPLER_FACTOR 0xC000 +#define AL_DOPPLER_VELOCITY 0xC001 +#define AL_EXPONENT_DISTANCE 0xD005 +#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006 +#define AL_EXTENSIONS 0xB004 +#define AL_FALSE 0 +#define AL_FORMAT_MONO16 0x1101 +#define AL_FORMAT_MONO8 0x1100 +#define AL_FORMAT_STEREO16 0x1103 +#define AL_FORMAT_STEREO8 0x1102 +#define AL_FREQUENCY 0x2001 +#define AL_GAIN 0x100A +#define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION +#define AL_ILLEGAL_ENUM AL_INVALID_ENUM +#define AL_INITIAL 0x1011 +#define AL_INVALID (-1) +#define AL_INVALID_ENUM 0xA002 +#define AL_INVALID_NAME 0xA001 +#define AL_INVALID_OPERATION 0xA004 +#define AL_INVALID_VALUE 0xA003 +#define AL_INVERSE_DISTANCE 0xD001 +#define AL_INVERSE_DISTANCE_CLAMPED 0xD002 +#define AL_LINEAR_DISTANCE 0xD003 +#define AL_LINEAR_DISTANCE_CLAMPED 0xD004 +#define AL_LOOPING 0x1007 +#define AL_MAX_DISTANCE 0x1023 +#define AL_MAX_GAIN 0x100E +#define AL_MIN_GAIN 0x100D +#define AL_NONE 0 +#define AL_NO_ERROR 0 +#define AL_ORIENTATION 0x100F +#define AL_OUT_OF_MEMORY 0xA005 +#define AL_PAUSED 0x1013 +#define AL_PENDING 0x2011 +#define AL_PITCH 0x1003 +#define AL_PLAYING 0x1012 +#define AL_POSITION 0x1004 +#define AL_PROCESSED 0x2012 +#define AL_REFERENCE_DISTANCE 0x1020 +#define AL_RENDERER 0xB003 +#define AL_ROLLOFF_FACTOR 0x1021 +#define AL_SAMPLE_OFFSET 0x1025 +#define AL_SEC_OFFSET 0x1024 +#define AL_SIZE 0x2004 +#define AL_SOURCE_RELATIVE 0x202 +#define AL_SOURCE_STATE 0x1010 +#define AL_SOURCE_TYPE 0x1027 +#define AL_SPEED_OF_SOUND 0xC003 +#define AL_STATIC 0x1028 +#define AL_STOPPED 0x1014 +#define AL_STREAMING 0x1029 +#define AL_TRUE 1 +#define AL_UNDETERMINED 0x1030 +#define AL_UNUSED 0x2010 +#define AL_VELOCITY 0x1006 +#define AL_VENDOR 0xB001 +#define AL_VERSION 0xB002 +#define AL_VERSION_1_0 +#define AL_VERSION_1_1 +#define OPENAL + +typedef char ALboolean; +typedef char ALchar; +typedef double ALdouble; +typedef float ALfloat; +typedef int ALenum; +typedef int ALint; +typedef int ALsizei; +typedef short ALshort; +typedef signed char ALbyte; +typedef unsigned char ALubyte; +typedef unsigned int ALuint; +typedef unsigned short ALushort; +typedef void ALvoid; + +extern ALboolean alGetBoolean(ALenum param); +extern ALboolean alIsBuffer(ALuint buffer); +extern ALboolean alIsEnabled(ALenum capability); +extern ALboolean alIsExtensionPresent(const ALchar *extname); +extern ALboolean alIsSource(ALuint source); +extern ALdouble alGetDouble(ALenum param); +extern ALenum alGetEnumValue(const ALchar *ename); +extern ALenum alGetError(); +extern ALfloat alGetFloat(ALenum param); +extern ALint alGetInteger(ALenum param); +extern const ALchar *alGetString(ALenum param); +extern void *alGetProcAddress(const ALchar *fname); +extern void alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +extern void alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3); +extern void alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq); +extern void alBufferf(ALuint buffer, ALenum param, ALfloat value); +extern void alBufferfv(ALuint buffer, ALenum param, const ALfloat *values); +extern void alBufferi(ALuint buffer, ALenum param, ALint value); +extern void alBufferiv(ALuint buffer, ALenum param, const ALint *values); +extern void alDeleteBuffers(ALsizei n, const ALuint *buffers); +extern void alDeleteSources(ALsizei n, const ALuint *sources); +extern void alDisable(ALenum capability); +extern void alDistanceModel(ALenum distanceModel); +extern void alDopplerFactor(ALfloat value); +extern void alDopplerVelocity(ALfloat value); +extern void alEnable(ALenum capability); +extern void alGenBuffers(ALsizei n, ALuint *buffers); +extern void alGenSources(ALsizei n, ALuint *sources); +extern void alGetBooleanv(ALenum param, ALboolean *values); +extern void alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +extern void alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3); +extern void alGetBufferf(ALuint buffer, ALenum param, ALfloat *value); +extern void alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values); +extern void alGetBufferi(ALuint buffer, ALenum param, ALint *value); +extern void alGetBufferiv(ALuint buffer, ALenum param, ALint *values); +extern void alGetDoublev(ALenum param, ALdouble *values); +extern void alGetFloatv(ALenum param, ALfloat *values); +extern void alGetIntegerv(ALenum param, ALint *values); +extern void alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +extern void alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3); +extern void alGetListenerf(ALenum param, ALfloat *value); +extern void alGetListenerfv(ALenum param, ALfloat *values); +extern void alGetListeneri(ALenum param, ALint *value); +extern void alGetListeneriv(ALenum param, ALint *values); +extern void alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +extern void alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3); +extern void alGetSourcef(ALuint source, ALenum param, ALfloat *value); +extern void alGetSourcefv(ALuint source, ALenum param, ALfloat *values); +extern void alGetSourcei(ALuint source, ALenum param, ALint *value); +extern void alGetSourceiv(ALuint source, ALenum param, ALint *values); +extern void alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +extern void alListener3i(ALenum param, ALint value1, ALint value2, ALint value3); +extern void alListenerf(ALenum param, ALfloat value); +extern void alListenerfv(ALenum param, const ALfloat *values); +extern void alListeneri(ALenum param, ALint value); +extern void alListeneriv(ALenum param, const ALint *values); +extern void alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +extern void alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); +extern void alSourcePause(ALuint source); +extern void alSourcePausev(ALsizei n, const ALuint *sources); +extern void alSourcePlay(ALuint source); +extern void alSourcePlayv(ALsizei n, const ALuint *sources); +extern void alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers); +extern void alSourceRewind(ALuint source); +extern void alSourceRewindv(ALsizei n, const ALuint *sources); +extern void alSourceStop(ALuint source); +extern void alSourceStopv(ALsizei n, const ALuint *sources); +extern void alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers); +extern void alSourcef(ALuint source, ALenum param, ALfloat value); +extern void alSourcefv(ALuint source, ALenum param, const ALfloat *values); +extern void alSourcei(ALuint source, ALenum param, ALint value); +extern void alSourceiv(ALuint source, ALenum param, const ALint *values); +extern void alSpeedOfSound(ALfloat value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/system/include/AL/alc.h b/system/include/AL/alc.h new file mode 100644 index 00000000..6ff7cb9b --- /dev/null +++ b/system/include/AL/alc.h @@ -0,0 +1,84 @@ +#ifndef OPENAL_ALC_H__ +#define OPENAL_ALC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ALCAPI ALC_API +#define ALCAPIENTRY ALC_APIENTRY +#define ALC_ALL_ATTRIBUTES 0x1003 +#define ALC_ALL_DEVICES_SPECIFIER 0x1013 +#define ALC_ATTRIBUTES_SIZE 0x1002 +#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311 +#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310 +#define ALC_CAPTURE_SAMPLES 0x312 +#define ALC_DEFAULT_ALL_DEVICES_SPECIFIER 0x1012 +#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004 +#define ALC_DEVICE_SPECIFIER 0x1005 +#define ALC_ENUMERATE_ALL_EXT 1 +#define ALC_EXTENSIONS 0x1006 +#define ALC_EXT_CAPTURE 1 +#define ALC_FALSE 0 +#define ALC_FREQUENCY 0x1007 +#define ALC_INVALID 0 +#define ALC_INVALID_CONTEXT 0xA002 +#define ALC_INVALID_DEVICE 0xA001 +#define ALC_INVALID_ENUM 0xA003 +#define ALC_INVALID_VALUE 0xA004 +#define ALC_MAJOR_VERSION 0x1000 +#define ALC_MINOR_VERSION 0x1001 +#define ALC_MONO_SOURCES 0x1010 +#define ALC_NO_ERROR 0 +#define ALC_OUT_OF_MEMORY 0xA005 +#define ALC_REFRESH 0x1008 +#define ALC_STEREO_SOURCES 0x1011 +#define ALC_SYNC 0x1009 +#define ALC_TRUE 1 +#define ALC_VERSION_0_1 1 +#define AL_ALC_H + +struct ALCcontext_struct; +struct ALCdevice_struct; +typedef char ALCboolean; +typedef char ALCchar; +typedef double ALCdouble; +typedef float ALCfloat; +typedef int ALCenum; +typedef int ALCint; +typedef int ALCsizei; +typedef short ALCshort; +typedef signed char ALCbyte; +typedef struct ALCcontext_struct ALCcontext; +typedef struct ALCdevice_struct ALCdevice; +typedef unsigned char ALCubyte; +typedef unsigned int ALCuint; +typedef unsigned short ALCushort; +typedef void ALCvoid; + +extern ALCboolean alcCaptureCloseDevice(ALCdevice *device); +extern ALCboolean alcCloseDevice(ALCdevice *device); +extern ALCboolean alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname); +extern ALCboolean alcMakeContextCurrent(ALCcontext *context); +extern ALCcontext *alcCreateContext(ALCdevice *device, const ALCint *attrlist); +extern ALCcontext *alcGetCurrentContext(); +extern ALCdevice *alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize); +extern ALCdevice *alcGetContextsDevice(ALCcontext *context); +extern ALCdevice *alcOpenDevice(const ALCchar *devicename); +extern ALCenum alcGetEnumValue(ALCdevice *device, const ALCchar *enumname); +extern ALCenum alcGetError(ALCdevice *device); +extern const ALCchar *alcGetString(ALCdevice *device, ALCenum param); +extern void *alcGetProcAddress(ALCdevice *device, const ALCchar *funcname); +extern void alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); +extern void alcCaptureStart(ALCdevice *device); +extern void alcCaptureStop(ALCdevice *device); +extern void alcDestroyContext(ALCcontext *context); +extern void alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values); +extern void alcProcessContext(ALCcontext *context); +extern void alcSuspendContext(ALCcontext *context); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/system/include/emscripten/emscripten.h b/system/include/emscripten/emscripten.h index 427dda0c..61634b0e 100644 --- a/system/include/emscripten/emscripten.h +++ b/system/include/emscripten/emscripten.h @@ -60,7 +60,7 @@ extern void emscripten_async_run_script(const char *script, int millis); * that execution continues normally. Note that in both cases * we do not run global destructors, atexit, etc., since we * know the main loop will still be running, but if we do - * not simulate an infinite loop then the stack will be unwinded. + * not simulate an infinite loop then the stack will be unwound. * That means that if simulate_infinite_loop is false, and * you created an object on the stack, it will be cleaned up * before the main loop will be called the first time. @@ -215,7 +215,7 @@ void emscripten_async_wget_data(const char* url, void *arg, void (*onload)(void* * More feature-complete version of emscripten_async_wget. Note: * this version is experimental. * - * The requestype is 'GET' or 'POST', + * The requesttype is 'GET' or 'POST', * If is post request, param is the post parameter * like key=value&key2=value2. * The param 'arg' is a pointer will be pass to the callback diff --git a/system/include/err.h b/system/include/err.h new file mode 100644 index 00000000..a9b92ee6 --- /dev/null +++ b/system/include/err.h @@ -0,0 +1,95 @@ +/* $OpenBSD: err.h,v 1.10 2006/01/06 18:53:04 millert Exp $ */ +/* $NetBSD: err.h,v 1.11 1994/10/26 00:55:52 cgd Exp $ */ + +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)err.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _ERR_H_ +#define _ERR_H_ + +/* + * Don't use va_list in the err/warn prototypes. Va_list is typedef'd in two + * places (<machine/varargs.h> and <machine/stdarg.h>), so if we include one + * of them here we may collide with the utility's includes. It's unreasonable + * for utilities to have to include one of them to include err.h, so we get + * va_list from <machine/_types.h> and use it. + */ +#include <sys/cdefs.h> +//#include <machine/_types.h> +#include <stdarg.h> + +#define __dead __attribute__((__noreturn__)) + +__BEGIN_DECLS + +__dead void err(int, const char *, ...) + __attribute__((__format__ (printf, 2, 3))); +__dead void verr(int, const char *, va_list) + __attribute__((__format__ (printf, 2, 0))); +__dead void errx(int, const char *, ...) + __attribute__((__format__ (printf, 2, 3))); +__dead void verrx(int, const char *, va_list) + __attribute__((__format__ (printf, 2, 0))); +void warn(const char *, ...) + __attribute__((__format__ (printf, 1, 2))); +void vwarn(const char *, va_list) + __attribute__((__format__ (printf, 1, 0))); +void warnx(const char *, ...) + __attribute__((__format__ (printf, 1, 2))); +void vwarnx(const char *, va_list) + __attribute__((__format__ (printf, 1, 0))); + +/* + * The _* versions are for use in library functions so user-defined + * versions of err*,warn* do not get used. + */ +__dead void _err(int, const char *, ...) + __attribute__((__format__ (printf, 2, 3))); +__dead void _verr(int, const char *, va_list) + __attribute__((__format__ (printf, 2, 0))); +__dead void _errx(int, const char *, ...) + __attribute__((__format__ (printf, 2, 3))); +__dead void _verrx(int, const char *, va_list) + __attribute__((__format__ (printf, 2, 0))); +void _warn(const char *, ...) + __attribute__((__format__ (printf, 1, 2))); +void _vwarn(const char *, va_list) + __attribute__((__format__ (printf, 1, 0))); +void _warnx(const char *, ...) + __attribute__((__format__ (printf, 1, 2))); +void _vwarnx(const char *, va_list) + __attribute__((__format__ (printf, 1, 0))); + +#undef __dead + +__END_DECLS + +#endif /* !_ERR_H_ */ diff --git a/system/include/libc/ctype.h b/system/include/libc/ctype.h index 26d3c6ce..383a8db1 100644 --- a/system/include/libc/ctype.h +++ b/system/include/libc/ctype.h @@ -72,11 +72,14 @@ _CONST #define isgraph(__c) (__ctype_lookup(__c)&(CTYPE__P|CTYPE__U|CTYPE__L|CTYPE__N)) #define iscntrl(__c) (__ctype_lookup(__c)&CTYPE__C) +/* XXX: EMSCRIPTEN: We alter the names of __typeof__ declarations to + reduce the chance of them conflicting when expanded */ + #if defined(__GNUC__) && \ (!defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901L) #define isblank(__c) \ - __extension__ ({ __typeof__ (__c) __x = (__c); \ - (__ctype_lookup(__x)&_B) || (int) (__x) == '\t';}) + __extension__ ({ __typeof__ (__c) __ctb_x = (__c); \ + (__ctype_lookup(__ctb_x)&_B) || (int) (__ctb_x) == '\t';}) #endif @@ -86,20 +89,20 @@ _CONST # if defined(__GNUC__) # if !defined (_MB_EXTENDED_CHARSETS_ISO) && !defined (_MB_EXTENDED_CHARSETS_WINDOWS) # define toupper(__c) \ - __extension__ ({ __typeof__ (__c) __x = (__c); \ - islower (__x) ? (int) __x - 'a' + 'A' : (int) __x;}) + __extension__ ({ __typeof__ (__c) __cttu_x = (__c); \ + islower (__cttu_x) ? (int) __cttu_x - 'a' + 'A' : (int) __cttu_x;}) # define tolower(__c) \ - __extension__ ({ __typeof__ (__c) __x = (__c); \ - isupper (__x) ? (int) __x - 'A' + 'a' : (int) __x;}) + __extension__ ({ __typeof__ (__c) __cttl_x = (__c); \ + isupper (__cttl_x) ? (int) __cttl_x - 'A' + 'a' : (int) __cttl_x;}) # else /* _MB_EXTENDED_CHARSETS* */ /* Allow a gcc warning if the user passed 'char', but defer to the function. */ # define toupper(__c) \ - __extension__ ({ __typeof__ (__c) __x = (__c); \ - (void) __ctype_ptr__[__x]; (toupper) (__x);}) + __extension__ ({ __typeof__ (__c) __cttu_x = (__c); \ + (void) __ctype_ptr__[__cttu_x]; (toupper) (__cttu_x);}) # define tolower(__c) \ - __extension__ ({ __typeof__ (__c) __x = (__c); \ - (void) __ctype_ptr__[__x]; (tolower) (__x);}) + __extension__ ({ __typeof__ (__c) __cttl_x = (__c); \ + (void) __ctype_ptr__[__cttl_x]; (tolower) (__cttl_x);}) # endif /* _MB_EXTENDED_CHARSETS* */ # endif /* __GNUC__ */ #endif /* !__cplusplus */ diff --git a/system/include/libc/iso646.h b/system/include/libc/iso646.h new file mode 100644 index 00000000..dca13c5b --- /dev/null +++ b/system/include/libc/iso646.h @@ -0,0 +1,43 @@ +/*===---- iso646.h - Standard header for alternate spellings of operators---=== + * + * Copyright (c) 2008 Eli Friedman + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + *===-----------------------------------------------------------------------=== + */ + +#ifndef __ISO646_H +#define __ISO646_H + +#ifndef __cplusplus +#define and && +#define and_eq &= +#define bitand & +#define bitor | +#define compl ~ +#define not ! +#define not_eq != +#define or || +#define or_eq |= +#define xor ^ +#define xor_eq ^= +#endif + +#endif /* __ISO646_H */ diff --git a/system/include/libc/math.h b/system/include/libc/math.h index d963c6c8..e2f8cdef 100644 --- a/system/include/libc/math.h +++ b/system/include/libc/math.h @@ -210,25 +210,28 @@ extern int __signbitd (double x); ((sizeof(__x) == sizeof(float)) ? __signbitf(__x) : \ __signbitd(__x)) +/* XXX: EMSCRIPTEN: We alter the names of __typeof__ declarations to + reduce the chance of them conflicting when expanded */ + #define isgreater(x,y) \ - (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ - !isunordered(__x,__y) && (__x > __y);})) + (__extension__ ({__typeof__(x) __isg_x = (x); __typeof__(y) __isg_y = (y); \ + !isunordered(__isg_x,__isg_y) && (__isg_x > __isg_y);})) #define isgreaterequal(x,y) \ - (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ - !isunordered(__x,__y) && (__x >= __y);})) + (__extension__ ({__typeof__(x) __isge_x = (x); __typeof__(y) __isge_y = (y); \ + !isunordered(__isge_x,__isge_y) && (__isge_x >= __isge_y);})) #define isless(x,y) \ - (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ - !isunordered(__x,__y) && (__x < __y);})) + (__extension__ ({__typeof__(x) __isl_x = (x); __typeof__(y) __isl_y = (y); \ + !isunordered(__isl_x,__isl_y) && (__isl_x < __isl_y);})) #define islessequal(x,y) \ - (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ - !isunordered(__x,__y) && (__x <= __y);})) + (__extension__ ({__typeof__(x) __isle_x = (x); __typeof__(y) __isle_y = (y); \ + !isunordered(__isle_x,__isle_y) && (__isle_x <= __isle_y);})) #define islessgreater(x,y) \ - (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ - !isunordered(__x,__y) && (__x < __y || __x > __y);})) + (__extension__ ({__typeof__(x) __islg_x = (x); __typeof__(y) __islg_y = (y); \ + !isunordered(__islg_x,__islg_y) && (__islg_x < __islg_y || __islg_x > __islg_y);})) #define isunordered(a,b) \ - (__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \ - fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;})) + (__extension__ ({__typeof__(a) __isu_a = (a); __typeof__(b) __isu_b = (b); \ + fpclassify(__isu_a) == FP_NAN || fpclassify(__isu_b) == FP_NAN;})) /* Non ANSI double precision functions. */ diff --git a/system/include/stdbool.h b/system/include/stdbool.h index f970ade8..561eed3f 100644 --- a/system/include/stdbool.h +++ b/system/include/stdbool.h @@ -2,12 +2,13 @@ #ifndef __stdbool_h__ #define __stdbool_h__ +#define __bool_true_false_are_defined 1 + #ifndef __cplusplus #define bool _Bool #define true 1 #define false 0 -#define __bool_true_false_are_defined 1 #endif diff --git a/system/lib/libc.symbols b/system/lib/libc.symbols index d41f4140..1342d938 100644 --- a/system/lib/libc.symbols +++ b/system/lib/libc.symbols @@ -1,3 +1,6 @@ +getopt +getopt_long +getopt_long_only malloc free calloc @@ -48,3 +51,25 @@ _ZNSt20bad_array_new_lengthC2Ev _ZNSt20bad_array_new_lengthD0Ev _ZNSt20bad_array_new_lengthD1Ev _ZNSt20bad_array_new_lengthD2Ev +warn +warnx +err +errx +_warn +_warnx +_err +_errx +vwarn +vwarnx +verr +verrx +_vwarn +_vwarnx +_verr +_verrx +strtod +strtold +strtof +strtod_l +strtold_l +atof diff --git a/system/lib/libc/gen/err.c b/system/lib/libc/gen/err.c new file mode 100644 index 00000000..218a3bfc --- /dev/null +++ b/system/lib/libc/gen/err.c @@ -0,0 +1,49 @@ +/* $OpenBSD: err.c,v 1.11 2012/12/05 23:19:59 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <stdarg.h> + +#define __dead __attribute__((__noreturn__)) + +/* PRINTFLIKE2 */ +__dead void +_err(int eval, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + _verr(eval, fmt, ap); + va_end(ap); +} + +/* PRINTFLIKE2 */ +__dead void +err(int eval, const char *fmt, ...) __attribute__((weak, alias("_err"))); diff --git a/system/lib/libc/gen/errx.c b/system/lib/libc/gen/errx.c new file mode 100644 index 00000000..a16643c7 --- /dev/null +++ b/system/lib/libc/gen/errx.c @@ -0,0 +1,49 @@ +/* $OpenBSD: errx.c,v 1.10 2012/12/05 23:19:59 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <stdarg.h> + +#define __dead __attribute__((__noreturn__)) + +/* PRINTFLIKE2 */ +__dead void +_errx(int eval, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + _verrx(eval, fmt, ap); + va_end(ap); +} + +/* PRINTFLIKE2 */ +__dead void +errx(int eval, const char *fmt, ...) __attribute__((weak, alias("_errx"))); diff --git a/system/lib/libc/gen/verr.c b/system/lib/libc/gen/verr.c new file mode 100644 index 00000000..90f5870f --- /dev/null +++ b/system/lib/libc/gen/verr.c @@ -0,0 +1,58 @@ +/* $OpenBSD: verr.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> + +extern char *__progname; /* Program name, from crt0. */ + +#define __dead __attribute__((__noreturn__)) + +__dead void +_verr(int eval, const char *fmt, va_list ap) +{ + int sverrno; + + sverrno = errno; + (void)fprintf(stderr, "%s: ", __progname); + if (fmt != NULL) { + (void)vfprintf(stderr, fmt, ap); + (void)fprintf(stderr, ": "); + } + (void)fprintf(stderr, "%s\n", strerror(sverrno)); + exit(eval); +} + +__dead void +verr(int eval, const char *fmt, va_list ap) __attribute__((weak, alias("_verr"))); diff --git a/system/lib/libc/gen/verrx.c b/system/lib/libc/gen/verrx.c new file mode 100644 index 00000000..b712c65c --- /dev/null +++ b/system/lib/libc/gen/verrx.c @@ -0,0 +1,51 @@ +/* $OpenBSD: verrx.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> + +extern char *__progname; /* Program name, from crt0. */ + +#define __dead __attribute__((__noreturn__)) + +__dead void +_verrx(int eval, const char *fmt, va_list ap) +{ + (void)fprintf(stderr, "%s: ", __progname); + if (fmt != NULL) + (void)vfprintf(stderr, fmt, ap); + (void)fprintf(stderr, "\n"); + exit(eval); +} + +__dead void +verrx(int eval, const char *fmt, va_list ap) __attribute__((weak, alias("_verrx"))); diff --git a/system/lib/libc/gen/vwarn.c b/system/lib/libc/gen/vwarn.c new file mode 100644 index 00000000..37acef35 --- /dev/null +++ b/system/lib/libc/gen/vwarn.c @@ -0,0 +1,55 @@ +/* $OpenBSD: vwarn.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +extern char *__progname; /* Program name, from crt0. */ + +void +_vwarn(const char *fmt, va_list ap) +{ + int sverrno; + + sverrno = errno; + (void)fprintf(stderr, "%s: ", __progname); + if (fmt != NULL) { + (void)vfprintf(stderr, fmt, ap); + (void)fprintf(stderr, ": "); + } + (void)fprintf(stderr, "%s\n", strerror(sverrno)); +} + +void +vwarn(const char *fmt, va_list ap) __attribute__((weak, alias("_vwarn"))); + diff --git a/system/lib/libc/gen/vwarnx.c b/system/lib/libc/gen/vwarnx.c new file mode 100644 index 00000000..a81a5a0d --- /dev/null +++ b/system/lib/libc/gen/vwarnx.c @@ -0,0 +1,48 @@ +/* $OpenBSD: vwarnx.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <stdio.h> +#include <stdarg.h> + +extern char *__progname; /* Program name, from crt0. */ + +void +_vwarnx(const char *fmt, va_list ap) +{ + (void)fprintf(stderr, "%s: ", __progname); + if (fmt != NULL) + (void)vfprintf(stderr, fmt, ap); + (void)fprintf(stderr, "\n"); +} + +void +vwarnx(const char *fmt, va_list ap) __attribute__((weak, alias("_vwarnx"))); + diff --git a/system/lib/libc/gen/warn.c b/system/lib/libc/gen/warn.c new file mode 100644 index 00000000..c0803ab9 --- /dev/null +++ b/system/lib/libc/gen/warn.c @@ -0,0 +1,49 @@ +/* $OpenBSD: warn.c,v 1.10 2012/12/05 23:20:00 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <stdarg.h> + +#define __dead __attribute__((__noreturn__)) + +/* PRINTFLIKE1 */ +void +_warn(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + _vwarn(fmt, ap); + va_end(ap); +} + +/* PRINTFLIKE1 */ +void +warn(const char *fmt, ...) __attribute__((weak, alias("warn"))); diff --git a/system/lib/libc/gen/warnx.c b/system/lib/libc/gen/warnx.c new file mode 100644 index 00000000..7909cf2c --- /dev/null +++ b/system/lib/libc/gen/warnx.c @@ -0,0 +1,49 @@ +/* $OpenBSD: warnx.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <err.h> +#include <stdarg.h> + +#define __dead __attribute__((__noreturn__)) + +/* PRINTFLIKE1 */ +void +_warnx(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + _vwarnx(fmt, ap); + va_end(ap); +} + +/* PRINTFLIKE1 */ +void +warnx(const char *fmt, ...) __attribute__((weak, alias("_warnx"))); diff --git a/system/lib/libc/stdlib/getopt_long.c b/system/lib/libc/stdlib/getopt_long.c new file mode 100644 index 00000000..e149fe0a --- /dev/null +++ b/system/lib/libc/stdlib/getopt_long.c @@ -0,0 +1,511 @@ +/* $OpenBSD: getopt_long.c,v 1.25 2011/03/05 22:10:11 guenther Exp $ */ +/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ + +/* + * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ +/*- + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <err.h> +#include <errno.h> +#include <getopt.h> +#include <stdlib.h> +#include <string.h> + +int opterr = 1; /* if error message should be printed */ +int optind = 1; /* index into parent argv vector */ +int optopt = '?'; /* character checked for validity */ +int optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define PRINT_ERROR ((opterr) && (*options != ':')) + +#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ +#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ +#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ + +/* return values */ +#define BADCH (int)'?' +#define BADARG ((*options == ':') ? (int)':' : (int)'?') +#define INORDER (int)1 + +#define EMSG "" + +static int getopt_internal(int, char * const *, const char *, + const struct option *, int *, int); +static int parse_long_options(char * const *, const char *, + const struct option *, int *, int); +static int gcd(int, int); +static void permute_args(int, int, int, char * const *); + +static char *place = EMSG; /* option letter processing */ + +/* XXX: set optreset to 1 rather than these two */ +static int nonopt_start = -1; /* first non option argument (for permute) */ +static int nonopt_end = -1; /* first option after non options (for permute) */ + +/* Error messages */ +static const char recargchar[] = "option requires an argument -- %c"; +static const char recargstring[] = "option requires an argument -- %s"; +static const char ambig[] = "ambiguous option -- %.*s"; +static const char noarg[] = "option doesn't take an argument -- %.*s"; +static const char illoptchar[] = "unknown option -- %c"; +static const char illoptstring[] = "unknown option -- %s"; + +/* + * Compute the greatest common divisor of a and b. + */ +static int +gcd(int a, int b) +{ + int c; + + c = a % b; + while (c != 0) { + a = b; + b = c; + c = a % b; + } + + return (b); +} + +/* + * Exchange the block from nonopt_start to nonopt_end with the block + * from nonopt_end to opt_end (keeping the same order of arguments + * in each block). + */ +static void +permute_args(int panonopt_start, int panonopt_end, int opt_end, + char * const *nargv) +{ + int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; + char *swap; + + /* + * compute lengths of blocks and number and size of cycles + */ + nnonopts = panonopt_end - panonopt_start; + nopts = opt_end - panonopt_end; + ncycle = gcd(nnonopts, nopts); + cyclelen = (opt_end - panonopt_start) / ncycle; + + for (i = 0; i < ncycle; i++) { + cstart = panonopt_end+i; + pos = cstart; + for (j = 0; j < cyclelen; j++) { + if (pos >= panonopt_end) + pos -= nnonopts; + else + pos += nopts; + swap = nargv[pos]; + /* LINTED const cast */ + ((char **) nargv)[pos] = nargv[cstart]; + /* LINTED const cast */ + ((char **)nargv)[cstart] = swap; + } + } +} + +/* + * parse_long_options -- + * Parse long options in argc/argv argument vector. + * Returns -1 if short_too is set and the option does not match long_options. + */ +static int +parse_long_options(char * const *nargv, const char *options, + const struct option *long_options, int *idx, int short_too) +{ + char *current_argv, *has_equal; + size_t current_argv_len; + int i, match; + + current_argv = place; + match = -1; + + optind++; + + if ((has_equal = strchr(current_argv, '=')) != NULL) { + /* argument found (--option=arg) */ + current_argv_len = has_equal - current_argv; + has_equal++; + } else + current_argv_len = strlen(current_argv); + + for (i = 0; long_options[i].name; i++) { + /* find matching long option */ + if (strncmp(current_argv, long_options[i].name, + current_argv_len)) + continue; + + if (strlen(long_options[i].name) == current_argv_len) { + /* exact match */ + match = i; + break; + } + /* + * If this is a known short option, don't allow + * a partial match of a single character. + */ + if (short_too && current_argv_len == 1) + continue; + + if (match == -1) /* partial match */ + match = i; + else { + /* ambiguous abbreviation */ + if (PRINT_ERROR) + warnx(ambig, (int)current_argv_len, + current_argv); + optopt = 0; + return (BADCH); + } + } + if (match != -1) { /* option found */ + if (long_options[match].has_arg == no_argument + && has_equal) { + if (PRINT_ERROR) + warnx(noarg, (int)current_argv_len, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + return (BADARG); + } + if (long_options[match].has_arg == required_argument || + long_options[match].has_arg == optional_argument) { + if (has_equal) + optarg = has_equal; + else if (long_options[match].has_arg == + required_argument) { + /* + * optional argument doesn't use next nargv + */ + optarg = nargv[optind++]; + } + } + if ((long_options[match].has_arg == required_argument) + && (optarg == NULL)) { + /* + * Missing argument; leading ':' indicates no error + * should be generated. + */ + if (PRINT_ERROR) + warnx(recargstring, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + --optind; + return (BADARG); + } + } else { /* unknown option */ + if (short_too) { + --optind; + return (-1); + } + if (PRINT_ERROR) + warnx(illoptstring, current_argv); + optopt = 0; + return (BADCH); + } + if (idx) + *idx = match; + if (long_options[match].flag) { + *long_options[match].flag = long_options[match].val; + return (0); + } else + return (long_options[match].val); +} + +/* + * getopt_internal -- + * Parse argc/argv argument vector. Called by user level routines. + */ +static int +getopt_internal(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx, int flags) +{ + char *oli; /* option letter list index */ + int optchar, short_too; + static int posixly_correct = -1; + + if (options == NULL) + return (-1); + + /* + * XXX Some GNU programs (like cvs) set optind to 0 instead of + * XXX using optreset. Work around this braindamage. + */ + if (optind == 0) + optind = optreset = 1; + + /* + * Disable GNU extensions if POSIXLY_CORRECT is set or options + * string begins with a '+'. + */ + if (posixly_correct == -1 || optreset) + posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); + if (*options == '-') + flags |= FLAG_ALLARGS; + else if (posixly_correct || *options == '+') + flags &= ~FLAG_PERMUTE; + if (*options == '+' || *options == '-') + options++; + + optarg = NULL; + if (optreset) + nonopt_start = nonopt_end = -1; +start: + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc) { /* end of argument vector */ + place = EMSG; + if (nonopt_end != -1) { + /* do permutation, if we have to */ + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + else if (nonopt_start != -1) { + /* + * If we skipped non-options, set optind + * to the first of them. + */ + optind = nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + if (*(place = nargv[optind]) != '-' || + (place[1] == '\0' && strchr(options, '-') == NULL)) { + place = EMSG; /* found non-option */ + if (flags & FLAG_ALLARGS) { + /* + * GNU extension: + * return non-option as argument to option 1 + */ + optarg = nargv[optind++]; + return (INORDER); + } + if (!(flags & FLAG_PERMUTE)) { + /* + * If no permutation wanted, stop parsing + * at first non-option. + */ + return (-1); + } + /* do permutation */ + if (nonopt_start == -1) + nonopt_start = optind; + else if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + nonopt_start = optind - + (nonopt_end - nonopt_start); + nonopt_end = -1; + } + optind++; + /* process next argument */ + goto start; + } + if (nonopt_start != -1 && nonopt_end == -1) + nonopt_end = optind; + + /* + * If we have "-" do nothing, if "--" we are done. + */ + if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { + optind++; + place = EMSG; + /* + * We found an option (--), so if we skipped + * non-options, we have to permute. + */ + if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + } + + /* + * Check long options if: + * 1) we were passed some + * 2) the arg is not just "-" + * 3) either the arg starts with -- we are getopt_long_only() + */ + if (long_options != NULL && place != nargv[optind] && + (*place == '-' || (flags & FLAG_LONGONLY))) { + short_too = 0; + if (*place == '-') + place++; /* --foo long option */ + else if (*place != ':' && strchr(options, *place) != NULL) + short_too = 1; /* could be short option too */ + + optchar = parse_long_options(nargv, options, long_options, + idx, short_too); + if (optchar != -1) { + place = EMSG; + return (optchar); + } + } + + if ((optchar = (int)*place++) == (int)':' || + (optchar == (int)'-' && *place != '\0') || + (oli = strchr(options, optchar)) == NULL) { + /* + * If the user specified "-" and '-' isn't listed in + * options, return -1 (non-option) as per POSIX. + * Otherwise, it is an unknown option character (or ':'). + */ + if (optchar == (int)'-' && *place == '\0') + return (-1); + if (!*place) + ++optind; + if (PRINT_ERROR) + warnx(illoptchar, optchar); + optopt = optchar; + return (BADCH); + } + if (long_options != NULL && optchar == 'W' && oli[1] == ';') { + /* -W long-option */ + if (*place) /* no space */ + /* NOTHING */; + else if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else /* white space */ + place = nargv[optind]; + optchar = parse_long_options(nargv, options, long_options, + idx, 0); + place = EMSG; + return (optchar); + } + if (*++oli != ':') { /* doesn't take argument */ + if (!*place) + ++optind; + } else { /* takes (optional) argument */ + optarg = NULL; + if (*place) /* no white space */ + optarg = place; + else if (oli[1] != ':') { /* arg not optional */ + if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else + optarg = nargv[optind]; + } + place = EMSG; + ++optind; + } + /* dump back option letter */ + return (optchar); +} + +/* + * getopt -- + * Parse argc/argv argument vector. + * + * [eventually this will replace the BSD getopt] + */ +int +getopt(int nargc, char * const *nargv, const char *options) +{ + + /* + * We don't pass FLAG_PERMUTE to getopt_internal() since + * the BSD getopt(3) (unlike GNU) has never done this. + * + * Furthermore, since many privileged programs call getopt() + * before dropping privileges it makes sense to keep things + * as simple (and bug-free) as possible. + */ + return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); +} + +/* + * getopt_long -- + * Parse argc/argv argument vector. + */ +int +getopt_long(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx) +{ + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE)); +} + +/* + * getopt_long_only -- + * Parse argc/argv argument vector. + */ +int +getopt_long_only(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx) +{ + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE|FLAG_LONGONLY)); +} diff --git a/system/lib/libc/stdlib/strtod.c b/system/lib/libc/stdlib/strtod.c new file mode 100644 index 00000000..53191337 --- /dev/null +++ b/system/lib/libc/stdlib/strtod.c @@ -0,0 +1,305 @@ +/* + * strtod.c -- + * + * Source code for the "strtod" library procedure. + * + * Copyright (c) 1988-1993 The Regents of the University of California. + * Copyright (c) 1994 Sun Microsystems, Inc. + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies. The University of California + * makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without + * express or implied warranty. + * + * RCS: @(#) $Id$ + * + * Taken from http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8/missing/strtod.c + */ + +#include <stdlib.h> +#include <ctype.h> +#include <errno.h> +#include <locale.h> +extern int errno; + +#ifndef __STDC__ +# ifdef __GNUC__ +# define const __const__ +# else +# define const +# endif +#endif + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif +#ifndef NULL +#define NULL 0 +#endif + +static int maxExponent = 511; /* Largest possible base 10 exponent. Any + * exponent larger than this will already + * produce underflow or overflow, so there's + * no need to worry about additional digits. + */ +static double powersOf10[] = { /* Table giving binary powers of 10. Entry */ + 10., /* is 10^2^i. Used to convert decimal */ + 100., /* exponents into floating-point numbers. */ + 1.0e4, + 1.0e8, + 1.0e16, + 1.0e32, + 1.0e64, + 1.0e128, + 1.0e256 +}; + +/* + *---------------------------------------------------------------------- + * + * strtod -- + * + * This procedure converts a floating-point number from an ASCII + * decimal representation to internal double-precision format. + * + * Results: + * The return value is the double-precision floating-point + * representation of the characters in string. If endPtr isn't + * NULL, then *endPtr is filled in with the address of the + * next character after the last one that was part of the + * floating-point number. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +double +strtod(string, endPtr) + const char *string; /* A decimal ASCII floating-point number, + * optionally preceded by white space. + * Must have form "-I.FE-X", where I is the + * integer part of the mantissa, F is the + * fractional part of the mantissa, and X + * is the exponent. Either of the signs + * may be "+", "-", or omitted. Either I + * or F may be omitted, or both. The decimal + * point isn't necessary unless F is present. + * The "E" may actually be an "e". E and X + * may both be omitted (but not just one). + */ + char **endPtr; /* If non-NULL, store terminating character's + * address here. */ +{ + int sign, expSign = FALSE; + double fraction, dblExp, *d; + register const char *p; + register int c; + int exp = 0; /* Exponent read from "EX" field. */ + int fracExp = 0; /* Exponent that derives from the fractional + * part. Under normal circumstatnces, it is + * the negative of the number of digits in F. + * However, if I is very long, the last digits + * of I get dropped (otherwise a long I with a + * large negative exponent could cause an + * unnecessary overflow on I alone). In this + * case, fracExp is incremented one for each + * dropped digit. */ + int mantSize; /* Number of digits in mantissa. */ + int decPt; /* Number of mantissa digits BEFORE decimal + * point. */ + const char *pExp; /* Temporarily holds location of exponent + * in string. */ + + /* + * Strip off leading blanks and check for a sign. + */ + + p = string; + while (isspace(*p)) { + p += 1; + } + if (*p == '-') { + sign = TRUE; + p += 1; + } else { + if (*p == '+') { + p += 1; + } + sign = FALSE; + } + + /* + * Count the number of digits in the mantissa (including the decimal + * point), and also locate the decimal point. + */ + + decPt = -1; + for (mantSize = 0; ; mantSize += 1) + { + c = *p; + if (!isdigit(c)) { + if ((c != '.') || (decPt >= 0)) { + break; + } + decPt = mantSize; + } + p += 1; + } + + /* + * Now suck up the digits in the mantissa. Use two integers to + * collect 9 digits each (this is faster than using floating-point). + * If the mantissa has more than 18 digits, ignore the extras, since + * they can't affect the value anyway. + */ + + pExp = p; + p -= mantSize; + if (decPt < 0) { + decPt = mantSize; + } else { + mantSize -= 1; /* One of the digits was the point. */ + } + if (mantSize > 18) { + fracExp = decPt - 18; + mantSize = 18; + } else { + fracExp = decPt - mantSize; + } + if (mantSize == 0) { + fraction = 0.0; + p = string; + goto done; + } else { + int frac1, frac2; + frac1 = 0; + for ( ; mantSize > 9; mantSize -= 1) + { + c = *p; + p += 1; + if (c == '.') { + c = *p; + p += 1; + } + frac1 = 10*frac1 + (c - '0'); + } + frac2 = 0; + for (; mantSize > 0; mantSize -= 1) + { + c = *p; + p += 1; + if (c == '.') { + c = *p; + p += 1; + } + frac2 = 10*frac2 + (c - '0'); + } + fraction = (1.0e9 * frac1) + frac2; + } + + /* + * Skim off the exponent. + */ + + p = pExp; + if ((*p == 'E') || (*p == 'e')) { + p += 1; + if (*p == '-') { + expSign = TRUE; + p += 1; + } else { + if (*p == '+') { + p += 1; + } + expSign = FALSE; + } + while (isdigit(*p)) { + exp = exp * 10 + (*p - '0'); + p += 1; + } + } + if (expSign) { + exp = fracExp - exp; + } else { + exp = fracExp + exp; + } + + /* + * Generate a floating-point number that represents the exponent. + * Do this by processing the exponent one bit at a time to combine + * many powers of 2 of 10. Then combine the exponent with the + * fraction. + */ + + if (exp < 0) { + expSign = TRUE; + exp = -exp; + } else { + expSign = FALSE; + } + if (exp > maxExponent) { + exp = maxExponent; + errno = ERANGE; + } + dblExp = 1.0; + for (d = powersOf10; exp != 0; exp >>= 1, d += 1) { + if (exp & 01) { + dblExp *= *d; + } + } + if (expSign) { + fraction /= dblExp; + } else { + fraction *= dblExp; + } + +done: + if (endPtr != NULL) { + *endPtr = (char *) p; + } + + if (sign) { + return -fraction; + } + return fraction; +} + +/* + * Implementations added for emscripten. + */ +// XXX add real support for long double +long double +strtold(const char* nptr, char **endptr) +{ + return (long double) strtod(nptr, endptr); +} + +// use stdtod to handle strtof +float +strtof(const char* nptr, char **endptr) +{ + return (float) strtof(nptr, endptr); +} + +// XXX no locale support yet +double +strtod_l(const char* nptr, char **endptr, locale_t loc) +{ + return strtod(nptr, endptr); +} +long double +strtold_l(const char* nptr, char **endptr, locale_t loc) +{ + return strtold(nptr, endptr); +} + +double atof(const char* str) +{ + return strtod(str, (char **) NULL); +} diff --git a/tests/cases/breakinthemiddle3.ll b/tests/cases/breakinthemiddle3.ll new file mode 100644 index 00000000..e9173965 --- /dev/null +++ b/tests/cases/breakinthemiddle3.ll @@ -0,0 +1,26 @@ +@.str = private constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1] + +define linkonce_odr i32 @main() align 2 { + %333 = call i32 @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0] + %199 = trunc i8 1 to i1 ; [#uses=1] + switch i32 %333, label %label999 [ + i32 1000, label %label995 + ] ; switch should ignore all code after it in the block + ; No predecessors! + %a472 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + %a473 = extractvalue { i8*, i32 } %a472, 0 + %a474 = extractvalue { i8*, i32 } %a472, 1 + br label %label999 + +label995: + %333b = call i32 @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0] + br label %label999 + +label999: ; preds = %555 + ret i32 0 +} + +declare i32 @printf(i8*) +declare i32 @__gxx_personality_v0(...) + diff --git a/tests/cases/callundef.ll b/tests/cases/callundef.ll new file mode 100644 index 00000000..a540a08c --- /dev/null +++ b/tests/cases/callundef.ll @@ -0,0 +1,18 @@ +; ModuleID = 'tests/hello_world.bc' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-pc-linux-gnu" + +@.str = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*] + +; [#uses=0] +define i32 @main() { +entry: + %retval = alloca i32, align 4 ; [#uses=1 type=i32*] + store i32 0, i32* %retval + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0 type=i32] + call void undef(i32 55) + ret i32 1 +} + +; [#uses=1] +declare i32 @printf(i8*, ...) diff --git a/tests/cases/emptystruct.ll b/tests/cases/emptystruct.ll index d4165fdd..67967e65 100644 --- a/tests/cases/emptystruct.ll +++ b/tests/cases/emptystruct.ll @@ -11,7 +11,7 @@ entry: %z = alloca %struct.s, align 4 %0 = bitcast %struct.s* %z to i8* call void @llvm.memset.p0i8.i32(i8* %0, i8 0, i32 4, i32 4, i1 false) - %0 = call i32 bitcast (i32 (i8*)* @puts to i32 (i32*)*)(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ; [#uses=0] + %1 = call i32 bitcast (i32 (i8*)* @puts to i32 (i32*)*)(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ; [#uses=0] ret i32 0 } diff --git a/tests/cases/gepoverflow.ll b/tests/cases/gepoverflow.ll index 315e9100..d09afd87 100644 --- a/tests/cases/gepoverflow.ll +++ b/tests/cases/gepoverflow.ll @@ -26,7 +26,7 @@ entry: %3 = sub i32 %1, %baseint ; [#uses=1] %4 = sub i32 %2, %baseint ; [#uses=1] %5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %1, i32 %2) ; [#uses=0] - %5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %3, i32 %4) ; [#uses=0] + %6 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %3, i32 %4) ; [#uses=0] br label %return return: ; preds = %entry diff --git a/tests/cases/longjmp_tiny_noasm_invoke.ll b/tests/cases/longjmp_tiny_noasm_invoke.ll new file mode 100644 index 00000000..e1a72e00 --- /dev/null +++ b/tests/cases/longjmp_tiny_noasm_invoke.ll @@ -0,0 +1,71 @@ +; ModuleID = '/tmp/emscripten_temp/src.cpp.o' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-pc-linux-gnu" + +@_ZL3buf = internal global [20 x i16] zeroinitializer, align 2 +@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1 +@.str1 = private unnamed_addr constant [6 x i8] c"more\0A\00", align 1 + +define i32 @main() { + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %call = invoke i32 @setjmp(i16* getelementptr inbounds ([20 x i16]* @_ZL3buf, i32 0, i32 0)) returns_twice, !dbg !20 + to label %allgood unwind label %awful + +allgood: + %tobool = icmp ne i32 %call, 0, !dbg !20 + br i1 %tobool, label %if.else, label %if.then, !dbg !20 + +if.then: ; preds = %entry + %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0)), !dbg !22 + call void @longjmp(i16* getelementptr inbounds ([20 x i16]* @_ZL3buf, i32 0, i32 0), i32 10), !dbg !24 + br label %if.end, !dbg !25 + +if.else: ; preds = %entry + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0)), !dbg !26 + br label %if.end + +if.end: ; preds = %if.else, %if.then + ret i32 0, !dbg !28 + +awful: + ret i32 1 +} + +declare i32 @setjmp(i16*) returns_twice + +declare i32 @printf(i8*, ...) + +declare void @longjmp(i16*, i32) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"/tmp/emscripten_temp/src.cpp", metadata !"/home/alon/Dev/emscripten", metadata !"clang version 3.1 (trunk 150936)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12} ; [ DW_TAG_compile_unit ] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 7, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !10} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !"/tmp/emscripten_temp/src.cpp", metadata !"/home/alon/Dev/emscripten", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{metadata !11} +!11 = metadata !{i32 786468} ; [ DW_TAG_base_type ] +!12 = metadata !{metadata !13} +!13 = metadata !{metadata !14} +!14 = metadata !{i32 786484, i32 0, null, metadata !"buf", metadata !"buf", metadata !"_ZL3buf", metadata !6, i32 5, metadata !15, i32 1, i32 1, [20 x i16]* @_ZL3buf} ; [ DW_TAG_variable ] +!15 = metadata !{i32 786454, null, metadata !"jmp_buf", metadata !6, i32 279, i64 0, i64 0, i64 0, i32 0, metadata !16} ; [ DW_TAG_typedef ] +!16 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 320, i64 16, i32 0, i32 0, metadata !17, metadata !18, i32 0, i32 0} ; [ DW_TAG_array_type ] +!17 = metadata !{i32 786468, null, metadata !"unsigned short", null, i32 0, i64 16, i64 16, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!18 = metadata !{metadata !19} +!19 = metadata !{i32 786465, i64 0, i64 19} ; [ DW_TAG_subrange_type ] +!20 = metadata !{i32 8, i32 18, metadata !21, null} +!21 = metadata !{i32 786443, metadata !5, i32 7, i32 22, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!22 = metadata !{i32 9, i32 15, metadata !23, null} +!23 = metadata !{i32 786443, metadata !21, i32 8, i32 31, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!24 = metadata !{i32 10, i32 15, metadata !23, null} +!25 = metadata !{i32 11, i32 13, metadata !23, null} +!26 = metadata !{i32 12, i32 15, metadata !27, null} +!27 = metadata !{i32 786443, metadata !21, i32 11, i32 20, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] +!28 = metadata !{i32 14, i32 13, metadata !21, null} diff --git a/tests/cases/longjmp_tiny_noasm_invoke.txt b/tests/cases/longjmp_tiny_noasm_invoke.txt new file mode 100644 index 00000000..8a0aa386 --- /dev/null +++ b/tests/cases/longjmp_tiny_noasm_invoke.txt @@ -0,0 +1,2 @@ +hello world +more diff --git a/tests/cases/phi24_ta2.ll b/tests/cases/phi24_ta2.ll new file mode 100644 index 00000000..b5b0664b --- /dev/null +++ b/tests/cases/phi24_ta2.ll @@ -0,0 +1,1876 @@ + +;;; trunc i32 into i24, needs $0 on target variable name + +; ModuleID = '/tmp/tmpvqlBv2/a.out.bc' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-pc-linux-gnu" + +%union.U4 = type { i32 } +%union.U3 = type { i8* } +%struct.S1 = type { i8, i32, [4 x i8], %struct.S0, %struct.S0, i8 } +%struct.S0 = type { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], [4 x i8], i16 } + +@.str = private unnamed_addr constant [2 x i8] c"1\00", align 1 +@.str1 = private unnamed_addr constant [4 x i8] c"g_8\00", align 1 +@g_10 = internal global i8 5, align 1 +@.str2 = private unnamed_addr constant [5 x i8] c"g_10\00", align 1 +@.str3 = private unnamed_addr constant [8 x i8] c"g_17.f0\00", align 1 +@.str4 = private unnamed_addr constant [8 x i8] c"g_17.f1\00", align 1 +@.str5 = private unnamed_addr constant [8 x i8] c"g_17.f2\00", align 1 +@.str6 = private unnamed_addr constant [8 x i8] c"g_17.f3\00", align 1 +@.str7 = private unnamed_addr constant [8 x i8] c"g_38.f0\00", align 1 +@.str8 = private unnamed_addr constant [8 x i8] c"g_38.f1\00", align 1 +@.str9 = private unnamed_addr constant [8 x i8] c"g_38.f2\00", align 1 +@.str10 = private unnamed_addr constant [11 x i8] c"g_38.f3.f0\00", align 1 +@.str11 = private unnamed_addr constant [11 x i8] c"g_38.f3.f1\00", align 1 +@.str12 = private unnamed_addr constant [11 x i8] c"g_38.f3.f2\00", align 1 +@.str13 = private unnamed_addr constant [11 x i8] c"g_38.f3.f3\00", align 1 +@.str14 = private unnamed_addr constant [11 x i8] c"g_38.f3.f4\00", align 1 +@.str15 = private unnamed_addr constant [11 x i8] c"g_38.f3.f5\00", align 1 +@.str16 = private unnamed_addr constant [11 x i8] c"g_38.f3.f6\00", align 1 +@.str17 = private unnamed_addr constant [11 x i8] c"g_38.f3.f7\00", align 1 +@.str18 = private unnamed_addr constant [11 x i8] c"g_38.f3.f8\00", align 1 +@.str19 = private unnamed_addr constant [11 x i8] c"g_38.f3.f9\00", align 1 +@.str20 = private unnamed_addr constant [11 x i8] c"g_38.f4.f0\00", align 1 +@.str21 = private unnamed_addr constant [11 x i8] c"g_38.f4.f1\00", align 1 +@.str22 = private unnamed_addr constant [11 x i8] c"g_38.f4.f2\00", align 1 +@.str23 = private unnamed_addr constant [11 x i8] c"g_38.f4.f3\00", align 1 +@.str24 = private unnamed_addr constant [11 x i8] c"g_38.f4.f4\00", align 1 +@.str25 = private unnamed_addr constant [11 x i8] c"g_38.f4.f5\00", align 1 +@.str26 = private unnamed_addr constant [11 x i8] c"g_38.f4.f6\00", align 1 +@.str27 = private unnamed_addr constant [11 x i8] c"g_38.f4.f7\00", align 1 +@.str28 = private unnamed_addr constant [11 x i8] c"g_38.f4.f8\00", align 1 +@.str29 = private unnamed_addr constant [11 x i8] c"g_38.f4.f9\00", align 1 +@.str30 = private unnamed_addr constant [8 x i8] c"g_38.f5\00", align 1 +@g_53 = internal global %union.U4 { i32 5 }, align 4 +@.str31 = private unnamed_addr constant [8 x i8] c"g_53.f0\00", align 1 +@.str32 = private unnamed_addr constant [8 x i8] c"g_53.f1\00", align 1 +@.str33 = private unnamed_addr constant [8 x i8] c"g_53.f2\00", align 1 +@.str34 = private unnamed_addr constant [8 x i8] c"g_53.f3\00", align 1 +@g_58 = internal unnamed_addr global [5 x [10 x i32]] [[10 x i32] [i32 -1394082054, i32 331836000, i32 -1394082054, i32 -3, i32 -1394082054, i32 -992756762, i32 1, i32 331836000, i32 331836000, i32 -2072662602], [10 x i32] [i32 -809167067, i32 -3, i32 -2072662602, i32 -2072662602, i32 -479446353, i32 0, i32 -479446353, i32 -2072662602, i32 -479446353, i32 -3], [10 x i32] [i32 1, i32 -809167067, i32 -992756762, i32 -992756762, i32 -2072662602, i32 0, i32 1, i32 1, i32 -3, i32 -809167067], [10 x i32] [i32 -992756762, i32 -1394082054, i32 -1394082054, i32 0, i32 -2072662602, i32 0, i32 -1394082054, i32 0, i32 -809167067, i32 -3], [10 x i32] [i32 -3, i32 1, i32 1, i32 0, i32 -479446353, i32 -809167067, i32 -809167067, i32 331836000, i32 -3, i32 331836000]], align 4 +@.str35 = private unnamed_addr constant [11 x i8] c"g_58[i][j]\00", align 1 +@.str36 = private unnamed_addr constant [18 x i8] c"index = [%d][%d]\0A\00", align 1 +@g_60 = internal global i32 -3, align 4 +@.str37 = private unnamed_addr constant [5 x i8] c"g_60\00", align 1 +@g_76 = internal global i32 -1, align 4 +@.str38 = private unnamed_addr constant [5 x i8] c"g_76\00", align 1 +@g_84 = internal unnamed_addr global i16 32296, align 2 +@.str39 = private unnamed_addr constant [5 x i8] c"g_84\00", align 1 +@g_116 = internal global i8 -44, align 1 +@.str40 = private unnamed_addr constant [6 x i8] c"g_116\00", align 1 +@g_117 = internal global i32 -6, align 4 +@.str41 = private unnamed_addr constant [6 x i8] c"g_117\00", align 1 +@g_123 = internal global %union.U4 { i32 -1 }, align 4 +@.str42 = private unnamed_addr constant [9 x i8] c"g_123.f0\00", align 1 +@.str43 = private unnamed_addr constant [9 x i8] c"g_123.f1\00", align 1 +@.str44 = private unnamed_addr constant [9 x i8] c"g_123.f2\00", align 1 +@.str45 = private unnamed_addr constant [9 x i8] c"g_123.f3\00", align 1 +@g_145 = internal unnamed_addr global i16 8, align 2 +@.str46 = private unnamed_addr constant [6 x i8] c"g_145\00", align 1 +@g_153 = internal global i8 23, align 1 +@.str47 = private unnamed_addr constant [6 x i8] c"g_153\00", align 1 +@g_161 = internal global i8 8, align 1 +@.str48 = private unnamed_addr constant [6 x i8] c"g_161\00", align 1 +@g_162 = internal unnamed_addr global i32 388565681, align 4 +@.str49 = private unnamed_addr constant [6 x i8] c"g_162\00", align 1 +@.str50 = private unnamed_addr constant [6 x i8] c"g_187\00", align 1 +@g_192 = internal unnamed_addr global [3 x i16] [i16 -3243, i16 -3243, i16 -3243], align 2 +@.str51 = private unnamed_addr constant [9 x i8] c"g_192[i]\00", align 1 +@.str52 = private unnamed_addr constant [14 x i8] c"index = [%d]\0A\00", align 1 +@.str53 = private unnamed_addr constant [9 x i8] c"g_261.f0\00", align 1 +@.str54 = private unnamed_addr constant [9 x i8] c"g_261.f1\00", align 1 +@.str55 = private unnamed_addr constant [9 x i8] c"g_261.f2\00", align 1 +@.str56 = private unnamed_addr constant [9 x i8] c"g_261.f3\00", align 1 +@.str57 = private unnamed_addr constant [9 x i8] c"g_261.f4\00", align 1 +@.str58 = private unnamed_addr constant [9 x i8] c"g_261.f5\00", align 1 +@.str59 = private unnamed_addr constant [9 x i8] c"g_261.f6\00", align 1 +@.str60 = private unnamed_addr constant [9 x i8] c"g_261.f7\00", align 1 +@.str61 = private unnamed_addr constant [9 x i8] c"g_261.f8\00", align 1 +@.str62 = private unnamed_addr constant [9 x i8] c"g_261.f9\00", align 1 +@.str63 = private unnamed_addr constant [6 x i8] c"g_287\00", align 1 +@g_325 = internal unnamed_addr global i32 1, align 4 +@.str64 = private unnamed_addr constant [6 x i8] c"g_325\00", align 1 +@g_331 = internal global i8 0, align 1 +@.str65 = private unnamed_addr constant [6 x i8] c"g_331\00", align 1 +@g_333 = internal unnamed_addr global i32 3, align 4 +@.str66 = private unnamed_addr constant [6 x i8] c"g_333\00", align 1 +@g_337 = internal global i32 1408789087, align 4 +@.str67 = private unnamed_addr constant [6 x i8] c"g_337\00", align 1 +@g_349 = internal global i32 49917741, align 4 +@.str68 = private unnamed_addr constant [6 x i8] c"g_349\00", align 1 +@g_382 = internal global i8 -1, align 1 +@.str69 = private unnamed_addr constant [6 x i8] c"g_382\00", align 1 +@.str70 = private unnamed_addr constant [12 x i8] c"g_409[i][j]\00", align 1 +@.str71 = private unnamed_addr constant [6 x i8] c"g_410\00", align 1 +@g_445 = internal unnamed_addr global [3 x [2 x [4 x i32]]] [[2 x [4 x i32]] [[4 x i32] [i32 -1169816097, i32 -1718720460, i32 -1718720460, i32 -9], [4 x i32] [i32 -1, i32 7, i32 -9, i32 -1718720460]], [2 x [4 x i32]] [[4 x i32] [i32 0, i32 -9, i32 -9, i32 -1], [4 x i32] [i32 -1, i32 7, i32 -1169816097, i32 7]], [2 x [4 x i32]] [[4 x i32] [i32 -9, i32 -487065431, i32 7, i32 7], [4 x i32] [i32 7, i32 7, i32 -1169816097, i32 0]]], align 4 +@.str72 = private unnamed_addr constant [15 x i8] c"g_445[i][j][k]\00", align 1 +@.str73 = private unnamed_addr constant [22 x i8] c"index = [%d][%d][%d]\0A\00", align 1 +@g_455 = internal unnamed_addr global i16 -24588, align 2 +@.str74 = private unnamed_addr constant [6 x i8] c"g_455\00", align 1 +@g_483 = internal unnamed_addr global [4 x [3 x i8]] [[3 x i8] c"\00uu", [3 x i8] c"W\FF\FF", [3 x i8] c"\FBu\00", [3 x i8] c"W\FFW"], align 1 +@.str75 = private unnamed_addr constant [12 x i8] c"g_483[i][j]\00", align 1 +@.str76 = private unnamed_addr constant [9 x i8] c"g_533.f0\00", align 1 +@.str77 = private unnamed_addr constant [9 x i8] c"g_533.f1\00", align 1 +@.str78 = private unnamed_addr constant [9 x i8] c"g_533.f2\00", align 1 +@.str79 = private unnamed_addr constant [12 x i8] c"g_533.f3.f0\00", align 1 +@.str80 = private unnamed_addr constant [12 x i8] c"g_533.f3.f1\00", align 1 +@.str81 = private unnamed_addr constant [12 x i8] c"g_533.f3.f2\00", align 1 +@.str82 = private unnamed_addr constant [12 x i8] c"g_533.f3.f3\00", align 1 +@.str83 = private unnamed_addr constant [12 x i8] c"g_533.f3.f4\00", align 1 +@.str84 = private unnamed_addr constant [12 x i8] c"g_533.f3.f5\00", align 1 +@.str85 = private unnamed_addr constant [12 x i8] c"g_533.f3.f6\00", align 1 +@.str86 = private unnamed_addr constant [12 x i8] c"g_533.f3.f7\00", align 1 +@.str87 = private unnamed_addr constant [12 x i8] c"g_533.f3.f8\00", align 1 +@.str88 = private unnamed_addr constant [12 x i8] c"g_533.f3.f9\00", align 1 +@.str89 = private unnamed_addr constant [12 x i8] c"g_533.f4.f0\00", align 1 +@.str90 = private unnamed_addr constant [12 x i8] c"g_533.f4.f1\00", align 1 +@.str91 = private unnamed_addr constant [12 x i8] c"g_533.f4.f2\00", align 1 +@.str92 = private unnamed_addr constant [12 x i8] c"g_533.f4.f3\00", align 1 +@.str93 = private unnamed_addr constant [12 x i8] c"g_533.f4.f4\00", align 1 +@.str94 = private unnamed_addr constant [12 x i8] c"g_533.f4.f5\00", align 1 +@.str95 = private unnamed_addr constant [12 x i8] c"g_533.f4.f6\00", align 1 +@.str96 = private unnamed_addr constant [12 x i8] c"g_533.f4.f7\00", align 1 +@.str97 = private unnamed_addr constant [12 x i8] c"g_533.f4.f8\00", align 1 +@.str98 = private unnamed_addr constant [12 x i8] c"g_533.f4.f9\00", align 1 +@.str99 = private unnamed_addr constant [9 x i8] c"g_533.f5\00", align 1 +@g_542 = internal global i32 -1851924269, align 4 +@.str100 = private unnamed_addr constant [6 x i8] c"g_542\00", align 1 +@g_543 = internal global i8 0, align 1 +@.str101 = private unnamed_addr constant [6 x i8] c"g_543\00", align 1 +@.str102 = private unnamed_addr constant [15 x i8] c"g_647[i][j].f0\00", align 1 +@.str103 = private unnamed_addr constant [15 x i8] c"g_647[i][j].f1\00", align 1 +@.str104 = private unnamed_addr constant [15 x i8] c"g_647[i][j].f2\00", align 1 +@.str105 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f0\00", align 1 +@.str106 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f1\00", align 1 +@.str107 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f2\00", align 1 +@.str108 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f3\00", align 1 +@.str109 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f4\00", align 1 +@.str110 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f5\00", align 1 +@.str111 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f6\00", align 1 +@.str112 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f7\00", align 1 +@.str113 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f8\00", align 1 +@.str114 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f3.f9\00", align 1 +@.str115 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f0\00", align 1 +@.str116 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f1\00", align 1 +@.str117 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f2\00", align 1 +@.str118 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f3\00", align 1 +@.str119 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f4\00", align 1 +@.str120 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f5\00", align 1 +@.str121 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f6\00", align 1 +@.str122 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f7\00", align 1 +@.str123 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f8\00", align 1 +@.str124 = private unnamed_addr constant [18 x i8] c"g_647[i][j].f4.f9\00", align 1 +@.str125 = private unnamed_addr constant [15 x i8] c"g_647[i][j].f5\00", align 1 +@.str126 = private unnamed_addr constant [9 x i8] c"g_649.f0\00", align 1 +@.str127 = private unnamed_addr constant [9 x i8] c"g_649.f1\00", align 1 +@.str128 = private unnamed_addr constant [9 x i8] c"g_649.f2\00", align 1 +@.str129 = private unnamed_addr constant [12 x i8] c"g_649.f3.f0\00", align 1 +@.str130 = private unnamed_addr constant [12 x i8] c"g_649.f3.f1\00", align 1 +@.str131 = private unnamed_addr constant [12 x i8] c"g_649.f3.f2\00", align 1 +@.str132 = private unnamed_addr constant [12 x i8] c"g_649.f3.f3\00", align 1 +@.str133 = private unnamed_addr constant [12 x i8] c"g_649.f3.f4\00", align 1 +@.str134 = private unnamed_addr constant [12 x i8] c"g_649.f3.f5\00", align 1 +@.str135 = private unnamed_addr constant [12 x i8] c"g_649.f3.f6\00", align 1 +@.str136 = private unnamed_addr constant [12 x i8] c"g_649.f3.f7\00", align 1 +@.str137 = private unnamed_addr constant [12 x i8] c"g_649.f3.f8\00", align 1 +@.str138 = private unnamed_addr constant [12 x i8] c"g_649.f3.f9\00", align 1 +@.str139 = private unnamed_addr constant [12 x i8] c"g_649.f4.f0\00", align 1 +@.str140 = private unnamed_addr constant [12 x i8] c"g_649.f4.f1\00", align 1 +@.str141 = private unnamed_addr constant [12 x i8] c"g_649.f4.f2\00", align 1 +@.str142 = private unnamed_addr constant [12 x i8] c"g_649.f4.f3\00", align 1 +@.str143 = private unnamed_addr constant [12 x i8] c"g_649.f4.f4\00", align 1 +@.str144 = private unnamed_addr constant [12 x i8] c"g_649.f4.f5\00", align 1 +@.str145 = private unnamed_addr constant [12 x i8] c"g_649.f4.f6\00", align 1 +@.str146 = private unnamed_addr constant [12 x i8] c"g_649.f4.f7\00", align 1 +@.str147 = private unnamed_addr constant [12 x i8] c"g_649.f4.f8\00", align 1 +@.str148 = private unnamed_addr constant [12 x i8] c"g_649.f4.f9\00", align 1 +@.str149 = private unnamed_addr constant [9 x i8] c"g_649.f5\00", align 1 +@g_839 = internal global [1 x [3 x [6 x i8]]] [[3 x [6 x i8]] [[6 x i8] c"FFFFFF", [6 x i8] c"FFFFFF", [6 x i8] c"FFFFFF"]], align 1 +@.str150 = private unnamed_addr constant [15 x i8] c"g_839[i][j][k]\00", align 1 +@.str151 = private unnamed_addr constant [6 x i8] c"g_902\00", align 1 +@.str152 = private unnamed_addr constant [9 x i8] c"g_916[i]\00", align 1 +@.str153 = private unnamed_addr constant [9 x i8] c"g_955.f0\00", align 1 +@.str154 = private unnamed_addr constant [9 x i8] c"g_955.f1\00", align 1 +@.str155 = private unnamed_addr constant [9 x i8] c"g_955.f2\00", align 1 +@.str156 = private unnamed_addr constant [9 x i8] c"g_955.f3\00", align 1 +@g_1003 = internal unnamed_addr global i16 14774, align 2 +@.str157 = private unnamed_addr constant [7 x i8] c"g_1003\00", align 1 +@.str158 = private unnamed_addr constant [7 x i8] c"g_1004\00", align 1 +@g_1048 = internal unnamed_addr global i16 11482, align 2 +@.str159 = private unnamed_addr constant [7 x i8] c"g_1048\00", align 1 +@.str160 = private unnamed_addr constant [10 x i8] c"g_1075.f0\00", align 1 +@.str161 = private unnamed_addr constant [10 x i8] c"g_1075.f1\00", align 1 +@.str162 = private unnamed_addr constant [10 x i8] c"g_1075.f2\00", align 1 +@.str163 = private unnamed_addr constant [10 x i8] c"g_1075.f3\00", align 1 +@g_1137 = internal unnamed_addr global i16 -30603, align 2 +@.str164 = private unnamed_addr constant [7 x i8] c"g_1137\00", align 1 +@g_1209 = internal unnamed_addr global i16 12544, align 2 +@.str165 = private unnamed_addr constant [7 x i8] c"g_1209\00", align 1 +@g_1211 = internal unnamed_addr global i32 80803188, align 4 +@.str166 = private unnamed_addr constant [7 x i8] c"g_1211\00", align 1 +@g_1326 = internal unnamed_addr global [8 x i32] [i32 8, i32 8, i32 -6, i32 -6, i32 -6, i32 8, i32 -7, i32 -7], align 4 +@.str167 = private unnamed_addr constant [10 x i8] c"g_1326[i]\00", align 1 +@.str168 = private unnamed_addr constant [7 x i8] c"g_1518\00", align 1 +@.str169 = private unnamed_addr constant [7 x i8] c"g_1530\00", align 1 +@g_1531 = internal unnamed_addr global i32 -2102599148, align 4 +@.str170 = private unnamed_addr constant [7 x i8] c"g_1531\00", align 1 +@.str171 = private unnamed_addr constant [7 x i8] c"g_1540\00", align 1 +@g_1541 = internal unnamed_addr global i16 -1, align 2 +@.str172 = private unnamed_addr constant [7 x i8] c"g_1541\00", align 1 +@.str173 = private unnamed_addr constant [7 x i8] c"g_1542\00", align 1 +@.str174 = private unnamed_addr constant [7 x i8] c"g_1543\00", align 1 +@g_1544 = internal unnamed_addr global i32 -1075110111, align 4 +@.str175 = private unnamed_addr constant [7 x i8] c"g_1544\00", align 1 +@g_1639 = internal global i8 -2, align 1 +@.str176 = private unnamed_addr constant [7 x i8] c"g_1639\00", align 1 +@g_1737 = internal unnamed_addr constant [1 x [6 x [9 x %union.U4]]] [[6 x [9 x %union.U4]] [[9 x %union.U4] [%union.U4 { i32 -513569997 }, %union.U4 { i32 1 }, %union.U4 { i32 1 }, %union.U4 { i32 -271352390 }, %union.U4 { i32 1492635285 }, %union.U4 { i32 1 }, %union.U4 { i32 -6 }, %union.U4 { i32 -1640860186 }, %union.U4 { i32 -6 }], [9 x %union.U4] [%union.U4 { i32 -1368613310 }, %union.U4 { i32 -5 }, %union.U4 { i32 -2126413891 }, %union.U4 { i32 -2126413891 }, %union.U4 { i32 1823702945 }, %union.U4 { i32 1272602072 }, %union.U4 { i32 -2126413891 }, %union.U4 { i32 -1368613310 }, %union.U4 { i32 2129204323 }], [9 x %union.U4] [%union.U4 zeroinitializer, %union.U4 { i32 1492635285 }, %union.U4 zeroinitializer, %union.U4 { i32 1487751473 }, %union.U4 { i32 1487751473 }, %union.U4 { i32 1 }, %union.U4 { i32 -513569997 }, %union.U4 { i32 1487751473 }, %union.U4 { i32 1492635285 }], [9 x %union.U4] [%union.U4 { i32 1823702945 }, %union.U4 { i32 -2002368716 }, %union.U4 { i32 -1832387217 }, %union.U4 { i32 1272602072 }, %union.U4 { i32 1823702945 }, %union.U4 { i32 1823702945 }, %union.U4 { i32 -5 }, %union.U4 { i32 -1368613310 }, %union.U4 { i32 1823702945 }], [9 x %union.U4] [%union.U4 { i32 -513569997 }, %union.U4 { i32 -1866190761 }, %union.U4 { i32 -1640860186 }, %union.U4 { i32 1 }, %union.U4 { i32 -6 }, %union.U4 { i32 -1866190761 }, %union.U4 { i32 -1866190761 }, %union.U4 { i32 1492635285 }, %union.U4 { i32 1487751473 }], [9 x %union.U4] [%union.U4 { i32 -188486937 }, %union.U4 { i32 -2126413891 }, %union.U4 { i32 -188486937 }, %union.U4 { i32 -5 }, %union.U4 { i32 8 }, %union.U4 { i32 -5 }, %union.U4 { i32 -188486937 }, %union.U4 { i32 -188486937 }, %union.U4 { i32 1823702945 }]]], align 4 +@.str177 = private unnamed_addr constant [19 x i8] c"g_1737[i][j][k].f0\00", align 1 +@.str178 = private unnamed_addr constant [19 x i8] c"g_1737[i][j][k].f1\00", align 1 +@.str179 = private unnamed_addr constant [19 x i8] c"g_1737[i][j][k].f2\00", align 1 +@.str180 = private unnamed_addr constant [19 x i8] c"g_1737[i][j][k].f3\00", align 1 +@crc32_context = internal unnamed_addr global i32 -1, align 4 +@.str181 = private unnamed_addr constant [15 x i8] c"checksum = %X\0A\00", align 1 +@g_649 = internal global { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -9, i32 4, i8 55, i8 18, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 3, i32 -533516120, i32 1392086955, i32 -9, i32 1854958672, i16 5, i32 -154239720, i8 -1, [3 x i8] undef, i8 27, i8 48, i8 0, i8 0, i16 14074, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 105, i32 5, i32 1631521711, i32 573890954, i32 -1866043804, i16 0, i32 1731355470, i8 -84, [3 x i8] undef, i8 46, i8 22, i8 0, i8 0, i16 31245, [2 x i8] undef }, i8 95, [3 x i8] undef }, align 4 +@g_647 = internal global <{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }> <{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 87, i32 2121274849, i8 -72, i8 9, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 60, i32 1, i32 1470943878, i32 1, i32 612042415, i16 0, i32 2144098676, i8 -1, [3 x i8] undef, i8 35, i8 78, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 6, i32 -1822390552, i32 5, i32 -1733470896, i32 1983147151, i16 -20410, i32 1776828983, i8 1, [3 x i8] undef, i8 126, i8 7, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -3, [3 x i8] undef } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -110, i32 -3, i8 118, i8 24, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -39, i32 626814409, i32 475710044, i32 1, i32 0, i16 -1, i32 6, i8 115, [3 x i8] undef, i8 -59, i8 33, i8 0, i8 0, i16 -1, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 -14, i32 -456774250, i32 -1972472119, i32 -5, i32 1210377991, i16 -15869, i32 -543945797, i8 1, [3 x i8] undef, i8 116, i8 2, i8 0, i8 0, i16 7, [2 x i8] undef }, i8 -61, [3 x i8] undef } }> }>, align 4 +@g_261 = internal global { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 34, i32 1, i32 -9, i32 -7, i32 0, i16 10822, i32 -1893550337, i8 -1, [3 x i8] undef, i8 41, i8 81, i8 0, i8 0, i16 -18532, [2 x i8] undef }, align 4 +@g_38 = internal global { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } { i8 -5, i32 1, i8 40, i8 25, i8 0, i8 0, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 8, i32 7, i32 1, i32 0, i32 -185147255, i16 -10, i32 -323821878, i8 101, [3 x i8] undef, i8 -21, i8 -92, i8 0, i8 0, i16 2, [2 x i8] undef }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] } { i8 45, i32 -1, i32 -218183498, i32 -473519531, i32 1765140400, i16 -25635, i32 -560658624, i8 40, [3 x i8] undef, i8 81, i8 -83, i8 0, i8 0, i16 0, [2 x i8] undef }, i8 0, [3 x i8] undef }, align 4 +@g_17 = internal global { i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] } { i8 9, i8 0, [2 x i8] undef, i8 -79, i8 -9, i8 127, i8 undef, i8 15, i8 0, [2 x i8] undef }, align 4 +@.str182 = private unnamed_addr constant [36 x i8] c"...checksum after hashing %s : %lX\0A\00", align 1 +@crc32_tab = internal unnamed_addr global [256 x i32] zeroinitializer, align 4 +@g_1335 = internal global i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 +@g_1357 = internal global i8**** null, align 4 +@g_1726 = internal unnamed_addr global [4 x i8*****] [i8***** @g_1727, i8***** @g_1727, i8***** @g_1727, i8***** @g_1727], align 4 +@g_1727 = internal constant i8**** @g_1728, align 4 +@g_1728 = internal global i8*** @g_1729, align 4 +@g_1729 = internal constant i8** getelementptr inbounds ([3 x [3 x [10 x i8*]]]* @g_1730, i32 0, i32 1, i32 1, i32 4), align 4 +@g_1730 = internal global [3 x [3 x [10 x i8*]]] [[3 x [10 x i8*]] [[10 x i8*] [i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5), i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5)], [10 x i8*] [i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232)], [10 x i8*] [i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5)]], [3 x [10 x i8*]] [[10 x i8*] [i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92)], [10 x i8*] [i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_153, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5)], [10 x i8*] [i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92)]], [3 x [10 x i8*]] [[10 x i8*] [i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92)], [10 x i8*] [i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_153, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5)], [10 x i8*] [i8* @g_1639, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i64 2, i64 5), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_153, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 0, i32 0), i64 232), i8* @g_1639, i8* getelementptr (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), i64 92)]]], align 4 +@g_1430 = internal unnamed_addr global %union.U3* @g_388, align 4 +@g_388 = internal global %union.U3 zeroinitializer, align 4 +@g_171 = internal global i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 7), align 4 +@g_170 = internal unnamed_addr global [10 x [6 x [4 x i8**]]] [[6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** null], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** null], [4 x i8**] [i8** @g_171, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** null, i8** null, i8** null], [4 x i8**] [i8** @g_171, i8** null, i8** @g_171, i8** null], [4 x i8**] [i8** @g_171, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** null, i8** null, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** null]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** @g_171, i8** null, i8** @g_171], [4 x i8**] [i8** null, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** null, i8** null], [4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** null]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** null, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** null, i8** @g_171]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** null, i8** null, i8** null], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** null]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** null, i8** @g_171], [4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** @g_171]], [6 x [4 x i8**]] [[4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** null], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** null, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** null]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** null], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** null, i8** null, i8** @g_171, i8** null], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** null], [4 x i8**] [i8** null, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171]], [6 x [4 x i8**]] [[4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** null, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** null, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** @g_171, i8** @g_171], [4 x i8**] [i8** @g_171, i8** @g_171, i8** null, i8** @g_171]]], align 4 +@g_286 = internal global [10 x i32*] [i32* @g_287, i32* @g_287, i32* @g_287, i32* @g_287, i32* @g_287, i32* @g_287, i32* @g_287, i32* @g_287, i32* @g_287, i32* @g_287], align 4 +@g_287 = internal constant i32 -1, align 4 + +define i32 @main(i32 %argc, i8** nocapture %argv) nounwind { + %p_6.i.i = alloca %union.U3, align 8 + %1 = icmp eq i32 %argc, 2 + br i1 %1, label %2, label %7 + +; <label>:2 ; preds = %0 + %3 = getelementptr inbounds i8** %argv, i32 1 + %4 = load i8** %3, align 4 + %5 = call i32 @strcmp(i8* %4, i8* getelementptr inbounds ([2 x i8]* @.str, i32 0, i32 0)) nounwind + %6 = icmp eq i32 %5, 0 + %. = zext i1 %6 to i32 + br label %7 + +; <label>:7 ; preds = %2, %0 + %print_hash_value.0 = phi i32 [ 0, %0 ], [ %., %2 ] + br label %.preheader.i + +.preheader.i: ; preds = %.preheader.i, %7 + %i.08.i = phi i32 [ 0, %7 ], [ %41, %.preheader.i ] + %8 = and i32 %i.08.i, 1 + %9 = icmp eq i32 %8, 0 + %10 = lshr i32 %i.08.i, 1 + %11 = xor i32 %10, -306674912 + %crc.1.i = select i1 %9, i32 %10, i32 %11 + %12 = and i32 %crc.1.i, 1 + %13 = icmp eq i32 %12, 0 + %14 = lshr i32 %crc.1.i, 1 + %15 = xor i32 %14, -306674912 + %crc.1.1.i = select i1 %13, i32 %14, i32 %15 + %16 = and i32 %crc.1.1.i, 1 + %17 = icmp eq i32 %16, 0 + %18 = lshr i32 %crc.1.1.i, 1 + %19 = xor i32 %18, -306674912 + %crc.1.2.i = select i1 %17, i32 %18, i32 %19 + %20 = and i32 %crc.1.2.i, 1 + %21 = icmp eq i32 %20, 0 + %22 = lshr i32 %crc.1.2.i, 1 + %23 = xor i32 %22, -306674912 + %crc.1.3.i = select i1 %21, i32 %22, i32 %23 + %24 = and i32 %crc.1.3.i, 1 + %25 = icmp eq i32 %24, 0 + %26 = lshr i32 %crc.1.3.i, 1 + %27 = xor i32 %26, -306674912 + %crc.1.4.i = select i1 %25, i32 %26, i32 %27 + %28 = and i32 %crc.1.4.i, 1 + %29 = icmp eq i32 %28, 0 + %30 = lshr i32 %crc.1.4.i, 1 + %31 = xor i32 %30, -306674912 + %crc.1.5.i = select i1 %29, i32 %30, i32 %31 + %32 = and i32 %crc.1.5.i, 1 + %33 = icmp eq i32 %32, 0 + %34 = lshr i32 %crc.1.5.i, 1 + %35 = xor i32 %34, -306674912 + %crc.1.6.i = select i1 %33, i32 %34, i32 %35 + %36 = and i32 %crc.1.6.i, 1 + %37 = icmp eq i32 %36, 0 + %38 = lshr i32 %crc.1.6.i, 1 + %39 = xor i32 %38, -306674912 + %crc.1.7.i = select i1 %37, i32 %38, i32 %39 + %40 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %i.08.i + store i32 %crc.1.7.i, i32* %40, align 4 + %41 = add nsw i32 %i.08.i, 1 + %exitcond.i = icmp eq i32 %41, 256 + br i1 %exitcond.i, label %crc32_gentab.exit, label %.preheader.i + +crc32_gentab.exit: ; preds = %.preheader.i + %42 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 3), align 4 + %43 = lshr i32 %42, 2 + %44 = and i32 %43, 63 + %45 = load i32* getelementptr inbounds ([5 x [10 x i32]]* @g_58, i32 0, i32 2, i32 2), align 4 + %46 = xor i32 %44, %45 + store i32 %46, i32* getelementptr inbounds ([5 x [10 x i32]]* @g_58, i32 0, i32 2, i32 2), align 4 + %47 = load i32* @g_60, align 4 + %48 = xor i32 %47, %44 + store i32 %48, i32* @g_60, align 4 + %49 = load i32* @g_76, align 4 + %50 = add i32 %49, 1 + store i32 %50, i32* @g_76, align 4 + %51 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 13), align 4 + %52 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 7), align 4 + %53 = icmp ne i8 %52, 0 + %not..i = icmp ne i16 %51, 0 + %54 = or i1 %53, %not..i + %..i.i = zext i1 %54 to i16 + %55 = load i16* @g_84, align 2 + %56 = or i16 %..i.i, %55 + store i16 %56, i16* @g_84, align 2 + %.sroa.3.16.copyload.i = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 1), align 4 + %.sroa.7.36.copyload.i = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 6), align 4 + %.sroa.10.52.copyload.i = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 0), align 4 + %.sroa.14.76.copyload.i = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 6), align 4 + %.sroa.17.84.copyload.i = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 9) to i32*), align 4 + %57 = and i32 %.sroa.17.84.copyload.i, 2147483647 + %58 = icmp ne i32 %57, 0 + %59 = zext i1 %58 to i32 + %60 = xor i32 %57, %44 + %61 = xor i32 %60, %59 + store i32 %61, i32* getelementptr inbounds (%union.U4* @g_53, i32 0, i32 0), align 4 + %62 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 5), align 4 + %63 = icmp eq i16 %62, 0 + %64 = trunc i32 %61 to i8 + %65 = icmp eq i32 %.sroa.7.36.copyload.i, 0 + %66 = icmp eq i32 %47, %44 + %67 = icmp eq i8 %.sroa.10.52.copyload.i, 0 + %68 = icmp eq i32 %.sroa.3.16.copyload.i, 0 + %.not.i = icmp ne i8 %64, 0 + %.not136.i = icmp ne i32 %.sroa.14.76.copyload.i, 0 + %brmerge.i = or i1 %.not.i, %.not136.i + br i1 %brmerge.i, label %.us-lcssa109.us.i.i, label %.us-lcssa108.us.i.i + +.loopexit138.i.i.loopexit: ; preds = %.outer..outer.split_crit_edge.i.us65.i.preheader..outer..outer.split_crit_edge.i.us65.i.preheader.split_crit_edge + store i8 0, i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 7), align 4 + store i32* null, i32** getelementptr inbounds ([10 x i32*]* @g_286, i32 0, i32 9), align 4 + br label %.us-lcssa109.us.i.i + +.us-lcssa108.us.i.i: ; preds = %crc32_gentab.exit + store i8 0, i8* @g_10, align 1 + store i32 0, i32* @g_117, align 4 + %69 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] }* @g_17, i32 0, i32 3) to i32*), align 4 + %70 = load i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 6), align 4 + %71 = icmp eq i32 %70, 0 + %sext.i.i = shl i32 %69, 16 + %72 = ashr exact i32 %sext.i.i, 16 + br i1 %71, label %.preheader49.i, label %..split_crit_edge.i.i + +.preheader49.i: ; preds = %.us-lcssa108.us.i.i + %73 = load i8* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 7), align 4 + %74 = zext i8 %73 to i16 + store i16 %74, i16* getelementptr inbounds ([3 x i16]* @g_192, i32 0, i32 2), align 2 + br label %..split_crit_edge.i.i + +..split_crit_edge.i.i: ; preds = %.preheader49.i, %.us-lcssa108.us.i.i + store i32 %72, i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 1), align 4 + store i32 10, i32* @g_117, align 4 + br label %func_33.exit.i + +.us-lcssa109.us.i.i: ; preds = %77, %.loopexit138.i.i.loopexit, %crc32_gentab.exit + br i1 %65, label %.preheader102.i.i, label %.outer.i.preheader.i + +.outer.i.preheader.i: ; preds = %.us-lcssa109.us.i.i + br i1 %63, label %.outer.i.preheader.split.us.i, label %.outer.i.preheader..outer.i.preheader.split_crit_edge.i + +.outer.i.preheader..outer.i.preheader.split_crit_edge.i: ; preds = %.outer.i.preheader.i + br i1 %66, label %.outer..outer.split_crit_edge.i.us65.i.preheader, label %.us-lcssa.i + +.outer..outer.split_crit_edge.i.us65.i.preheader: ; preds = %.outer.i.preheader..outer.i.preheader.split_crit_edge.i + br i1 %67, label %func_33.exit.i.loopexit.split, label %.outer..outer.split_crit_edge.i.us65.i.preheader..outer..outer.split_crit_edge.i.us65.i.preheader.split_crit_edge + +.outer..outer.split_crit_edge.i.us65.i.preheader..outer..outer.split_crit_edge.i.us65.i.preheader.split_crit_edge: ; preds = %.outer..outer.split_crit_edge.i.us65.i.preheader + br i1 %68, label %.loopexit138.i.i.loopexit, label %.outer..outer.split_crit_edge.i.us65.i + +.outer.i.preheader.split.us.i: ; preds = %.outer.i.preheader.i + br i1 %66, label %.outer.split.us.i.us.us.i, label %.us-lcssa.i + +.outer.split.us.i.us.us.i: ; preds = %77, %.outer.i.preheader.split.us.i + %storemerge94.ph.i.us.us.i = phi i8 [ 1, %77 ], [ 0, %.outer.i.preheader.split.us.i ] + %75 = icmp eq i8 %storemerge94.ph.i.us.us.i, 0 + br i1 %75, label %76, label %.us-lcssa143.us.i.i + +; <label>:76 ; preds = %.outer.split.us.i.us.us.i + store i8 0, i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 7), align 4 + store i32* null, i32** getelementptr inbounds ([10 x i32*]* @g_286, i32 0, i32 9), align 4 + br i1 %67, label %func_33.exit.i, label %77 + +; <label>:77 ; preds = %76 + br i1 %68, label %.us-lcssa109.us.i.i, label %.outer.split.us.i.us.us.i + +.outer..outer.split_crit_edge.i.us65.i: ; preds = %.outer..outer.split_crit_edge.i.us65.i, %.outer..outer.split_crit_edge.i.us65.i.preheader..outer..outer.split_crit_edge.i.us65.i.preheader.split_crit_edge + br label %.outer..outer.split_crit_edge.i.us65.i + +.preheader102.i.i: ; preds = %.us-lcssa109.us.i.i + %78 = icmp eq i8 %52, 0 + br i1 %78, label %.preheader.i.i, label %func_33.exit.i + +.us-lcssa.i: ; preds = %.outer.i.preheader.split.us.i, %.outer.i.preheader..outer.i.preheader.split_crit_edge.i + store i8 0, i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 7), align 4 + store i32* null, i32** getelementptr inbounds ([10 x i32*]* @g_286, i32 0, i32 9), align 4 + %79 = load i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 6), align 4 + store i16 4723, i16* @g_84, align 2 + %80 = load i32* bitcast ({ i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] }* @g_17 to i32*), align 4 + %81 = and i32 %80, 127 + %82 = icmp ugt i32 %81, 31 + %.op.i.i = lshr i32 1, %81 + %83 = and i32 %.op.i.i, 65535 + %84 = select i1 %82, i32 1, i32 %83 + %85 = icmp uge i32 %79, %84 + %86 = zext i1 %85 to i16 + %87 = load i16* @g_145, align 2 + %88 = or i16 %86, %87 + store i16 %88, i16* @g_145, align 2 + br label %func_33.exit.i + +.us-lcssa143.us.i.i: ; preds = %.outer.split.us.i.us.us.i + store i8 %storemerge94.ph.i.us.us.i, i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 7), align 4 + br label %func_33.exit.i + +.preheader.i.i: ; preds = %.preheader102.i.i + %89 = load i32* getelementptr inbounds ([3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 1, i32 1, i32 1), align 4 + %90 = add i32 %89, 1 + store i32 %90, i32* getelementptr inbounds ([3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 1, i32 1, i32 1), align 4 + store i8 -113, i8* @g_116, align 1 + store i32 61, i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + br label %func_33.exit.i + +func_33.exit.i.loopexit.split: ; preds = %.outer..outer.split_crit_edge.i.us65.i.preheader + store i8 0, i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 7), align 4 + store i32* null, i32** getelementptr inbounds ([10 x i32*]* @g_286, i32 0, i32 9), align 4 + br label %func_33.exit.i + +func_33.exit.i: ; preds = %func_33.exit.i.loopexit.split, %.preheader.i.i, %.us-lcssa143.us.i.i, %.us-lcssa.i, %.preheader102.i.i, %76, %..split_crit_edge.i.i + %91 = load i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + %92 = and i32 %91, 1610544021 + store i32 %92, i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + %93 = call fastcc i32 @func_25(i8* @g_10) nounwind + store i16 -29645, i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 5), align 4 + %94 = call fastcc i32 @func_25(i8* @g_161) nounwind + %95 = icmp eq i32 %94, 0 + br i1 %95, label %96, label %.preheader..preheader.split_crit_edge.i.i + +; <label>:96 ; preds = %func_33.exit.i + %97 = load i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + %98 = and i32 %97, 1610544021 + store i32 %98, i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + %99 = call fastcc i32 @func_25(i8* @g_10) nounwind + br label %.preheader..preheader.split_crit_edge.i.i + +.preheader..preheader.split_crit_edge.i.i: ; preds = %96, %func_33.exit.i + store i32 707207536, i32* @g_542, align 4 + store i32 -24, i32* @g_349, align 4 + %100 = call fastcc i32 @func_25(i8* @g_331) nounwind + %101 = load i32** @g_1335, align 4 + %102 = load i32* %101, align 4 + %103 = load i32* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 2, i32 7, i32 1), align 4 + %104 = and i32 %103, %102 + store i32 %104, i32* getelementptr inbounds (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647, i32 0, i32 0, i32 2, i32 7, i32 1), align 4 + store i32 0, i32* %101, align 4 + %105 = load i32** @g_1335, align 4 + store i32 0, i32* %105, align 4 + %106 = load i32** @g_1335, align 4 + store i32 0, i32* %106, align 4 + %107 = load i32** @g_1335, align 4 + store i32 0, i32* %107, align 4 + %108 = load i32** @g_1335, align 4 + store i32 0, i32* %108, align 4 + %109 = load i32** @g_1335, align 4 + store i32 0, i32* %109, align 4 + %110 = load i32** @g_1335, align 4 + store i32 0, i32* %110, align 4 + %111 = load i32** @g_1335, align 4 + store i32 0, i32* %111, align 4 + %112 = load i32** @g_1335, align 4 + store i32 0, i32* %112, align 4 + %113 = load i32** @g_1335, align 4 + store i32 0, i32* %113, align 4 + %114 = load i32** @g_1335, align 4 + store i32 0, i32* %114, align 4 + %115 = load i32** @g_1335, align 4 + store i32 0, i32* %115, align 4 + %116 = load i32** @g_1335, align 4 + store i32 0, i32* %116, align 4 + %117 = load i32** @g_1335, align 4 + store i32 0, i32* %117, align 4 + %118 = load i32** @g_1335, align 4 + store i32 0, i32* %118, align 4 + %119 = load i32** @g_1335, align 4 + store i32 0, i32* %119, align 4 + %120 = load i32** @g_1335, align 4 + store i32 0, i32* %120, align 4 + %121 = load i32** @g_1335, align 4 + store i32 0, i32* %121, align 4 + %122 = load i32** @g_1335, align 4 + store i32 0, i32* %122, align 4 + %123 = load i32** @g_1335, align 4 + store i32 0, i32* %123, align 4 + %124 = load i32** @g_1335, align 4 + store i32 0, i32* %124, align 4 + %125 = load i32** @g_1335, align 4 + store i32 0, i32* %125, align 4 + %126 = load i32** @g_1335, align 4 + store i32 0, i32* %126, align 4 + %127 = load i32** @g_1335, align 4 + store i32 0, i32* %127, align 4 + %128 = load i32** @g_1335, align 4 + store i32 0, i32* %128, align 4 + %129 = load i32** @g_1335, align 4 + store i32 0, i32* %129, align 4 + %130 = bitcast %union.U3* %p_6.i.i to i8* + call void @llvm.lifetime.start(i64 -1, i8* %130) nounwind + %.02.i.i = getelementptr %union.U3* %p_6.i.i, i32 0, i32 0 + store i8* null, i8** %.02.i.i, align 8 + store i8 0, i8* @g_331, align 1 + br label %safe_mod_func_uint32_t_u_u.exit.i.i + +safe_mod_func_uint32_t_u_u.exit.i.i: ; preds = %189, %.preheader..preheader.split_crit_edge.i.i + %indvars.iv.i = phi i32 [ %indvars.iv.next.i, %189 ], [ 0, %.preheader..preheader.split_crit_edge.i.i ] + %p_5.sroa.0.0.extract.trunc2674116.i.i = phi i8 [ %p_5.sroa.0.0.extract.trunc2670.i.i, %189 ], [ -1, %.preheader..preheader.split_crit_edge.i.i ] + %p_5.sroa.1.sroa.0.0.load6982115.i.i = phi i24 [ %p_5.sroa.1.sroa.0.0.load6978.i.i, %189 ], [ -1, %.preheader..preheader.split_crit_edge.i.i ] + store i16 0, i16* @g_84, align 2 + %p_5.sroa.1.1.insert.ext36.i.i = trunc i24 %p_5.sroa.1.sroa.0.0.load6982115.i.i to i16 + %p_5.sroa.1.1.insert.shift37.i.i = shl i16 %p_5.sroa.1.1.insert.ext36.i.i, 8 + %p_5.sroa.0.0.insert.ext10.i.i = zext i8 %p_5.sroa.0.0.extract.trunc2674116.i.i to i16 + %p_5.sroa.0.0.insert.insert12.i.i = or i16 %p_5.sroa.1.1.insert.shift37.i.i, %p_5.sroa.0.0.insert.ext10.i.i + store i32 1, i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 4), align 4 + %131 = load i32* bitcast ({ i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] }* @g_17 to i32*), align 4 + %132 = lshr i32 %131, 7 + %.tr.i.i = trunc i32 %132 to i16 + %133 = and i16 %.tr.i.i, 255 + store i16 %133, i16* @g_145, align 2 + %134 = zext i16 %133 to i32 + %135 = load i16* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 5), align 4 + %136 = mul i16 %135, 3888 + %137 = zext i16 %136 to i32 + %138 = urem i32 %137, -10 + %139 = trunc i32 %138 to i16 + %140 = sub i16 %139, %p_5.sroa.0.0.insert.insert12.i.i + %141 = icmp ugt i16 %140, 116 + %142 = zext i1 %141 to i8 + %143 = load i8** @g_171, align 4 + %144 = load i8* %143, align 1 + %145 = icmp eq i8 %144, 0 + br i1 %145, label %.preheader86.i.i, label %146 + +; <label>:146 ; preds = %safe_mod_func_uint32_t_u_u.exit.i.i + %div.i.i.i = udiv i8 %142, %144 + br label %.preheader86.i.i + +.preheader86.i.i: ; preds = %146, %safe_mod_func_uint32_t_u_u.exit.i.i + %.in.i.i.i = phi i8 [ %div.i.i.i, %146 ], [ %142, %safe_mod_func_uint32_t_u_u.exit.i.i ] + %147 = zext i8 %.in.i.i.i to i32 + %148 = icmp uge i32 %134, %147 + %149 = zext i1 %148 to i32 + store i32 %149, i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 4), align 4 + %150 = getelementptr inbounds [4 x [3 x i8]]* @g_483, i32 0, i32 0, i32 %indvars.iv.i + %151 = load i8* %150, align 1 + %152 = zext i8 %151 to i32 + %153 = or i32 %149, %152 + %154 = trunc i32 %153 to i8 + store i8 %154, i8* %150, align 1 + store i32* null, i32** getelementptr inbounds ([10 x i32*]* @g_286, i32 0, i32 7), align 4 + store i16 0, i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 5), align 4 + %.pre.i.i = load i32** @g_1335, align 4 + %155 = load i32* %.pre.i.i, align 4 + %156 = icmp eq i32 %155, 0 + br i1 %156, label %.preheader88.i.i, label %.loopexit98.i.i + +.preheader88.i.i: ; preds = %.preheader86.i.i + %157 = load i32* @g_1531, align 4 + %158 = add i32 %157, -1 + store i32 %158, i32* @g_1531, align 4 + br label %159 + +; <label>:159 ; preds = %161, %.preheader88.i.i + %p_5.sroa.1.sroa.0.0.load6984.i.i = phi i24 [ 2912987, %161 ], [ 0, %.preheader88.i.i ] + %p_5.sroa.0.0.extract.trunc2676.i.i = phi i8 [ -109, %161 ], [ 0, %.preheader88.i.i ] + %storemerge11.i.i = phi i16 [ %164, %161 ], [ 0, %.preheader88.i.i ] + store i16 %storemerge11.i.i, i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 5), align 4 + %160 = icmp ult i16 %storemerge11.i.i, 3 + br i1 %160, label %161, label %165 + +; <label>:161 ; preds = %159 + %162 = load i32* %.pre.i.i, align 4 + %163 = icmp eq i32 %162, 0 + %164 = add i16 %storemerge11.i.i, 1 + br i1 %163, label %159, label %165 + +; <label>:165 ; preds = %161, %159 + store %union.U3* %p_6.i.i, %union.U3** @g_1430, align 4 + store i16 1, i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 5), align 4 + br label %.loopexit98.i.i + +.loopexit98.i.i: ; preds = %165, %.preheader86.i.i + %l_1468.sroa.1.1.lcssa.i.i = phi i32 [ -6, %.preheader86.i.i ], [ 0, %165 ] + %p_5.sroa.0.0.extract.trunc2672.lcssa.i.i = phi i8 [ %p_5.sroa.0.0.extract.trunc2674116.i.i, %.preheader86.i.i ], [ %p_5.sroa.0.0.extract.trunc2676.i.i, %165 ] + %p_5.sroa.1.sroa.0.0.load6980.lcssa.i.i = phi i24 [ %p_5.sroa.1.sroa.0.0.load6982115.i.i, %.preheader86.i.i ], [ %p_5.sroa.1.sroa.0.0.load6984.i.i, %165 ] + %166 = load i32* @g_1544, align 4 + %167 = add i32 %166, 1 + store i32 %167, i32* @g_1544, align 4 + call void @llvm.memset.p0i8.i32(i8* bitcast ([10 x [6 x [4 x i8**]]]* @g_170 to i8*), i8 0, i32 960, i32 4, i1 false) nounwind + store i32 6, i32* @g_117, align 4 + store i8 10, i8* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 7), align 4 + %.promoted45.i = load i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 2, i32 1), align 1 + %168 = add i8 %.promoted45.i, 1 + store i8 %168, i8* getelementptr inbounds ([1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 2, i32 1), align 1 + store i8 1, i8* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 0), align 4 + store i32 -1, i32* %.pre.i.i, align 4 + store i16 4, i16* @g_1541, align 2 + store i8 1, i8* @g_153, align 1 + store i16 1, i16* @g_84, align 2 + %169 = load i32** @g_1335, align 4 + %170 = load i32* %169, align 4 + %171 = icmp eq i32 %170, 0 + br i1 %171, label %.preheader109.i.i, label %189 + +.preheader109.i.i: ; preds = %.loopexit98.i.i + store i32 0, i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 1), align 4 + br label %.preheader106.i.i + +.preheader106.i.i: ; preds = %safe_div_func_uint32_t_u_u.exit..preheader106_crit_edge.i.i, %.preheader109.i.i + %172 = phi i32* [ %169, %.preheader109.i.i ], [ %.pre133.i.i, %safe_div_func_uint32_t_u_u.exit..preheader106_crit_edge.i.i ] + %l_1468.sroa.1.3113.i.i = phi i32 [ %l_1468.sroa.1.1.lcssa.i.i, %.preheader109.i.i ], [ %185, %safe_div_func_uint32_t_u_u.exit..preheader106_crit_edge.i.i ] + %p_5.sroa.0.0.extract.trunc2671112.i.i = phi i8 [ %p_5.sroa.0.0.extract.trunc2672.lcssa.i.i, %.preheader109.i.i ], [ %p_5.sroa.0.0.extract.trunc.i.i, %safe_div_func_uint32_t_u_u.exit..preheader106_crit_edge.i.i ] + %p_5.sroa.1.sroa.0.0.load6979111.i.i = phi i24 [ %p_5.sroa.1.sroa.0.0.load6980.lcssa.i.i, %.preheader109.i.i ], [ %p_5.sroa.1.1.extract.trunc.i.i, %safe_div_func_uint32_t_u_u.exit..preheader106_crit_edge.i.i ] + %p_5.sroa.1.1.insert.ext.i.i = zext i24 %p_5.sroa.1.sroa.0.0.load6979111.i.i to i32 + %p_5.sroa.1.1.insert.shift.i.i = shl nuw i32 %p_5.sroa.1.1.insert.ext.i.i, 8 + %p_5.sroa.0.0.insert.ext.i.i = zext i8 %p_5.sroa.0.0.extract.trunc2671112.i.i to i32 + %p_5.sroa.0.0.insert.insert.i.i = or i32 %p_5.sroa.1.1.insert.shift.i.i, %p_5.sroa.0.0.insert.ext.i.i + store i32 %p_5.sroa.0.0.insert.insert.i.i, i32* %172, align 4 + %173 = icmp ugt i32 %p_5.sroa.0.0.insert.insert.i.i, 33091 + %174 = zext i1 %173 to i32 + %175 = sext i8 %p_5.sroa.0.0.extract.trunc2671112.i.i to i32 + %si1..i85.i.i = or i32 %175, %174 + %176 = or i32 %si1..i85.i.i, 294498568 + %177 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 9) to i32*), align 4 + %178 = and i32 %177, 2147483647 + %179 = icmp eq i32 %178, 0 + br i1 %179, label %safe_div_func_uint32_t_u_u.exit.i.i, label %180 + +; <label>:180 ; preds = %.preheader106.i.i + %181 = udiv i32 %176, %178 + br label %safe_div_func_uint32_t_u_u.exit.i.i + +safe_div_func_uint32_t_u_u.exit.i.i: ; preds = %180, %.preheader106.i.i + %182 = phi i32 [ %181, %180 ], [ %176, %.preheader106.i.i ] + %183 = icmp eq i32 %182, 0 + %184 = zext i1 %183 to i32 + %185 = xor i32 %184, %l_1468.sroa.1.3113.i.i + %p_5.sroa.1.1.extract.shift.i.i = lshr i32 %185, 8 + %p_5.sroa.0.0.extract.trunc.i.i = trunc i32 %185 to i8 + %p_5.sroa.1.1.extract.trunc.i.i = trunc i32 %p_5.sroa.1.1.extract.shift.i.i to i24 + %186 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 1), align 4 + %187 = add nsw i32 %186, 1 + store i32 %187, i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 1), align 4 + %188 = icmp slt i32 %187, 3 + br i1 %188, label %safe_div_func_uint32_t_u_u.exit..preheader106_crit_edge.i.i, label %.loopexit110.i.i + +safe_div_func_uint32_t_u_u.exit..preheader106_crit_edge.i.i: ; preds = %safe_div_func_uint32_t_u_u.exit.i.i + %.pre133.i.i = load i32** @g_1335, align 4 + br label %.preheader106.i.i + +.loopexit110.i.i: ; preds = %safe_div_func_uint32_t_u_u.exit.i.i + store i16 1, i16* @g_1137, align 2 + br label %189 + +; <label>:189 ; preds = %.loopexit110.i.i, %.loopexit98.i.i + %p_5.sroa.1.sroa.0.0.load6978.i.i = phi i24 [ %p_5.sroa.1.sroa.0.0.load6980.lcssa.i.i, %.loopexit98.i.i ], [ %p_5.sroa.1.1.extract.trunc.i.i, %.loopexit110.i.i ] + %p_5.sroa.0.0.extract.trunc2670.i.i = phi i8 [ %p_5.sroa.0.0.extract.trunc2672.lcssa.i.i, %.loopexit98.i.i ], [ %p_5.sroa.0.0.extract.trunc.i.i, %.loopexit110.i.i ] + %indvars.iv.next.i = add i32 %indvars.iv.i, 1 + %190 = trunc i32 %indvars.iv.next.i to i8 + store i8 %190, i8* @g_331, align 1 + %exitcond370 = icmp eq i8 %190, 3 + br i1 %exitcond370, label %191, label %safe_mod_func_uint32_t_u_u.exit.i.i + +; <label>:191 ; preds = %189 + %192 = load i32** @g_1335, align 4 + %193 = load i32* %192, align 4 + %194 = icmp eq i32 %193, 0 + br i1 %194, label %.preheader120.i.i, label %func_2.exit.i + +.preheader120.i.i: ; preds = %191 + store i32 3, i32* @g_1544, align 4 + br label %func_2.exit.i + +func_2.exit.i: ; preds = %.preheader120.i.i, %191 + call void @llvm.lifetime.end(i64 -1, i8* %130) nounwind + %195 = icmp eq i8 %p_5.sroa.0.0.extract.trunc2670.i.i, 0 + br i1 %195, label %197, label %196 + +; <label>:196 ; preds = %func_2.exit.i + store i32 0, i32* @g_162, align 4 + store i32 -1778429617, i32* %192, align 4 + br label %func_1.exit + +; <label>:197 ; preds = %func_2.exit.i + store i32 -206198525, i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 0), align 4 + %198 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 1), align 4 + %199 = xor i32 %198, -206198525 + store i32 %199, i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 1), align 4 + %200 = icmp eq i32 %198, -206198525 + br i1 %200, label %.preheader40.i, label %func_1.exit + +.preheader40.i: ; preds = %197 + store i8***** @g_1357, i8****** getelementptr inbounds ([4 x i8*****]* @g_1726, i32 0, i32 1), align 4 + store i32 23, i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 1), align 4 + br label %func_1.exit + +func_1.exit: ; preds = %.preheader40.i, %197, %196 + call fastcc void @transparent_crc(i64 1, i8* getelementptr inbounds ([4 x i8]* @.str1, i32 0, i32 0), i32 %print_hash_value.0) + %201 = load i8* @g_10, align 1 + %202 = sext i8 %201 to i64 + call fastcc void @transparent_crc(i64 %202, i8* getelementptr inbounds ([5 x i8]* @.str2, i32 0, i32 0), i32 %print_hash_value.0) + %203 = load i32* bitcast ({ i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] }* @g_17 to i32*), align 4 + %204 = and i32 %203, 127 + %205 = zext i32 %204 to i64 + call fastcc void @transparent_crc(i64 %205, i8* getelementptr inbounds ([8 x i8]* @.str3, i32 0, i32 0), i32 %print_hash_value.0) + %206 = load i32* bitcast ({ i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] }* @g_17 to i32*), align 4 + %207 = lshr i32 %206, 7 + %208 = and i32 %207, 255 + %209 = zext i32 %208 to i64 + call fastcc void @transparent_crc(i64 %209, i8* getelementptr inbounds ([8 x i8]* @.str4, i32 0, i32 0), i32 %print_hash_value.0) + %210 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] }* @g_17, i32 0, i32 3) to i32*), align 4 + %211 = shl i32 %210, 9 + %212 = ashr exact i32 %211, 9 + %213 = sext i32 %212 to i64 + call fastcc void @transparent_crc(i64 %213, i8* getelementptr inbounds ([8 x i8]* @.str5, i32 0, i32 0), i32 %print_hash_value.0) + %214 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i8, [2 x i8], i8, i8, i8, i8, i8, i8, [2 x i8] }* @g_17, i32 0, i32 7) to i32*), align 4 + %215 = shl i32 %214, 22 + %216 = ashr exact i32 %215, 22 + %217 = sext i32 %216 to i64 + call fastcc void @transparent_crc(i64 %217, i8* getelementptr inbounds ([8 x i8]* @.str6, i32 0, i32 0), i32 %print_hash_value.0) + %218 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 0), align 4 + %219 = sext i8 %218 to i64 + call fastcc void @transparent_crc(i64 %219, i8* getelementptr inbounds ([8 x i8]* @.str7, i32 0, i32 0), i32 %print_hash_value.0) + %220 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 1), align 4 + %221 = zext i32 %220 to i64 + call fastcc void @transparent_crc(i64 %221, i8* getelementptr inbounds ([8 x i8]* @.str8, i32 0, i32 0), i32 %print_hash_value.0) + %222 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 2) to i32*), align 4 + %223 = and i32 %222, 67108863 + %224 = zext i32 %223 to i64 + call fastcc void @transparent_crc(i64 %224, i8* getelementptr inbounds ([8 x i8]* @.str9, i32 0, i32 0), i32 %print_hash_value.0) + %225 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 0), align 4 + %226 = sext i8 %225 to i64 + call fastcc void @transparent_crc(i64 %226, i8* getelementptr inbounds ([11 x i8]* @.str10, i32 0, i32 0), i32 %print_hash_value.0) + %227 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 1), align 4 + %228 = sext i32 %227 to i64 + call fastcc void @transparent_crc(i64 %228, i8* getelementptr inbounds ([11 x i8]* @.str11, i32 0, i32 0), i32 %print_hash_value.0) + %229 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 2), align 4 + %230 = sext i32 %229 to i64 + call fastcc void @transparent_crc(i64 %230, i8* getelementptr inbounds ([11 x i8]* @.str12, i32 0, i32 0), i32 %print_hash_value.0) + %231 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 3), align 4 + %232 = sext i32 %231 to i64 + call fastcc void @transparent_crc(i64 %232, i8* getelementptr inbounds ([11 x i8]* @.str13, i32 0, i32 0), i32 %print_hash_value.0) + %233 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 4), align 4 + %234 = zext i32 %233 to i64 + call fastcc void @transparent_crc(i64 %234, i8* getelementptr inbounds ([11 x i8]* @.str14, i32 0, i32 0), i32 %print_hash_value.0) + %235 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 5), align 4 + %236 = zext i16 %235 to i64 + call fastcc void @transparent_crc(i64 %236, i8* getelementptr inbounds ([11 x i8]* @.str15, i32 0, i32 0), i32 %print_hash_value.0) + %237 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 6), align 4 + %238 = zext i32 %237 to i64 + call fastcc void @transparent_crc(i64 %238, i8* getelementptr inbounds ([11 x i8]* @.str16, i32 0, i32 0), i32 %print_hash_value.0) + %239 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 7), align 4 + %240 = zext i8 %239 to i64 + call fastcc void @transparent_crc(i64 %240, i8* getelementptr inbounds ([11 x i8]* @.str17, i32 0, i32 0), i32 %print_hash_value.0) + %241 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 9) to i32*), align 4 + %242 = and i32 %241, 2147483647 + %243 = zext i32 %242 to i64 + call fastcc void @transparent_crc(i64 %243, i8* getelementptr inbounds ([11 x i8]* @.str18, i32 0, i32 0), i32 %print_hash_value.0) + %244 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 6, i32 13), align 4 + %245 = sext i16 %244 to i64 + call fastcc void @transparent_crc(i64 %245, i8* getelementptr inbounds ([11 x i8]* @.str19, i32 0, i32 0), i32 %print_hash_value.0) + %246 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 0), align 4 + %247 = sext i8 %246 to i64 + call fastcc void @transparent_crc(i64 %247, i8* getelementptr inbounds ([11 x i8]* @.str20, i32 0, i32 0), i32 %print_hash_value.0) + %248 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 1), align 4 + %249 = sext i32 %248 to i64 + call fastcc void @transparent_crc(i64 %249, i8* getelementptr inbounds ([11 x i8]* @.str21, i32 0, i32 0), i32 %print_hash_value.0) + %250 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 2), align 4 + %251 = sext i32 %250 to i64 + call fastcc void @transparent_crc(i64 %251, i8* getelementptr inbounds ([11 x i8]* @.str22, i32 0, i32 0), i32 %print_hash_value.0) + %252 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 3), align 4 + %253 = sext i32 %252 to i64 + call fastcc void @transparent_crc(i64 %253, i8* getelementptr inbounds ([11 x i8]* @.str23, i32 0, i32 0), i32 %print_hash_value.0) + %254 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 4), align 4 + %255 = zext i32 %254 to i64 + call fastcc void @transparent_crc(i64 %255, i8* getelementptr inbounds ([11 x i8]* @.str24, i32 0, i32 0), i32 %print_hash_value.0) + %256 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 5), align 4 + %257 = zext i16 %256 to i64 + call fastcc void @transparent_crc(i64 %257, i8* getelementptr inbounds ([11 x i8]* @.str25, i32 0, i32 0), i32 %print_hash_value.0) + %258 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 6), align 4 + %259 = zext i32 %258 to i64 + call fastcc void @transparent_crc(i64 %259, i8* getelementptr inbounds ([11 x i8]* @.str26, i32 0, i32 0), i32 %print_hash_value.0) + %260 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 7), align 4 + %261 = zext i8 %260 to i64 + call fastcc void @transparent_crc(i64 %261, i8* getelementptr inbounds ([11 x i8]* @.str27, i32 0, i32 0), i32 %print_hash_value.0) + %262 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 9) to i32*), align 4 + %263 = and i32 %262, 2147483647 + %264 = zext i32 %263 to i64 + call fastcc void @transparent_crc(i64 %264, i8* getelementptr inbounds ([11 x i8]* @.str28, i32 0, i32 0), i32 %print_hash_value.0) + %265 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 13), align 4 + %266 = sext i16 %265 to i64 + call fastcc void @transparent_crc(i64 %266, i8* getelementptr inbounds ([11 x i8]* @.str29, i32 0, i32 0), i32 %print_hash_value.0) + %267 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 8), align 4 + %268 = zext i8 %267 to i64 + call fastcc void @transparent_crc(i64 %268, i8* getelementptr inbounds ([8 x i8]* @.str30, i32 0, i32 0), i32 %print_hash_value.0) + %269 = load i32* getelementptr inbounds (%union.U4* @g_53, i32 0, i32 0), align 4 + %270 = zext i32 %269 to i64 + call fastcc void @transparent_crc(i64 %270, i8* getelementptr inbounds ([8 x i8]* @.str31, i32 0, i32 0), i32 %print_hash_value.0) + %271 = load i32* getelementptr inbounds (%union.U4* @g_53, i32 0, i32 0), align 4 + %272 = zext i32 %271 to i64 + call fastcc void @transparent_crc(i64 %272, i8* getelementptr inbounds ([8 x i8]* @.str32, i32 0, i32 0), i32 %print_hash_value.0) + %273 = load i8* bitcast (%union.U4* @g_53 to i8*), align 4 + %274 = sext i8 %273 to i64 + call fastcc void @transparent_crc(i64 %274, i8* getelementptr inbounds ([8 x i8]* @.str33, i32 0, i32 0), i32 %print_hash_value.0) + %275 = load i32* getelementptr inbounds (%union.U4* @g_53, i32 0, i32 0), align 4 + %276 = sext i32 %275 to i64 + call fastcc void @transparent_crc(i64 %276, i8* getelementptr inbounds ([8 x i8]* @.str34, i32 0, i32 0), i32 %print_hash_value.0) + %277 = icmp eq i32 %print_hash_value.0, 0 + br label %278 + +; <label>:278 ; preds = %284, %func_1.exit + %j.0350 = phi i32 [ 0, %func_1.exit ], [ %285, %284 ] + %279 = getelementptr inbounds [5 x [10 x i32]]* @g_58, i32 0, i32 0, i32 %j.0350 + %280 = load i32* %279, align 4 + %281 = sext i32 %280 to i64 + call fastcc void @transparent_crc(i64 %281, i8* getelementptr inbounds ([11 x i8]* @.str35, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %284, label %282 + +; <label>:282 ; preds = %278 + %283 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 0, i32 %j.0350) nounwind + br label %284 + +; <label>:284 ; preds = %282, %278 + %285 = add nsw i32 %j.0350, 1 + %exitcond368 = icmp eq i32 %285, 10 + br i1 %exitcond368, label %.preheader349.1, label %278 + +; <label>:286 ; preds = %.preheader345 + %287 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 0, i32 0) nounwind + br label %288 + +; <label>:288 ; preds = %.preheader345, %286 + call fastcc void @transparent_crc(i64 129, i8* getelementptr inbounds ([6 x i8]* @.str71, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader342 + +.preheader342: ; preds = %623, %288 + %i.3344 = phi i32 [ 0, %288 ], [ %624, %623 ] + %289 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 0, i32 0 + %290 = load i32* %289, align 4 + %291 = zext i32 %290 to i64 + call fastcc void @transparent_crc(i64 %291, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.critedge, label %292 + +; <label>:292 ; preds = %.preheader342 + %293 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 0, i32 0) nounwind + %294 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 0, i32 1 + %295 = load i32* %294, align 4 + %296 = zext i32 %295 to i64 + call fastcc void @transparent_crc(i64 %296, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + %297 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 0, i32 1) nounwind + br label %585 + +; <label>:298 ; preds = %623 + %299 = load i16* @g_455, align 2 + %300 = zext i16 %299 to i64 + call fastcc void @transparent_crc(i64 %300, i8* getelementptr inbounds ([6 x i8]* @.str74, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader337 + +.preheader337: ; preds = %580, %298 + %i.4339 = phi i32 [ 0, %298 ], [ %581, %580 ] + %301 = getelementptr inbounds [4 x [3 x i8]]* @g_483, i32 0, i32 %i.4339, i32 0 + %302 = load i8* %301, align 1 + %303 = zext i8 %302 to i64 + call fastcc void @transparent_crc(i64 %303, i8* getelementptr inbounds ([12 x i8]* @.str75, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.critedge384, label %304 + +; <label>:304 ; preds = %.preheader337 + %305 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 %i.4339, i32 0) nounwind + %306 = getelementptr inbounds [4 x [3 x i8]]* @g_483, i32 0, i32 %i.4339, i32 1 + %307 = load i8* %306, align 1 + %308 = zext i8 %307 to i64 + call fastcc void @transparent_crc(i64 %308, i8* getelementptr inbounds ([12 x i8]* @.str75, i32 0, i32 0), i32 %print_hash_value.0) + %309 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 %i.4339, i32 1) nounwind + br label %574 + +; <label>:310 ; preds = %580 + call fastcc void @transparent_crc(i64 6, i8* getelementptr inbounds ([9 x i8]* @.str76, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 3842404096, i8* getelementptr inbounds ([9 x i8]* @.str77, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 1391, i8* getelementptr inbounds ([9 x i8]* @.str78, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -44, i8* getelementptr inbounds ([12 x i8]* @.str79, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -1, i8* getelementptr inbounds ([12 x i8]* @.str80, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 244833036, i8* getelementptr inbounds ([12 x i8]* @.str81, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 1824027386, i8* getelementptr inbounds ([12 x i8]* @.str82, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 2587167374, i8* getelementptr inbounds ([12 x i8]* @.str83, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 19100, i8* getelementptr inbounds ([12 x i8]* @.str84, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 4294967295, i8* getelementptr inbounds ([12 x i8]* @.str85, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 0, i8* getelementptr inbounds ([12 x i8]* @.str86, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 10917, i8* getelementptr inbounds ([12 x i8]* @.str87, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 1, i8* getelementptr inbounds ([12 x i8]* @.str88, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -1, i8* getelementptr inbounds ([12 x i8]* @.str89, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -466884464, i8* getelementptr inbounds ([12 x i8]* @.str90, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 1530089492, i8* getelementptr inbounds ([12 x i8]* @.str91, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 6, i8* getelementptr inbounds ([12 x i8]* @.str92, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 7, i8* getelementptr inbounds ([12 x i8]* @.str93, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 240, i8* getelementptr inbounds ([12 x i8]* @.str94, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 1, i8* getelementptr inbounds ([12 x i8]* @.str95, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 255, i8* getelementptr inbounds ([12 x i8]* @.str96, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 42778, i8* getelementptr inbounds ([12 x i8]* @.str97, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -7838, i8* getelementptr inbounds ([12 x i8]* @.str98, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 255, i8* getelementptr inbounds ([9 x i8]* @.str99, i32 0, i32 0), i32 %print_hash_value.0) + %311 = load i32* @g_542, align 4 + %312 = sext i32 %311 to i64 + call fastcc void @transparent_crc(i64 %312, i8* getelementptr inbounds ([6 x i8]* @.str100, i32 0, i32 0), i32 %print_hash_value.0) + %313 = load i8* @g_543, align 1 + %314 = sext i8 %313 to i64 + call fastcc void @transparent_crc(i64 %314, i8* getelementptr inbounds ([6 x i8]* @.str101, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader334 + +.preheader334: ; preds = %398, %310 + %i.5336 = phi i32 [ 0, %310 ], [ %399, %398 ] + br label %315 + +; <label>:315 ; preds = %396, %.preheader334 + %j.4335 = phi i32 [ 0, %.preheader334 ], [ %397, %396 ] + %316 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 0 + %317 = load i8* %316, align 4 + %318 = sext i8 %317 to i64 + call fastcc void @transparent_crc(i64 %318, i8* getelementptr inbounds ([15 x i8]* @.str102, i32 0, i32 0), i32 %print_hash_value.0) + %319 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 1 + %320 = load i32* %319, align 4 + %321 = zext i32 %320 to i64 + call fastcc void @transparent_crc(i64 %321, i8* getelementptr inbounds ([15 x i8]* @.str103, i32 0, i32 0), i32 %print_hash_value.0) + %322 = getelementptr i8* %316, i32 8 + %323 = bitcast i8* %322 to i32* + %324 = load i32* %323, align 4 + %325 = and i32 %324, 67108863 + %326 = zext i32 %325 to i64 + call fastcc void @transparent_crc(i64 %326, i8* getelementptr inbounds ([15 x i8]* @.str104, i32 0, i32 0), i32 %print_hash_value.0) + %327 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 0 + %328 = load i8* %327, align 4 + %329 = sext i8 %328 to i64 + call fastcc void @transparent_crc(i64 %329, i8* getelementptr inbounds ([18 x i8]* @.str105, i32 0, i32 0), i32 %print_hash_value.0) + %330 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 1 + %331 = load i32* %330, align 4 + %332 = sext i32 %331 to i64 + call fastcc void @transparent_crc(i64 %332, i8* getelementptr inbounds ([18 x i8]* @.str106, i32 0, i32 0), i32 %print_hash_value.0) + %333 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 2 + %334 = load i32* %333, align 4 + %335 = sext i32 %334 to i64 + call fastcc void @transparent_crc(i64 %335, i8* getelementptr inbounds ([18 x i8]* @.str107, i32 0, i32 0), i32 %print_hash_value.0) + %336 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 3 + %337 = load i32* %336, align 4 + %338 = sext i32 %337 to i64 + call fastcc void @transparent_crc(i64 %338, i8* getelementptr inbounds ([18 x i8]* @.str108, i32 0, i32 0), i32 %print_hash_value.0) + %339 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 4 + %340 = load i32* %339, align 4 + %341 = zext i32 %340 to i64 + call fastcc void @transparent_crc(i64 %341, i8* getelementptr inbounds ([18 x i8]* @.str109, i32 0, i32 0), i32 %print_hash_value.0) + %342 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 5 + %343 = load i16* %342, align 4 + %344 = zext i16 %343 to i64 + call fastcc void @transparent_crc(i64 %344, i8* getelementptr inbounds ([18 x i8]* @.str110, i32 0, i32 0), i32 %print_hash_value.0) + %345 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 6 + %346 = load i32* %345, align 4 + %347 = zext i32 %346 to i64 + call fastcc void @transparent_crc(i64 %347, i8* getelementptr inbounds ([18 x i8]* @.str111, i32 0, i32 0), i32 %print_hash_value.0) + %348 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 7 + %349 = load i8* %348, align 4 + %350 = zext i8 %349 to i64 + call fastcc void @transparent_crc(i64 %350, i8* getelementptr inbounds ([18 x i8]* @.str112, i32 0, i32 0), i32 %print_hash_value.0) + %351 = getelementptr i8* %327, i32 32 + %352 = bitcast i8* %351 to i32* + %353 = load i32* %352, align 4 + %354 = and i32 %353, 2147483647 + %355 = zext i32 %354 to i64 + call fastcc void @transparent_crc(i64 %355, i8* getelementptr inbounds ([18 x i8]* @.str113, i32 0, i32 0), i32 %print_hash_value.0) + %356 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 3, i32 10 + %357 = load i16* %356, align 4 + %358 = sext i16 %357 to i64 + call fastcc void @transparent_crc(i64 %358, i8* getelementptr inbounds ([18 x i8]* @.str114, i32 0, i32 0), i32 %print_hash_value.0) + %359 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 0 + %360 = load i8* %359, align 4 + %361 = sext i8 %360 to i64 + call fastcc void @transparent_crc(i64 %361, i8* getelementptr inbounds ([18 x i8]* @.str115, i32 0, i32 0), i32 %print_hash_value.0) + %362 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 1 + %363 = load i32* %362, align 4 + %364 = sext i32 %363 to i64 + call fastcc void @transparent_crc(i64 %364, i8* getelementptr inbounds ([18 x i8]* @.str116, i32 0, i32 0), i32 %print_hash_value.0) + %365 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 2 + %366 = load i32* %365, align 4 + %367 = sext i32 %366 to i64 + call fastcc void @transparent_crc(i64 %367, i8* getelementptr inbounds ([18 x i8]* @.str117, i32 0, i32 0), i32 %print_hash_value.0) + %368 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 3 + %369 = load i32* %368, align 4 + %370 = sext i32 %369 to i64 + call fastcc void @transparent_crc(i64 %370, i8* getelementptr inbounds ([18 x i8]* @.str118, i32 0, i32 0), i32 %print_hash_value.0) + %371 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 4 + %372 = load i32* %371, align 4 + %373 = zext i32 %372 to i64 + call fastcc void @transparent_crc(i64 %373, i8* getelementptr inbounds ([18 x i8]* @.str119, i32 0, i32 0), i32 %print_hash_value.0) + %374 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 5 + %375 = load i16* %374, align 4 + %376 = zext i16 %375 to i64 + call fastcc void @transparent_crc(i64 %376, i8* getelementptr inbounds ([18 x i8]* @.str120, i32 0, i32 0), i32 %print_hash_value.0) + %377 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 6 + %378 = load i32* %377, align 4 + %379 = zext i32 %378 to i64 + call fastcc void @transparent_crc(i64 %379, i8* getelementptr inbounds ([18 x i8]* @.str121, i32 0, i32 0), i32 %print_hash_value.0) + %380 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 7 + %381 = load i8* %380, align 4 + %382 = zext i8 %381 to i64 + call fastcc void @transparent_crc(i64 %382, i8* getelementptr inbounds ([18 x i8]* @.str122, i32 0, i32 0), i32 %print_hash_value.0) + %383 = getelementptr i8* %359, i32 32 + %384 = bitcast i8* %383 to i32* + %385 = load i32* %384, align 4 + %386 = and i32 %385, 2147483647 + %387 = zext i32 %386 to i64 + call fastcc void @transparent_crc(i64 %387, i8* getelementptr inbounds ([18 x i8]* @.str123, i32 0, i32 0), i32 %print_hash_value.0) + %388 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 4, i32 10 + %389 = load i16* %388, align 4 + %390 = sext i16 %389 to i64 + call fastcc void @transparent_crc(i64 %390, i8* getelementptr inbounds ([18 x i8]* @.str124, i32 0, i32 0), i32 %print_hash_value.0) + %391 = getelementptr inbounds [2 x [9 x %struct.S1]]* bitcast (<{ <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }>, <{ { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }, { i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] } }> }>* @g_647 to [2 x [9 x %struct.S1]]*), i32 0, i32 %i.5336, i32 %j.4335, i32 5 + %392 = load i8* %391, align 4 + %393 = zext i8 %392 to i64 + call fastcc void @transparent_crc(i64 %393, i8* getelementptr inbounds ([15 x i8]* @.str125, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %396, label %394 + +; <label>:394 ; preds = %315 + %395 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 %i.5336, i32 %j.4335) nounwind + br label %396 + +; <label>:396 ; preds = %394, %315 + %397 = add nsw i32 %j.4335, 1 + %exitcond360 = icmp eq i32 %397, 9 + br i1 %exitcond360, label %398, label %315 + +; <label>:398 ; preds = %396 + %399 = add nsw i32 %i.5336, 1 + %exitcond361 = icmp eq i32 %399, 2 + br i1 %exitcond361, label %.preheader331, label %.preheader334 + +.preheader331: ; preds = %398 + %400 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 0), align 4 + %401 = sext i8 %400 to i64 + call fastcc void @transparent_crc(i64 %401, i8* getelementptr inbounds ([9 x i8]* @.str126, i32 0, i32 0), i32 %print_hash_value.0) + %402 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 1), align 4 + %403 = zext i32 %402 to i64 + call fastcc void @transparent_crc(i64 %403, i8* getelementptr inbounds ([9 x i8]* @.str127, i32 0, i32 0), i32 %print_hash_value.0) + %404 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 2) to i32*), align 4 + %405 = and i32 %404, 67108863 + %406 = zext i32 %405 to i64 + call fastcc void @transparent_crc(i64 %406, i8* getelementptr inbounds ([9 x i8]* @.str128, i32 0, i32 0), i32 %print_hash_value.0) + %407 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 0), align 4 + %408 = sext i8 %407 to i64 + call fastcc void @transparent_crc(i64 %408, i8* getelementptr inbounds ([12 x i8]* @.str129, i32 0, i32 0), i32 %print_hash_value.0) + %409 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 1), align 4 + %410 = sext i32 %409 to i64 + call fastcc void @transparent_crc(i64 %410, i8* getelementptr inbounds ([12 x i8]* @.str130, i32 0, i32 0), i32 %print_hash_value.0) + %411 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 2), align 4 + %412 = sext i32 %411 to i64 + call fastcc void @transparent_crc(i64 %412, i8* getelementptr inbounds ([12 x i8]* @.str131, i32 0, i32 0), i32 %print_hash_value.0) + %413 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 3), align 4 + %414 = sext i32 %413 to i64 + call fastcc void @transparent_crc(i64 %414, i8* getelementptr inbounds ([12 x i8]* @.str132, i32 0, i32 0), i32 %print_hash_value.0) + %415 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 4), align 4 + %416 = zext i32 %415 to i64 + call fastcc void @transparent_crc(i64 %416, i8* getelementptr inbounds ([12 x i8]* @.str133, i32 0, i32 0), i32 %print_hash_value.0) + %417 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 5), align 4 + %418 = zext i16 %417 to i64 + call fastcc void @transparent_crc(i64 %418, i8* getelementptr inbounds ([12 x i8]* @.str134, i32 0, i32 0), i32 %print_hash_value.0) + %419 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 6), align 4 + %420 = zext i32 %419 to i64 + call fastcc void @transparent_crc(i64 %420, i8* getelementptr inbounds ([12 x i8]* @.str135, i32 0, i32 0), i32 %print_hash_value.0) + %421 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 7), align 4 + %422 = zext i8 %421 to i64 + call fastcc void @transparent_crc(i64 %422, i8* getelementptr inbounds ([12 x i8]* @.str136, i32 0, i32 0), i32 %print_hash_value.0) + %423 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 9) to i32*), align 4 + %424 = and i32 %423, 2147483647 + %425 = zext i32 %424 to i64 + call fastcc void @transparent_crc(i64 %425, i8* getelementptr inbounds ([12 x i8]* @.str137, i32 0, i32 0), i32 %print_hash_value.0) + %426 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 6, i32 13), align 4 + %427 = sext i16 %426 to i64 + call fastcc void @transparent_crc(i64 %427, i8* getelementptr inbounds ([12 x i8]* @.str138, i32 0, i32 0), i32 %print_hash_value.0) + %428 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 0), align 4 + %429 = sext i8 %428 to i64 + call fastcc void @transparent_crc(i64 %429, i8* getelementptr inbounds ([12 x i8]* @.str139, i32 0, i32 0), i32 %print_hash_value.0) + %430 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 1), align 4 + %431 = sext i32 %430 to i64 + call fastcc void @transparent_crc(i64 %431, i8* getelementptr inbounds ([12 x i8]* @.str140, i32 0, i32 0), i32 %print_hash_value.0) + %432 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 2), align 4 + %433 = sext i32 %432 to i64 + call fastcc void @transparent_crc(i64 %433, i8* getelementptr inbounds ([12 x i8]* @.str141, i32 0, i32 0), i32 %print_hash_value.0) + %434 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 3), align 4 + %435 = sext i32 %434 to i64 + call fastcc void @transparent_crc(i64 %435, i8* getelementptr inbounds ([12 x i8]* @.str142, i32 0, i32 0), i32 %print_hash_value.0) + %436 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 4), align 4 + %437 = zext i32 %436 to i64 + call fastcc void @transparent_crc(i64 %437, i8* getelementptr inbounds ([12 x i8]* @.str143, i32 0, i32 0), i32 %print_hash_value.0) + %438 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 5), align 4 + %439 = zext i16 %438 to i64 + call fastcc void @transparent_crc(i64 %439, i8* getelementptr inbounds ([12 x i8]* @.str144, i32 0, i32 0), i32 %print_hash_value.0) + %440 = load i32* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 6), align 4 + %441 = zext i32 %440 to i64 + call fastcc void @transparent_crc(i64 %441, i8* getelementptr inbounds ([12 x i8]* @.str145, i32 0, i32 0), i32 %print_hash_value.0) + %442 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 7), align 4 + %443 = zext i8 %442 to i64 + call fastcc void @transparent_crc(i64 %443, i8* getelementptr inbounds ([12 x i8]* @.str146, i32 0, i32 0), i32 %print_hash_value.0) + %444 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 9) to i32*), align 4 + %445 = and i32 %444, 2147483647 + %446 = zext i32 %445 to i64 + call fastcc void @transparent_crc(i64 %446, i8* getelementptr inbounds ([12 x i8]* @.str147, i32 0, i32 0), i32 %print_hash_value.0) + %447 = load i16* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 7, i32 13), align 4 + %448 = sext i16 %447 to i64 + call fastcc void @transparent_crc(i64 %448, i8* getelementptr inbounds ([12 x i8]* @.str148, i32 0, i32 0), i32 %print_hash_value.0) + %449 = load i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_649, i32 0, i32 8), align 4 + %450 = zext i8 %449 to i64 + call fastcc void @transparent_crc(i64 %450, i8* getelementptr inbounds ([9 x i8]* @.str149, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader329 + +.preheader329: ; preds = %569, %.preheader331 + %j.5332 = phi i32 [ 0, %.preheader331 ], [ %570, %569 ] + %451 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 0 + %452 = load i8* %451, align 1 + %453 = zext i8 %452 to i64 + call fastcc void @transparent_crc(i64 %453, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.critedge385, label %454 + +; <label>:454 ; preds = %.preheader329 + %455 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 0, i32 %j.5332, i32 0) nounwind + %456 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 1 + %457 = load i8* %456, align 1 + %458 = zext i8 %457 to i64 + call fastcc void @transparent_crc(i64 %458, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + %459 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 0, i32 %j.5332, i32 1) nounwind + br label %543 + +; <label>:460 ; preds = %569 + call fastcc void @transparent_crc(i64 395457217, i8* getelementptr inbounds ([6 x i8]* @.str151, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -10, i8* getelementptr inbounds ([9 x i8]* @.str152, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.thread382, label %508 + +.thread382: ; preds = %460 + call fastcc void @transparent_crc(i64 -10, i8* getelementptr inbounds ([9 x i8]* @.str152, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -10, i8* getelementptr inbounds ([9 x i8]* @.str152, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -10, i8* getelementptr inbounds ([9 x i8]* @.str152, i32 0, i32 0), i32 %print_hash_value.0) + br label %513 + +.preheader: ; preds = %.preheader324, %471 + %j.6325 = phi i32 [ 0, %.preheader324 ], [ %472, %471 ] + br label %461 + +; <label>:461 ; preds = %469, %.preheader + %k.2323 = phi i32 [ 0, %.preheader ], [ %470, %469 ] + %462 = getelementptr inbounds [1 x [6 x [9 x %union.U4]]]* @g_1737, i32 0, i32 0, i32 %j.6325, i32 %k.2323, i32 0 + %463 = load i32* %462, align 4 + %464 = zext i32 %463 to i64 + call fastcc void @transparent_crc(i64 %464, i8* getelementptr inbounds ([19 x i8]* @.str177, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 %464, i8* getelementptr inbounds ([19 x i8]* @.str178, i32 0, i32 0), i32 %print_hash_value.0) + %trunc = trunc i32 %463 to i8 + %465 = sext i8 %trunc to i64 + call fastcc void @transparent_crc(i64 %465, i8* getelementptr inbounds ([19 x i8]* @.str179, i32 0, i32 0), i32 %print_hash_value.0) + %466 = sext i32 %463 to i64 + call fastcc void @transparent_crc(i64 %466, i8* getelementptr inbounds ([19 x i8]* @.str180, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %469, label %467 + +; <label>:467 ; preds = %461 + %468 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 0, i32 %j.6325, i32 %k.2323) nounwind + br label %469 + +; <label>:469 ; preds = %467, %461 + %470 = add nsw i32 %k.2323, 1 + %exitcond = icmp eq i32 %470, 9 + br i1 %exitcond, label %471, label %461 + +; <label>:471 ; preds = %469 + %472 = add nsw i32 %j.6325, 1 + %exitcond355 = icmp eq i32 %472, 6 + br i1 %exitcond355, label %473, label %.preheader + +; <label>:473 ; preds = %471 + %474 = load i32* @crc32_context, align 4 + %475 = xor i32 %474, -1 + %476 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str181, i32 0, i32 0), i32 %475) nounwind + ret i32 0 + +; <label>:477 ; preds = %513 + %478 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 0) nounwind + %479 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 1), align 4 + %480 = zext i32 %479 to i64 + call fastcc void @transparent_crc(i64 %480, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %481 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 1) nounwind + %482 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 2), align 4 + %483 = zext i32 %482 to i64 + call fastcc void @transparent_crc(i64 %483, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %484 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 2) nounwind + %485 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 3), align 4 + %486 = zext i32 %485 to i64 + call fastcc void @transparent_crc(i64 %486, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %487 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 3) nounwind + %488 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 4), align 4 + %489 = zext i32 %488 to i64 + call fastcc void @transparent_crc(i64 %489, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %490 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 4) nounwind + %491 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 5), align 4 + %492 = zext i32 %491 to i64 + call fastcc void @transparent_crc(i64 %492, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %493 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 5) nounwind + %494 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 6), align 4 + %495 = zext i32 %494 to i64 + call fastcc void @transparent_crc(i64 %495, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %496 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 6) nounwind + %497 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 7), align 4 + %498 = zext i32 %497 to i64 + call fastcc void @transparent_crc(i64 %498, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %499 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 7) nounwind + br label %.preheader324 + +.preheader324: ; preds = %.thread380, %477 + call fastcc void @transparent_crc(i64 17175, i8* getelementptr inbounds ([7 x i8]* @.str168, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 280481329, i8* getelementptr inbounds ([7 x i8]* @.str169, i32 0, i32 0), i32 %print_hash_value.0) + %500 = load i32* @g_1531, align 4 + %501 = zext i32 %500 to i64 + call fastcc void @transparent_crc(i64 %501, i8* getelementptr inbounds ([7 x i8]* @.str170, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 88, i8* getelementptr inbounds ([7 x i8]* @.str171, i32 0, i32 0), i32 %print_hash_value.0) + %502 = load i16* @g_1541, align 2 + %503 = sext i16 %502 to i64 + call fastcc void @transparent_crc(i64 %503, i8* getelementptr inbounds ([7 x i8]* @.str172, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 6, i8* getelementptr inbounds ([7 x i8]* @.str173, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 1, i8* getelementptr inbounds ([7 x i8]* @.str174, i32 0, i32 0), i32 %print_hash_value.0) + %504 = load i32* @g_1544, align 4 + %505 = zext i32 %504 to i64 + call fastcc void @transparent_crc(i64 %505, i8* getelementptr inbounds ([7 x i8]* @.str175, i32 0, i32 0), i32 %print_hash_value.0) + %506 = load i8* @g_1639, align 1 + %507 = zext i8 %506 to i64 + call fastcc void @transparent_crc(i64 %507, i8* getelementptr inbounds ([7 x i8]* @.str176, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader + +; <label>:508 ; preds = %460 + %509 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 0) nounwind + call fastcc void @transparent_crc(i64 -10, i8* getelementptr inbounds ([9 x i8]* @.str152, i32 0, i32 0), i32 %print_hash_value.0) + %510 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 1) nounwind + call fastcc void @transparent_crc(i64 -10, i8* getelementptr inbounds ([9 x i8]* @.str152, i32 0, i32 0), i32 %print_hash_value.0) + %511 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 2) nounwind + call fastcc void @transparent_crc(i64 -10, i8* getelementptr inbounds ([9 x i8]* @.str152, i32 0, i32 0), i32 %print_hash_value.0) + %512 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 3) nounwind + br label %513 + +; <label>:513 ; preds = %508, %.thread382 + call fastcc void @transparent_crc(i64 3, i8* getelementptr inbounds ([9 x i8]* @.str153, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 2, i8* getelementptr inbounds ([9 x i8]* @.str154, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -1549, i8* getelementptr inbounds ([9 x i8]* @.str155, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 20, i8* getelementptr inbounds ([9 x i8]* @.str156, i32 0, i32 0), i32 %print_hash_value.0) + %514 = load i16* @g_1003, align 2 + %515 = sext i16 %514 to i64 + call fastcc void @transparent_crc(i64 %515, i8* getelementptr inbounds ([7 x i8]* @.str157, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 4294967295, i8* getelementptr inbounds ([7 x i8]* @.str158, i32 0, i32 0), i32 %print_hash_value.0) + %516 = load i16* @g_1048, align 2 + %517 = zext i16 %516 to i64 + call fastcc void @transparent_crc(i64 %517, i8* getelementptr inbounds ([7 x i8]* @.str159, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 5, i8* getelementptr inbounds ([10 x i8]* @.str160, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 9, i8* getelementptr inbounds ([10 x i8]* @.str161, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -679, i8* getelementptr inbounds ([10 x i8]* @.str162, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 15, i8* getelementptr inbounds ([10 x i8]* @.str163, i32 0, i32 0), i32 %print_hash_value.0) + %518 = load i16* @g_1137, align 2 + %519 = zext i16 %518 to i64 + call fastcc void @transparent_crc(i64 %519, i8* getelementptr inbounds ([7 x i8]* @.str164, i32 0, i32 0), i32 %print_hash_value.0) + %520 = load i16* @g_1209, align 2 + %521 = sext i16 %520 to i64 + call fastcc void @transparent_crc(i64 %521, i8* getelementptr inbounds ([7 x i8]* @.str165, i32 0, i32 0), i32 %print_hash_value.0) + %522 = load i32* @g_1211, align 4 + %523 = zext i32 %522 to i64 + call fastcc void @transparent_crc(i64 %523, i8* getelementptr inbounds ([7 x i8]* @.str166, i32 0, i32 0), i32 %print_hash_value.0) + %524 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 0), align 4 + %525 = zext i32 %524 to i64 + call fastcc void @transparent_crc(i64 %525, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.thread380, label %477 + +.thread380: ; preds = %513 + %526 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 1), align 4 + %527 = zext i32 %526 to i64 + call fastcc void @transparent_crc(i64 %527, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %528 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 2), align 4 + %529 = zext i32 %528 to i64 + call fastcc void @transparent_crc(i64 %529, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %530 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 3), align 4 + %531 = zext i32 %530 to i64 + call fastcc void @transparent_crc(i64 %531, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %532 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 4), align 4 + %533 = zext i32 %532 to i64 + call fastcc void @transparent_crc(i64 %533, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %534 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 5), align 4 + %535 = zext i32 %534 to i64 + call fastcc void @transparent_crc(i64 %535, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %536 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 6), align 4 + %537 = zext i32 %536 to i64 + call fastcc void @transparent_crc(i64 %537, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + %538 = load i32* getelementptr inbounds ([8 x i32]* @g_1326, i32 0, i32 7), align 4 + %539 = zext i32 %538 to i64 + call fastcc void @transparent_crc(i64 %539, i8* getelementptr inbounds ([10 x i8]* @.str167, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader324 + +.critedge385: ; preds = %.preheader329 + %540 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 1 + %541 = load i8* %540, align 1 + %542 = zext i8 %541 to i64 + call fastcc void @transparent_crc(i64 %542, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + br label %543 + +; <label>:543 ; preds = %.critedge385, %454 + %544 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 2 + %545 = load i8* %544, align 1 + %546 = zext i8 %545 to i64 + call fastcc void @transparent_crc(i64 %546, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.critedge387, label %547 + +; <label>:547 ; preds = %543 + %548 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 0, i32 %j.5332, i32 2) nounwind + %549 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 3 + %550 = load i8* %549, align 1 + %551 = zext i8 %550 to i64 + call fastcc void @transparent_crc(i64 %551, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + %552 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 0, i32 %j.5332, i32 3) nounwind + br label %556 + +.critedge387: ; preds = %543 + %553 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 3 + %554 = load i8* %553, align 1 + %555 = zext i8 %554 to i64 + call fastcc void @transparent_crc(i64 %555, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + br label %556 + +; <label>:556 ; preds = %.critedge387, %547 + %557 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 4 + %558 = load i8* %557, align 1 + %559 = zext i8 %558 to i64 + call fastcc void @transparent_crc(i64 %559, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.critedge389, label %560 + +; <label>:560 ; preds = %556 + %561 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 0, i32 %j.5332, i32 4) nounwind + %562 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 5 + %563 = load i8* %562, align 1 + %564 = zext i8 %563 to i64 + call fastcc void @transparent_crc(i64 %564, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + %565 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 0, i32 %j.5332, i32 5) nounwind + br label %569 + +.critedge389: ; preds = %556 + %566 = getelementptr inbounds [1 x [3 x [6 x i8]]]* @g_839, i32 0, i32 0, i32 %j.5332, i32 5 + %567 = load i8* %566, align 1 + %568 = zext i8 %567 to i64 + call fastcc void @transparent_crc(i64 %568, i8* getelementptr inbounds ([15 x i8]* @.str150, i32 0, i32 0), i32 %print_hash_value.0) + br label %569 + +; <label>:569 ; preds = %.critedge389, %560 + %570 = add nsw i32 %j.5332, 1 + %exitcond359 = icmp eq i32 %570, 3 + br i1 %exitcond359, label %460, label %.preheader329 + +.critedge384: ; preds = %.preheader337 + %571 = getelementptr inbounds [4 x [3 x i8]]* @g_483, i32 0, i32 %i.4339, i32 1 + %572 = load i8* %571, align 1 + %573 = zext i8 %572 to i64 + call fastcc void @transparent_crc(i64 %573, i8* getelementptr inbounds ([12 x i8]* @.str75, i32 0, i32 0), i32 %print_hash_value.0) + br label %574 + +; <label>:574 ; preds = %.critedge384, %304 + %575 = getelementptr inbounds [4 x [3 x i8]]* @g_483, i32 0, i32 %i.4339, i32 2 + %576 = load i8* %575, align 1 + %577 = zext i8 %576 to i64 + call fastcc void @transparent_crc(i64 %577, i8* getelementptr inbounds ([12 x i8]* @.str75, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %580, label %578 + +; <label>:578 ; preds = %574 + %579 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 %i.4339, i32 2) nounwind + br label %580 + +; <label>:580 ; preds = %578, %574 + %581 = add nsw i32 %i.4339, 1 + %exitcond363 = icmp eq i32 %581, 4 + br i1 %exitcond363, label %310, label %.preheader337 + +.critedge: ; preds = %.preheader342 + %582 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 0, i32 1 + %583 = load i32* %582, align 4 + %584 = zext i32 %583 to i64 + call fastcc void @transparent_crc(i64 %584, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br label %585 + +; <label>:585 ; preds = %.critedge, %292 + %586 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 0, i32 2 + %587 = load i32* %586, align 4 + %588 = zext i32 %587 to i64 + call fastcc void @transparent_crc(i64 %588, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.preheader340.1.critedge, label %589 + +; <label>:589 ; preds = %585 + %590 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 0, i32 2) nounwind + %591 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 0, i32 3 + %592 = load i32* %591, align 4 + %593 = zext i32 %592 to i64 + call fastcc void @transparent_crc(i64 %593, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + %594 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 0, i32 3) nounwind + br label %.preheader340.1 + +.preheader340.1.critedge: ; preds = %585 + %595 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 0, i32 3 + %596 = load i32* %595, align 4 + %597 = zext i32 %596 to i64 + call fastcc void @transparent_crc(i64 %597, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader340.1 + +.preheader340.1: ; preds = %.preheader340.1.critedge, %589 + %598 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 1, i32 0 + %599 = load i32* %598, align 4 + %600 = zext i32 %599 to i64 + call fastcc void @transparent_crc(i64 %600, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.critedge393, label %601 + +; <label>:601 ; preds = %.preheader340.1 + %602 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 1, i32 0) nounwind + %603 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 1, i32 1 + %604 = load i32* %603, align 4 + %605 = zext i32 %604 to i64 + call fastcc void @transparent_crc(i64 %605, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + %606 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 1, i32 1) nounwind + br label %610 + +.critedge393: ; preds = %.preheader340.1 + %607 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 1, i32 1 + %608 = load i32* %607, align 4 + %609 = zext i32 %608 to i64 + call fastcc void @transparent_crc(i64 %609, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br label %610 + +; <label>:610 ; preds = %.critedge393, %601 + %611 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 1, i32 2 + %612 = load i32* %611, align 4 + %613 = zext i32 %612 to i64 + call fastcc void @transparent_crc(i64 %613, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.critedge395, label %614 + +; <label>:614 ; preds = %610 + %615 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 1, i32 2) nounwind + %616 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 1, i32 3 + %617 = load i32* %616, align 4 + %618 = zext i32 %617 to i64 + call fastcc void @transparent_crc(i64 %618, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + %619 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str73, i32 0, i32 0), i32 %i.3344, i32 1, i32 3) nounwind + br label %623 + +.critedge395: ; preds = %610 + %620 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %i.3344, i32 1, i32 3 + %621 = load i32* %620, align 4 + %622 = zext i32 %621 to i64 + call fastcc void @transparent_crc(i64 %622, i8* getelementptr inbounds ([15 x i8]* @.str72, i32 0, i32 0), i32 %print_hash_value.0) + br label %623 + +; <label>:623 ; preds = %.critedge395, %614 + %624 = add nsw i32 %i.3344, 1 + %exitcond366 = icmp eq i32 %624, 3 + br i1 %exitcond366, label %298, label %.preheader342 + +; <label>:625 ; preds = %694 + %626 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 0) nounwind + %627 = load i16* getelementptr inbounds ([3 x i16]* @g_192, i32 0, i32 1), align 2 + %628 = zext i16 %627 to i64 + call fastcc void @transparent_crc(i64 %628, i8* getelementptr inbounds ([9 x i8]* @.str51, i32 0, i32 0), i32 %print_hash_value.0) + %629 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 1) nounwind + %630 = load i16* getelementptr inbounds ([3 x i16]* @g_192, i32 0, i32 2), align 2 + %631 = zext i16 %630 to i64 + call fastcc void @transparent_crc(i64 %631, i8* getelementptr inbounds ([9 x i8]* @.str51, i32 0, i32 0), i32 %print_hash_value.0) + %632 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str52, i32 0, i32 0), i32 2) nounwind + br label %.preheader345 + +.preheader345: ; preds = %.thread383, %625 + %633 = load i8* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 0), align 4 + %634 = sext i8 %633 to i64 + call fastcc void @transparent_crc(i64 %634, i8* getelementptr inbounds ([9 x i8]* @.str53, i32 0, i32 0), i32 %print_hash_value.0) + %635 = load i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 1), align 4 + %636 = sext i32 %635 to i64 + call fastcc void @transparent_crc(i64 %636, i8* getelementptr inbounds ([9 x i8]* @.str54, i32 0, i32 0), i32 %print_hash_value.0) + %637 = load i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 2), align 4 + %638 = sext i32 %637 to i64 + call fastcc void @transparent_crc(i64 %638, i8* getelementptr inbounds ([9 x i8]* @.str55, i32 0, i32 0), i32 %print_hash_value.0) + %639 = load i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 3), align 4 + %640 = sext i32 %639 to i64 + call fastcc void @transparent_crc(i64 %640, i8* getelementptr inbounds ([9 x i8]* @.str56, i32 0, i32 0), i32 %print_hash_value.0) + %641 = load i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 4), align 4 + %642 = zext i32 %641 to i64 + call fastcc void @transparent_crc(i64 %642, i8* getelementptr inbounds ([9 x i8]* @.str57, i32 0, i32 0), i32 %print_hash_value.0) + %643 = load i16* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 5), align 4 + %644 = zext i16 %643 to i64 + call fastcc void @transparent_crc(i64 %644, i8* getelementptr inbounds ([9 x i8]* @.str58, i32 0, i32 0), i32 %print_hash_value.0) + %645 = load i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 6), align 4 + %646 = zext i32 %645 to i64 + call fastcc void @transparent_crc(i64 %646, i8* getelementptr inbounds ([9 x i8]* @.str59, i32 0, i32 0), i32 %print_hash_value.0) + %647 = load i8* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 7), align 4 + %648 = zext i8 %647 to i64 + call fastcc void @transparent_crc(i64 %648, i8* getelementptr inbounds ([9 x i8]* @.str60, i32 0, i32 0), i32 %print_hash_value.0) + %649 = load i32* bitcast (i8* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 9) to i32*), align 4 + %650 = and i32 %649, 2147483647 + %651 = zext i32 %650 to i64 + call fastcc void @transparent_crc(i64 %651, i8* getelementptr inbounds ([9 x i8]* @.str61, i32 0, i32 0), i32 %print_hash_value.0) + %652 = load i16* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 13), align 4 + %653 = sext i16 %652 to i64 + call fastcc void @transparent_crc(i64 %653, i8* getelementptr inbounds ([9 x i8]* @.str62, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -1, i8* getelementptr inbounds ([6 x i8]* @.str63, i32 0, i32 0), i32 %print_hash_value.0) + %654 = load i32* @g_325, align 4 + %655 = zext i32 %654 to i64 + call fastcc void @transparent_crc(i64 %655, i8* getelementptr inbounds ([6 x i8]* @.str64, i32 0, i32 0), i32 %print_hash_value.0) + %656 = load i8* @g_331, align 1 + %657 = sext i8 %656 to i64 + call fastcc void @transparent_crc(i64 %657, i8* getelementptr inbounds ([6 x i8]* @.str65, i32 0, i32 0), i32 %print_hash_value.0) + %658 = load i32* @g_333, align 4 + %659 = zext i32 %658 to i64 + call fastcc void @transparent_crc(i64 %659, i8* getelementptr inbounds ([6 x i8]* @.str66, i32 0, i32 0), i32 %print_hash_value.0) + %660 = load i32* @g_337, align 4 + %661 = sext i32 %660 to i64 + call fastcc void @transparent_crc(i64 %661, i8* getelementptr inbounds ([6 x i8]* @.str67, i32 0, i32 0), i32 %print_hash_value.0) + %662 = load i32* @g_349, align 4 + %663 = sext i32 %662 to i64 + call fastcc void @transparent_crc(i64 %663, i8* getelementptr inbounds ([6 x i8]* @.str68, i32 0, i32 0), i32 %print_hash_value.0) + %664 = load i8* @g_382, align 1 + %665 = sext i8 %664 to i64 + call fastcc void @transparent_crc(i64 %665, i8* getelementptr inbounds ([6 x i8]* @.str69, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 -1, i8* getelementptr inbounds ([12 x i8]* @.str70, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %288, label %286 + +.preheader349.1: ; preds = %671, %284 + %j.0350.1 = phi i32 [ %672, %671 ], [ 0, %284 ] + %666 = getelementptr inbounds [5 x [10 x i32]]* @g_58, i32 0, i32 1, i32 %j.0350.1 + %667 = load i32* %666, align 4 + %668 = sext i32 %667 to i64 + call fastcc void @transparent_crc(i64 %668, i8* getelementptr inbounds ([11 x i8]* @.str35, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %671, label %669 + +; <label>:669 ; preds = %.preheader349.1 + %670 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 1, i32 %j.0350.1) nounwind + br label %671 + +; <label>:671 ; preds = %669, %.preheader349.1 + %672 = add nsw i32 %j.0350.1, 1 + %exitcond368.1 = icmp eq i32 %672, 10 + br i1 %exitcond368.1, label %.preheader349.2, label %.preheader349.1 + +.preheader349.2: ; preds = %678, %671 + %j.0350.2 = phi i32 [ %679, %678 ], [ 0, %671 ] + %673 = getelementptr inbounds [5 x [10 x i32]]* @g_58, i32 0, i32 2, i32 %j.0350.2 + %674 = load i32* %673, align 4 + %675 = sext i32 %674 to i64 + call fastcc void @transparent_crc(i64 %675, i8* getelementptr inbounds ([11 x i8]* @.str35, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %678, label %676 + +; <label>:676 ; preds = %.preheader349.2 + %677 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 2, i32 %j.0350.2) nounwind + br label %678 + +; <label>:678 ; preds = %676, %.preheader349.2 + %679 = add nsw i32 %j.0350.2, 1 + %exitcond368.2 = icmp eq i32 %679, 10 + br i1 %exitcond368.2, label %.preheader349.3, label %.preheader349.2 + +.preheader349.3: ; preds = %685, %678 + %j.0350.3 = phi i32 [ %686, %685 ], [ 0, %678 ] + %680 = getelementptr inbounds [5 x [10 x i32]]* @g_58, i32 0, i32 3, i32 %j.0350.3 + %681 = load i32* %680, align 4 + %682 = sext i32 %681 to i64 + call fastcc void @transparent_crc(i64 %682, i8* getelementptr inbounds ([11 x i8]* @.str35, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %685, label %683 + +; <label>:683 ; preds = %.preheader349.3 + %684 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 3, i32 %j.0350.3) nounwind + br label %685 + +; <label>:685 ; preds = %683, %.preheader349.3 + %686 = add nsw i32 %j.0350.3, 1 + %exitcond368.3 = icmp eq i32 %686, 10 + br i1 %exitcond368.3, label %.preheader349.4, label %.preheader349.3 + +.preheader349.4: ; preds = %692, %685 + %j.0350.4 = phi i32 [ %693, %692 ], [ 0, %685 ] + %687 = getelementptr inbounds [5 x [10 x i32]]* @g_58, i32 0, i32 4, i32 %j.0350.4 + %688 = load i32* %687, align 4 + %689 = sext i32 %688 to i64 + call fastcc void @transparent_crc(i64 %689, i8* getelementptr inbounds ([11 x i8]* @.str35, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %692, label %690 + +; <label>:690 ; preds = %.preheader349.4 + %691 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str36, i32 0, i32 0), i32 4, i32 %j.0350.4) nounwind + br label %692 + +; <label>:692 ; preds = %690, %.preheader349.4 + %693 = add nsw i32 %j.0350.4, 1 + %exitcond368.4 = icmp eq i32 %693, 10 + br i1 %exitcond368.4, label %694, label %.preheader349.4 + +; <label>:694 ; preds = %692 + %695 = load i32* @g_60, align 4 + %696 = sext i32 %695 to i64 + call fastcc void @transparent_crc(i64 %696, i8* getelementptr inbounds ([5 x i8]* @.str37, i32 0, i32 0), i32 %print_hash_value.0) + %697 = load i32* @g_76, align 4 + %698 = zext i32 %697 to i64 + call fastcc void @transparent_crc(i64 %698, i8* getelementptr inbounds ([5 x i8]* @.str38, i32 0, i32 0), i32 %print_hash_value.0) + %699 = load i16* @g_84, align 2 + %700 = sext i16 %699 to i64 + call fastcc void @transparent_crc(i64 %700, i8* getelementptr inbounds ([5 x i8]* @.str39, i32 0, i32 0), i32 %print_hash_value.0) + %701 = load i8* @g_116, align 1 + %702 = sext i8 %701 to i64 + call fastcc void @transparent_crc(i64 %702, i8* getelementptr inbounds ([6 x i8]* @.str40, i32 0, i32 0), i32 %print_hash_value.0) + %703 = load i32* @g_117, align 4 + %704 = zext i32 %703 to i64 + call fastcc void @transparent_crc(i64 %704, i8* getelementptr inbounds ([6 x i8]* @.str41, i32 0, i32 0), i32 %print_hash_value.0) + %705 = load i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + %706 = zext i32 %705 to i64 + call fastcc void @transparent_crc(i64 %706, i8* getelementptr inbounds ([9 x i8]* @.str42, i32 0, i32 0), i32 %print_hash_value.0) + %707 = load i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + %708 = zext i32 %707 to i64 + call fastcc void @transparent_crc(i64 %708, i8* getelementptr inbounds ([9 x i8]* @.str43, i32 0, i32 0), i32 %print_hash_value.0) + %709 = load i8* bitcast (%union.U4* @g_123 to i8*), align 4 + %710 = sext i8 %709 to i64 + call fastcc void @transparent_crc(i64 %710, i8* getelementptr inbounds ([9 x i8]* @.str44, i32 0, i32 0), i32 %print_hash_value.0) + %711 = load i32* getelementptr inbounds (%union.U4* @g_123, i32 0, i32 0), align 4 + %712 = sext i32 %711 to i64 + call fastcc void @transparent_crc(i64 %712, i8* getelementptr inbounds ([9 x i8]* @.str45, i32 0, i32 0), i32 %print_hash_value.0) + %713 = load i16* @g_145, align 2 + %714 = sext i16 %713 to i64 + call fastcc void @transparent_crc(i64 %714, i8* getelementptr inbounds ([6 x i8]* @.str46, i32 0, i32 0), i32 %print_hash_value.0) + %715 = load i8* @g_153, align 1 + %716 = zext i8 %715 to i64 + call fastcc void @transparent_crc(i64 %716, i8* getelementptr inbounds ([6 x i8]* @.str47, i32 0, i32 0), i32 %print_hash_value.0) + %717 = load i8* @g_161, align 1 + %718 = sext i8 %717 to i64 + call fastcc void @transparent_crc(i64 %718, i8* getelementptr inbounds ([6 x i8]* @.str48, i32 0, i32 0), i32 %print_hash_value.0) + %719 = load i32* @g_162, align 4 + %720 = sext i32 %719 to i64 + call fastcc void @transparent_crc(i64 %720, i8* getelementptr inbounds ([6 x i8]* @.str49, i32 0, i32 0), i32 %print_hash_value.0) + call fastcc void @transparent_crc(i64 3, i8* getelementptr inbounds ([6 x i8]* @.str50, i32 0, i32 0), i32 %print_hash_value.0) + %721 = load i16* getelementptr inbounds ([3 x i16]* @g_192, i32 0, i32 0), align 2 + %722 = zext i16 %721 to i64 + call fastcc void @transparent_crc(i64 %722, i8* getelementptr inbounds ([9 x i8]* @.str51, i32 0, i32 0), i32 %print_hash_value.0) + br i1 %277, label %.thread383, label %625 + +.thread383: ; preds = %694 + %723 = load i16* getelementptr inbounds ([3 x i16]* @g_192, i32 0, i32 1), align 2 + %724 = zext i16 %723 to i64 + call fastcc void @transparent_crc(i64 %724, i8* getelementptr inbounds ([9 x i8]* @.str51, i32 0, i32 0), i32 %print_hash_value.0) + %725 = load i16* getelementptr inbounds ([3 x i16]* @g_192, i32 0, i32 2), align 2 + %726 = zext i16 %725 to i64 + call fastcc void @transparent_crc(i64 %726, i8* getelementptr inbounds ([9 x i8]* @.str51, i32 0, i32 0), i32 %print_hash_value.0) + br label %.preheader345 +} + +declare i32 @strcmp(i8* nocapture, i8* nocapture) nounwind readonly + +define internal fastcc void @transparent_crc(i64 %val, i8* %vname, i32 %flag) nounwind { + %1 = trunc i64 %val to i32 + %2 = load i32* @crc32_context, align 4 + %3 = lshr i32 %2, 8 + %.masked.i15.i = xor i32 %2, %1 + %4 = and i32 %.masked.i15.i, 255 + %5 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %4 + %6 = load i32* %5, align 4 + %7 = xor i32 %3, %6 + %8 = lshr i64 %val, 8 + %9 = trunc i64 %8 to i32 + %10 = lshr i32 %7, 8 + %.masked.i1416.i = xor i32 %7, %9 + %11 = and i32 %.masked.i1416.i, 255 + %12 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %11 + %13 = load i32* %12, align 4 + %14 = xor i32 %10, %13 + %15 = lshr i64 %val, 16 + %16 = trunc i64 %15 to i32 + %17 = lshr i32 %14, 8 + %.masked.i1317.i = xor i32 %14, %16 + %18 = and i32 %.masked.i1317.i, 255 + %19 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %18 + %20 = load i32* %19, align 4 + %21 = xor i32 %17, %20 + %22 = lshr i64 %val, 24 + %23 = trunc i64 %22 to i32 + %24 = lshr i32 %21, 8 + %.masked.i1218.i = xor i32 %21, %23 + %25 = and i32 %.masked.i1218.i, 255 + %26 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %25 + %27 = load i32* %26, align 4 + %28 = xor i32 %24, %27 + %29 = lshr i64 %val, 32 + %30 = trunc i64 %29 to i32 + %31 = lshr i32 %28, 8 + %.masked.i1119.i = xor i32 %28, %30 + %32 = and i32 %.masked.i1119.i, 255 + %33 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %32 + %34 = load i32* %33, align 4 + %35 = xor i32 %31, %34 + %36 = lshr i64 %val, 40 + %37 = trunc i64 %36 to i32 + %38 = lshr i32 %35, 8 + %.masked.i1020.i = xor i32 %35, %37 + %39 = and i32 %.masked.i1020.i, 255 + %40 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %39 + %41 = load i32* %40, align 4 + %42 = xor i32 %38, %41 + %43 = lshr i64 %val, 48 + %44 = trunc i64 %43 to i32 + %45 = lshr i32 %42, 8 + %.masked.i921.i = xor i32 %42, %44 + %46 = and i32 %.masked.i921.i, 255 + %47 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %46 + %48 = load i32* %47, align 4 + %49 = xor i32 %45, %48 + %50 = lshr i64 %val, 56 + %51 = trunc i64 %50 to i32 + %52 = lshr i32 %49, 8 + %.masked.i8.i = and i32 %49, 255 + %53 = xor i32 %.masked.i8.i, %51 + %54 = getelementptr inbounds [256 x i32]* @crc32_tab, i32 0, i32 %53 + %55 = load i32* %54, align 4 + %56 = xor i32 %52, %55 + store i32 %56, i32* @crc32_context, align 4 + %57 = icmp eq i32 %flag, 0 + br i1 %57, label %61, label %58 + +; <label>:58 ; preds = %0 + %59 = xor i32 %56, -1 + %60 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([36 x i8]* @.str182, i32 0, i32 0), i8* %vname, i32 %59) nounwind + br label %61 + +; <label>:61 ; preds = %58, %0 + ret void +} + +declare i32 @printf(i8* nocapture, ...) nounwind + +define internal fastcc i32 @func_25(i8* nocapture %p_26) nounwind { + store i32 -1, i32* @g_60, align 4 + store i32 3, i32* @g_337, align 4 + br label %.loopexit + +.loopexit: ; preds = %50, %0 + store i32 -5, i32* @g_60, align 4 + store i8 3, i8* getelementptr inbounds ({ i8, i32, i8, i8, i8, i8, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, { i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }, i8, [3 x i8] }* @g_38, i32 0, i32 7, i32 0), align 4 + store i8 2, i8* @g_116, align 1 + br label %.preheader49 + +.preheader49: ; preds = %47, %.loopexit + %1 = phi i8 [ 2, %.loopexit ], [ %48, %47 ] + store i32 1, i32* @g_60, align 4 + br label %2 + +; <label>:2 ; preds = %42, %.preheader49 + %3 = phi i8 [ %1, %.preheader49 ], [ %43, %42 ] + %l_476.sroa.1.052 = phi i16 [ -28159, %.preheader49 ], [ %l_476.sroa.1.2, %42 ] + %4 = phi i32 [ 1, %.preheader49 ], [ %45, %42 ] + %5 = sext i8 %3 to i32 + %6 = add nsw i32 %5, 1 + %7 = getelementptr inbounds [3 x [2 x [4 x i32]]]* @g_445, i32 0, i32 %5, i32 %4, i32 %6 + %8 = load i32* %7, align 4 + %9 = trunc i32 %8 to i16 + %10 = getelementptr inbounds [3 x i16]* @g_192, i32 0, i32 %5 + store i16 %9, i16* %10, align 2 + %11 = and i32 %8, 65535 + %12 = icmp eq i32 %11, 1 + br i1 %12, label %32, label %13 + +; <label>:13 ; preds = %2 + %14 = load i8* getelementptr inbounds ([4 x [3 x i8]]* @g_483, i32 0, i32 1, i32 2), align 1 + %15 = add i8 %14, -1 + store i8 %15, i8* getelementptr inbounds ([4 x [3 x i8]]* @g_483, i32 0, i32 1, i32 2), align 1 + %16 = trunc i32 %4 to i16 + %17 = zext i16 %l_476.sroa.1.052 to i32 + %18 = and i32 %4, %17 + %19 = trunc i32 %18 to i16 + %20 = icmp ne i16 %16, %19 + %21 = zext i1 %20 to i8 + store i8 %21, i8* %p_26, align 1 + %22 = load i8* @g_116, align 1 + %23 = sext i8 %22 to i32 + %24 = getelementptr inbounds [3 x i16]* @g_192, i32 0, i32 %23 + %25 = load i16* %24, align 2 + %26 = icmp eq i16 %25, 0 + %27 = load i32* @g_60, align 4 + br i1 %26, label %safe_div_func_int16_t_s_s.exit, label %._crit_edge + +safe_div_func_int16_t_s_s.exit: ; preds = %13 + %28 = trunc i32 %27 to i16 + %29 = icmp ne i16 %28, 0 + br label %._crit_edge + +._crit_edge: ; preds = %safe_div_func_int16_t_s_s.exit, %13 + %30 = phi i1 [ %29, %safe_div_func_int16_t_s_s.exit ], [ true, %13 ] + %31 = zext i1 %30 to i32 + store i32 %31, i32* getelementptr inbounds ({ i8, i32, i32, i32, i32, i16, i32, i8, [3 x i8], i8, i8, i8, i8, i16, [2 x i8] }* @g_261, i32 0, i32 1), align 4 + br label %42 + +; <label>:32 ; preds = %2 + %33 = load i8** @g_171, align 4 + %34 = load i8* %33, align 1 + %.pre.i = zext i8 %34 to i32 + %35 = icmp ugt i8 %34, 7 + %36 = select i1 %35, i32 0, i32 5 + %37 = shl i32 %.pre.i, %36 + %38 = shl i32 %4, 24 + %sext45 = mul i32 %38, %37 + %39 = ashr exact i32 %sext45, 24 + %40 = load i32* @g_349, align 4 + %41 = or i32 %39, %40 + store i32 %41, i32* @g_349, align 4 + br label %42 + +; <label>:42 ; preds = %32, %._crit_edge + %43 = phi i8 [ %22, %._crit_edge ], [ %3, %32 ] + %44 = phi i32 [ %27, %._crit_edge ], [ %4, %32 ] + %l_476.sroa.1.2 = phi i16 [ %19, %._crit_edge ], [ %l_476.sroa.1.052, %32 ] + store i32 -26, i32* @g_349, align 4 + %45 = add nsw i32 %44, -1 + store i32 %45, i32* @g_60, align 4 + %46 = icmp sgt i32 %44, 0 + br i1 %46, label %2, label %47 + +; <label>:47 ; preds = %42 + %48 = add i8 %43, -1 + store i8 %48, i8* @g_116, align 1 + %49 = icmp sgt i8 %48, -1 + br i1 %49, label %.preheader49, label %50 + +; <label>:50 ; preds = %47 + %51 = load i32* @g_337, align 4 + %52 = add nsw i32 %51, -1 + store i32 %52, i32* @g_337, align 4 + %53 = icmp sgt i32 %51, 0 + br i1 %53, label %.loopexit, label %54 + +; <label>:54 ; preds = %50 + ret i32 %45 +} + +declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind + +declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind + +declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind diff --git a/tests/cases/phi24_ta2.txt b/tests/cases/phi24_ta2.txt new file mode 100644 index 00000000..28ac318b --- /dev/null +++ b/tests/cases/phi24_ta2.txt @@ -0,0 +1 @@ +checksum = FCD45C53 diff --git a/tests/cases/storestruct.ll b/tests/cases/storestruct.ll index 15022e2f..5bd9224e 100644 --- a/tests/cases/storestruct.ll +++ b/tests/cases/storestruct.ll @@ -42,14 +42,14 @@ entry: %tmp5 = load i32* %a1, align 4, !dbg !18 ; [#uses=1] %tmp6 = load i32* %b2, align 4, !dbg !18 ; [#uses=1] - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %tmp5, i32 %tmp6), !dbg !18 ; [#uses=0] + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %tmp5, i32 %tmp6), !dbg !18 ; [#uses=0] %ptr = inttoptr i32 52 to i32* ; [#uses=1] store %struct.X { i32 ptrtoint (i32* getelementptr inbounds (i32* %ptr, i32 1, i32 0) to i32), i32 3 }, %struct.X* %y, align 4 ; store entire struct at once - %tmp5 = load i32* %a1, align 4, !dbg !18 ; [#uses=1] - %tmp6 = load i32* %b2, align 4, !dbg !18 ; [#uses=1] - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %tmp5, i32 %tmp6), !dbg !18 ; [#uses=0] + %tmp5b = load i32* %a1, align 4, !dbg !18 ; [#uses=1] + %tmp6b = load i32* %b2, align 4, !dbg !18 ; [#uses=1] + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %tmp5b, i32 %tmp6b), !dbg !18 ; [#uses=0] ret i32 0, !dbg !19 } diff --git a/tests/fuzz/12.c b/tests/fuzz/12.c new file mode 100644 index 00000000..75535892 --- /dev/null +++ b/tests/fuzz/12.c @@ -0,0 +1,2567 @@ +/* + * This is a RANDOMLY GENERATED PROGRAM. + * + * Generator: csmith 2.2.0 + * Git version: a8697aa + * Options: --no-volatiles --no-math64 --no-packed-struct + * Seed: 4209279686 + */ + +#include "csmith.h" + + +static long __undefined; + +/* --- Struct/Union Declarations --- */ +struct S0 { + int8_t f0; + int32_t f1; + const int32_t f2; + const int32_t f3; + uint32_t f4; + uint16_t f5; + const uint32_t f6; + uint8_t f7; + unsigned f8 : 31; + const int16_t f9; +}; + +struct S1 { + int8_t f0; + uint32_t f1; + unsigned f2 : 26; + struct S0 f3; + struct S0 f4; + uint8_t f5; +}; + +struct S2 { + unsigned f0 : 7; + unsigned f1 : 8; + signed f2 : 23; + const signed f3 : 10; +}; + +union U3 { + int8_t * f0; + const int32_t f1; +}; + +union U4 { + const uint32_t f0; + const uint32_t f1; + const int8_t f2; + int32_t f3; + int8_t * f4; +}; + +/* --- GLOBAL VARIABLES --- */ +static uint32_t g_8 = 1UL; +static int8_t g_10 = 5L; +static int8_t *g_9 = &g_10; +static struct S2 g_17 = {9,0,-2127,15}; +static struct S1 g_38 = {-5L,1UL,6440,{8L,7L,1L,0L,0xF4F6E089L,65526UL,0xECB2DECAL,0x65L,42219,2L},{0x2DL,-1L,0xF2FEC8B6L,0xE3C6AA55L,0x6935E7B0L,0x9BDDL,0xDE950740L,0x28L,44369,0L},0UL}; +static union U4 g_53 = {5UL}; +static int32_t g_58[5][10] = {{0xACE7FEFAL,0x13C76A60L,0xACE7FEFAL,(-3L),0xACE7FEFAL,0xC4D3BBE6L,1L,0x13C76A60L,0x13C76A60L,0x8475ADB6L},{0xCFC51725L,(-3L),0x8475ADB6L,0x8475ADB6L,0xE36C3AAFL,0L,0xE36C3AAFL,0x8475ADB6L,0xE36C3AAFL,(-3L)},{1L,0xCFC51725L,0xC4D3BBE6L,0xC4D3BBE6L,0x8475ADB6L,0L,1L,1L,(-3L),0xCFC51725L},{0xC4D3BBE6L,0xACE7FEFAL,0xACE7FEFAL,0L,0x8475ADB6L,0L,0xACE7FEFAL,0L,0xCFC51725L,(-3L)},{(-3L),1L,1L,0L,0xE36C3AAFL,0xCFC51725L,0xCFC51725L,0x13C76A60L,(-3L),0x13C76A60L}}; +static int32_t g_60 = (-3L); +static union U3 g_62 = {0}; +static uint32_t g_76 = 4294967295UL; +static int16_t g_84 = 0x7E28L; +static int8_t g_116 = 0xD4L; +static uint32_t g_117 = 4294967290UL; +static union U4 g_123 = {4294967295UL}; +static union U4 *g_122 = &g_123; +static int16_t g_145 = 8L; +static uint8_t g_153 = 0x17L; +static int8_t g_161 = 0x08L; +static int32_t g_162 = 0x17290AB1L; +static uint8_t **g_168 = (void*)0; +static uint8_t *g_171 = &g_38.f3.f7; +static uint8_t **g_170[10][6][4] = {{{&g_171,&g_171,&g_171,(void*)0},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,(void*)0},{&g_171,(void*)0,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171}},{{&g_171,(void*)0,(void*)0,(void*)0},{&g_171,(void*)0,&g_171,(void*)0},{&g_171,(void*)0,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,(void*)0,(void*)0,&g_171},{&g_171,&g_171,&g_171,(void*)0}},{{&g_171,&g_171,(void*)0,&g_171},{(void*)0,(void*)0,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,(void*)0,(void*)0},{(void*)0,&g_171,&g_171,(void*)0}},{{&g_171,&g_171,&g_171,&g_171},{&g_171,(void*)0,&g_171,&g_171},{&g_171,&g_171,(void*)0,&g_171},{&g_171,&g_171,&g_171,&g_171},{(void*)0,&g_171,&g_171,&g_171},{&g_171,&g_171,(void*)0,&g_171}},{{&g_171,&g_171,&g_171,&g_171},{(void*)0,&g_171,&g_171,&g_171},{(void*)0,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,(void*)0,(void*)0,(void*)0},{&g_171,&g_171,&g_171,(void*)0}},{{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,(void*)0,&g_171},{(void*)0,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{(void*)0,&g_171,&g_171,&g_171}},{{(void*)0,&g_171,&g_171,(void*)0},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,(void*)0,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,(void*)0}},{{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,(void*)0},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171}},{{&g_171,(void*)0,&g_171,&g_171},{&g_171,(void*)0,&g_171,&g_171},{(void*)0,(void*)0,&g_171,(void*)0},{&g_171,&g_171,&g_171,(void*)0},{(void*)0,(void*)0,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171}},{{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{(void*)0,&g_171,&g_171,&g_171},{&g_171,(void*)0,&g_171,&g_171},{&g_171,&g_171,&g_171,&g_171},{&g_171,&g_171,(void*)0,&g_171}}}; +static uint32_t g_187 = 3UL; +static uint16_t g_192[3] = {0xF355L,0xF355L,0xF355L}; +static struct S0 g_261 = {0x22L,1L,-9L,-7L,0UL,0x2A46L,0x8F22B6FFL,255UL,20777,0xB79CL}; +static const int32_t g_287 = (-1L); +static const int32_t *g_286[10] = {&g_287,&g_287,&g_287,&g_287,&g_287,&g_287,&g_287,&g_287,&g_287,&g_287}; +static uint32_t g_325 = 1UL; +static int8_t g_331 = 0L; +static uint32_t g_333 = 3UL; +static int32_t g_337 = 0x53F86A5FL; +static int32_t g_349 = 0x02F9AF2DL; +static struct S0 *g_356[3][2] = {{&g_261,&g_261},{&g_261,&g_261},{&g_261,&g_261}}; +static struct S0 **g_355 = &g_356[0][0]; +static int8_t g_382 = (-1L); +static union U3 g_388 = {0}; +static int32_t g_409[1][1] = {{(-1L)}}; +static uint8_t g_410 = 0x81L; +static uint32_t g_445[3][2][4] = {{{0xBA4605DFL,0x998E6834L,0x998E6834L,4294967287UL},{4294967295UL,7UL,4294967287UL,0x998E6834L}},{{0UL,4294967287UL,4294967287UL,4294967295UL},{4294967295UL,7UL,0xBA4605DFL,7UL}},{{4294967287UL,0xE2F7F8A9L,7UL,7UL},{7UL,7UL,0xBA4605DFL,0UL}}}; +static uint16_t g_455 = 0x9FF4L; +static union U3 * const g_473 = (void*)0; +static union U3 * const *g_472 = &g_473; +static uint8_t g_483[4][3] = {{0UL,0x75L,0x75L},{0x57L,255UL,255UL},{251UL,0x75L,0UL},{0x57L,255UL,0x57L}}; +static struct S1 **g_530 = (void*)0; +static const struct S1 g_533 = {6L,0xE5066F00L,1391,{0xD4L,-1L,0x0E97DB0CL,0x6CB872FAL,0x9A350A8EL,0x4A9CL,4294967295UL,0UL,10917,1L},{-1L,0xE42BE890L,0x5B335014L,6L,7UL,0x00F0L,1UL,255UL,42778,0xE162L},255UL}; +static int32_t g_542 = 0x919DE0D3L; +static int8_t g_543 = 0L; +static uint8_t * const ***g_566[3] = {(void*)0,(void*)0,(void*)0}; +static struct S1 g_647[2][9] = {{{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL},{0x57L,0x7E7015E1L,2488,{0x3CL,1L,0x57ACD286L,1L,0x247B06AFL,0UL,0x7FCC5974L,255UL,20003,-1L},{0x06L,0x936086E8L,5L,0x98AD5550L,0x76346C8FL,0xB046L,0x69E84237L,1UL,1918,7L},0xFDL}},{{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L},{0x92L,4294967293UL,6262,{0xD9L,0x255C6DC9L,0x1C5AC25CL,1L,0UL,65535UL,6UL,0x73L,8645,-1L},{0xF2L,0xE4C62D96L,0x8A6E76C9L,-5L,0x4824E707L,0xC203L,0xDF940BBBL,1UL,628,7L},0xC3L}}}; +static struct S1 g_649 = {-9L,4UL,4663,{3L,0xE03330A8L,0x52F98FABL,-9L,0x6E906C50L,5UL,0xF6CE7D18L,255UL,12315,0x36FAL},{0x69L,5L,0x613F0BAFL,0x2234E18AL,0x90C66E64L,0UL,0x6732634EL,0xACL,5678,0x7A0DL},0x5FL}; +static int8_t *g_759[10][6][2] = {{{&g_38.f4.f0,&g_382},{&g_647[0][2].f4.f0,&g_382},{&g_382,&g_261.f0},{&g_543,&g_38.f4.f0},{&g_543,&g_38.f4.f0},{&g_382,&g_647[0][2].f4.f0}},{{&g_647[0][2].f4.f0,&g_647[0][2].f4.f0},{&g_647[0][2].f4.f0,&g_38.f4.f0},{&g_261.f0,&g_382},{&g_261.f0,&g_38.f4.f0},{&g_647[0][2].f4.f0,&g_543},{&g_543,&g_543}},{{&g_647[0][2].f4.f0,&g_382},{&g_38.f4.f0,&g_647[0][2].f4.f0},{&g_38.f4.f0,&g_382},{&g_543,&g_543},{&g_261.f0,&g_261.f0},{&g_543,&g_647[0][2].f4.f0}},{{&g_38.f4.f0,&g_543},{&g_382,&g_647[0][2].f4.f0},{&g_261.f0,&g_261.f0},{&g_38.f4.f0,&g_261.f0},{&g_261.f0,&g_543},{&g_382,&g_261.f0}},{{&g_382,&g_543},{&g_38.f4.f0,&g_38.f4.f0},{&g_382,&g_38.f4.f0},{&g_38.f4.f0,&g_543},{&g_647[0][2].f4.f0,&g_38.f4.f0},{&g_647[0][2].f4.f0,&g_261.f0}},{{&g_38.f4.f0,&g_382},{&g_647[0][2].f4.f0,&g_382},{&g_382,&g_261.f0},{&g_543,&g_38.f4.f0},{&g_543,&g_38.f4.f0},{&g_382,&g_647[0][2].f4.f0}},{{&g_647[0][2].f4.f0,&g_647[0][2].f4.f0},{&g_647[0][2].f4.f0,&g_38.f4.f0},{&g_261.f0,&g_382},{&g_261.f0,&g_382},{&g_647[0][2].f4.f0,&g_543},{&g_543,&g_543}},{{&g_647[0][2].f4.f0,&g_382},{&g_38.f4.f0,&g_647[0][2].f4.f0},{&g_38.f4.f0,&g_382},{&g_543,&g_261.f0},{&g_261.f0,&g_261.f0},{&g_543,&g_647[0][2].f4.f0}},{{&g_38.f4.f0,&g_543},{&g_382,&g_647[0][2].f4.f0},{&g_261.f0,&g_261.f0},{&g_38.f4.f0,&g_38.f4.f0},{&g_261.f0,&g_543},{&g_382,&g_261.f0}},{{&g_382,&g_543},{&g_38.f4.f0,&g_38.f4.f0},{&g_382,&g_38.f4.f0},{&g_38.f4.f0,&g_261.f0},{&g_647[0][2].f4.f0,&g_38.f4.f0},{&g_647[0][2].f4.f0,&g_261.f0}}}; +static uint8_t g_839[1][3][6] = {{{0x46L,0x46L,0x46L,0x46L,0x46L,0x46L},{0x46L,0x46L,0x46L,0x46L,0x46L,0x46L},{0x46L,0x46L,0x46L,0x46L,0x46L,0x46L}}}; +static uint32_t g_902 = 0x179232C1L; +static const int8_t g_916[4] = {(-10L),(-10L),(-10L),(-10L)}; +static const int8_t *g_915 = &g_916[0]; +static struct S2 g_955 = {3,2,-1549,20}; +static int16_t g_1003 = 0x39B6L; +static uint32_t g_1004 = 4294967295UL; +static uint16_t g_1048 = 0x2CDAL; +static const struct S2 g_1075 = {5,9,-679,15}; +static const struct S2 *g_1074[2][3][6] = {{{&g_1075,&g_1075,(void*)0,(void*)0,(void*)0,&g_1075},{&g_1075,&g_1075,(void*)0,&g_1075,(void*)0,&g_1075},{&g_1075,&g_1075,&g_1075,&g_1075,&g_1075,&g_1075}},{{(void*)0,(void*)0,&g_1075,&g_1075,&g_1075,(void*)0},{(void*)0,(void*)0,&g_1075,&g_1075,&g_1075,(void*)0},{&g_1075,&g_1075,&g_1075,(void*)0,&g_1075,&g_1075}}}; +static uint16_t g_1137 = 0x8875L; +static int16_t g_1209 = 0x3100L; +static uint32_t g_1211 = 0x04D0F574L; +static uint32_t g_1326[8] = {8UL,8UL,4294967290UL,4294967290UL,4294967290UL,8UL,4294967289UL,4294967289UL}; +static int32_t *g_1335 = &g_123.f3; +static uint8_t ** const **g_1357 = (void*)0; +static union U3 *g_1430 = &g_388; +static union U3 **g_1429 = &g_1430; +static uint16_t g_1518 = 0x4317L; +static int32_t g_1530 = 0x10B7CE31L; +static uint32_t g_1531 = 0x82ACE214L; +static int8_t g_1540 = 0x58L; +static int16_t g_1541 = (-1L); +static int32_t g_1542 = 6L; +static int32_t g_1543 = 1L; +static uint32_t g_1544 = 0xBFEB1F21L; +static uint8_t *** const g_1602 = &g_168; +static uint8_t *** const *g_1601[6][10] = {{&g_1602,&g_1602,(void*)0,&g_1602,(void*)0,&g_1602,&g_1602,&g_1602,&g_1602,&g_1602},{(void*)0,&g_1602,&g_1602,&g_1602,(void*)0,&g_1602,&g_1602,&g_1602,&g_1602,&g_1602},{&g_1602,&g_1602,&g_1602,&g_1602,(void*)0,&g_1602,(void*)0,&g_1602,(void*)0,&g_1602},{&g_1602,&g_1602,&g_1602,(void*)0,&g_1602,&g_1602,&g_1602,&g_1602,&g_1602,&g_1602},{&g_1602,(void*)0,&g_1602,&g_1602,&g_1602,&g_1602,&g_1602,(void*)0,&g_1602,(void*)0},{&g_1602,&g_1602,&g_1602,&g_1602,&g_1602,&g_1602,&g_1602,(void*)0,&g_1602,&g_1602}}; +static uint8_t ***g_1607 = &g_168; +static uint8_t ****g_1606 = &g_1607; +static union U3 g_1612 = {0}; +static uint8_t g_1639 = 254UL; +static uint8_t ** const ***g_1719 = &g_1357; +static uint8_t *g_1730[3][3][10] = {{{&g_1639,&g_38.f5,&g_1639,&g_38.f5,&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_839[0][2][5],&g_1639,&g_839[0][2][5]},{&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_839[0][2][5],&g_1639,&g_647[0][2].f3.f7,&g_153,&g_647[0][2].f3.f7,&g_1639,&g_647[0][2].f3.f7},{&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_38.f5,&g_1639,&g_38.f5,&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_839[0][2][5]}},{{&g_1639,&g_38.f5,&g_153,&g_38.f5,&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_38.f5,&g_1639,&g_38.f5},{&g_1639,&g_647[0][2].f3.f7,&g_153,&g_839[0][2][5],&g_153,&g_647[0][2].f3.f7,&g_153,&g_647[0][2].f3.f7,&g_1639,&g_839[0][2][5]},{&g_1639,&g_839[0][2][5],&g_1639,&g_38.f5,&g_153,&g_38.f5,&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_38.f5}},{{&g_1639,&g_647[0][2].f3.f7,&g_153,&g_38.f5,&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_38.f5,&g_1639,&g_38.f5},{&g_1639,&g_839[0][2][5],&g_153,&g_38.f5,&g_153,&g_647[0][2].f3.f7,&g_1639,&g_647[0][2].f3.f7,&g_153,&g_839[0][2][5]},{&g_1639,&g_839[0][2][5],&g_1639,&g_647[0][2].f3.f7,&g_153,&g_38.f5,&g_1639,&g_647[0][2].f3.f7,&g_1639,&g_38.f5}}}; +static uint8_t ** const g_1729 = &g_1730[1][1][4]; +static uint8_t ** const *g_1728 = &g_1729; +static uint8_t ** const ** const g_1727 = &g_1728; +static uint8_t ** const ** const *g_1726[4] = {&g_1727,&g_1727,&g_1727,&g_1727}; +static union U4 g_1737[1][6][9] = {{{{0xE1638B33L},{1UL},{1UL},{0xEFD37DBAL},{0x58F7CE95L},{1UL},{4294967290UL},{0x9E3275E6L},{4294967290UL}},{{0xAE6C9E42L},{4294967291UL},{0x81417FBDL},{0x81417FBDL},{0x6CB37FA1L},{0x4BDA5DD8L},{0x81417FBDL},{0xAE6C9E42L},{0x7EE91463L}},{{0UL},{0x58F7CE95L},{0UL},{0x58AD4931L},{0x58AD4931L},{1UL},{0xE1638B33L},{0x58AD4931L},{0x58F7CE95L}},{{0x6CB37FA1L},{0x88A64734L},{0x92C7FD6FL},{0x4BDA5DD8L},{0x6CB37FA1L},{0x6CB37FA1L},{4294967291UL},{0xAE6C9E42L},{0x6CB37FA1L}},{{0xE1638B33L},{0x90C43057L},{0x9E3275E6L},{1UL},{4294967290UL},{0x90C43057L},{0x90C43057L},{0x58F7CE95L},{0x58AD4931L}},{{0xF4C3EAE7L},{0x81417FBDL},{0xF4C3EAE7L},{4294967291UL},{8UL},{4294967291UL},{0xF4C3EAE7L},{0xF4C3EAE7L},{0x6CB37FA1L}}}}; + + +/* --- FORWARD DECLARATIONS --- */ +static struct S2 func_1(void); +static int32_t func_2(int16_t p_3, uint32_t p_4, union U4 p_5, union U3 p_6, int8_t * p_7); +static union U4 func_11(struct S2 p_12, struct S1 p_13, int8_t p_14, struct S0 p_15, const int8_t * p_16); +static uint32_t func_18(struct S1 p_19, int32_t p_20); +static struct S1 func_21(int32_t p_22, const int16_t p_23, uint16_t p_24); +static int32_t func_25(int8_t * p_26); +static int8_t * func_27(const union U3 p_28, const union U3 p_29, int8_t * p_30, int8_t * p_31, int8_t p_32); +static union U3 func_33(int16_t p_34, struct S1 p_35, int8_t * p_36, int16_t p_37); +static int8_t * func_39(const int8_t * p_40, int8_t * const p_41, int8_t p_42, uint32_t p_43, union U3 p_44); +static const int8_t * func_45(int8_t * p_46, int32_t p_47, uint32_t p_48, union U4 p_49, int8_t p_50); + + +/* --- FUNCTIONS --- */ +/* ------------------------------------------ */ +/* + * reads : g_8 g_17 g_38 g_53 g_58 g_53.f3 g_60 g_62 g_76 g_84 g_10 g_117 g_145 g_153 g_168 g_170 g_123.f3 g_187 g_192 g_123.f1 g_123.f2 g_53.f2 g_261.f6 g_261.f7 g_171 g_122 g_123 g_261.f4 g_325 g_333 g_445 g_455 g_388 g_337 g_472 g_116 g_483 g_355 g_356 g_261 g_53.f1 g_349 g_409 g_530 g_533.f3.f7 g_161 g_566 g_533.f3.f6 g_331 g_533.f3.f2 g_533.f5 g_542 g_647.f4.f8 g_533.f4.f1 g_647.f0 g_287 g_647.f3.f3 g_649.f3.f8 g_649.f5 g_649.f4.f0 g_162 g_647.f4.f0 g_647.f5 g_647.f3.f1 g_839 g_382 g_902 g_543 g_649.f3.f0 g_649.f4.f1 g_647.f1 g_647.f4.f5 g_647.f3.f0 g_647.f3.f8 g_647.f2 g_533.f4.f3 g_533 g_1004 g_1048 g_647.f3.f6 g_649.f4.f5 g_647.f3.f7 g_1137 g_649.f4.f9 g_123.f0 g_1211 g_915 g_916 g_649 g_647.f4.f9 g_1003 g_647.f4.f4 g_1326 g_473 g_1335 g_1357 g_1429 g_647.f4.f1 g_1518 g_1531 g_1544 + * writes: g_9 g_53.f3 g_58 g_60 g_76 g_84 g_38.f4.f7 g_38.f4.f1 g_117 g_122 g_38.f3.f1 g_38.f1 g_153 g_168 g_123.f3 g_38.f3.f5 g_38.f4.f0 g_187 g_192 g_10 g_261.f1 g_286 g_145 g_325 g_333 g_38.f3.f7 g_337 g_261.f5 g_445 g_116 g_472 g_483 g_349 g_261.f4 g_38.f5 g_38.f4.f5 g_161 g_542 g_331 g_647.f0 g_649.f3.f1 g_649.f3.f4 g_649.f5 g_649.f4.f1 g_647.f3.f1 g_839 g_38.f0 g_647.f4.f1 g_647.f3.f5 g_647.f5 g_382 g_902 g_543 g_915 g_647.f4.f5 g_647.f3.f0 g_1004 g_759 g_1048 g_38.f4.f4 g_1074 g_649.f4.f8 g_1137 g_649.f4.f0 g_1003 g_1211 g_455 g_356 g_1209 g_647.f4.f4 g_1357 g_1518 g_1531 g_649.f3.f5 g_1430 g_1544 g_261.f7 g_1541 g_170 g_261.f0 g_162 g_1326 g_649.f1 g_1719 g_1726 + */ +static struct S2 func_1(void) +{ /* block id: 0 */ + int8_t *l_51 = &g_38.f4.f0; + int8_t *l_52 = &g_10; + int32_t l_54 = 0x41C0C234L; + const union U3 l_458 = {0}; + struct S1 l_1440 = {0xC1L,0xA4EF7133L,1085,{0x91L,0xB7E4206FL,0x52D2BAD0L,0x79A6336AL,4294967295UL,65535UL,0xA95E2E66L,255UL,28318,0xE167L},{0x61L,0xDD2AEFD9L,0x0C8174C7L,6L,0xFA3FE255L,0xBB2BL,0xA1F00002L,255UL,20524,0x4A78L},251UL}; + uint32_t l_1441 = 4294967295UL; + int32_t l_1689 = (-10L); + int32_t l_1690 = 2L; + int32_t l_1691 = 0xA216FC33L; + int32_t l_1696 = 0xF3B5A903L; + uint8_t ** const ***l_1717 = (void*)0; + union U4 *l_1736 = &g_1737[0][1][0]; + struct S2 l_1741 = {5,10,620,-30}; + if (func_2(g_8, (!((g_9 = (void*)0) == &g_10)), func_11(g_17, (func_18(func_21(func_25(func_27(func_33(g_17.f3, g_38, func_39(func_45(&g_10, (l_51 != l_52), g_17.f0, g_53, l_54), &g_10, g_17.f2, l_54, g_62), l_54), l_458, &g_331, &g_331, l_54)), g_17.f1, g_533.f3.f7), g_647[0][2].f4.f8) , l_1440), l_1441, l_1440.f4, l_52), l_458, l_51)) + { /* block id: 1124 */ + uint32_t l_1692[10][8][3] = {{{2UL,0x2A6744A7L,9UL},{4294967295UL,4294967292UL,0xE4BF79A9L},{0x92A921F8L,8UL,0x22FB3882L},{0x10B0DE98L,4294967292UL,2UL},{4294967295UL,0x2A6744A7L,4294967286UL},{8UL,0x0C2E5B72L,8UL},{4294967291UL,0x0B531676L,0UL},{2UL,0xFBD00D1CL,2UL}},{{0xFBD00D1CL,4294967289UL,0x8B968E40L},{0xFBD00D1CL,4294967295UL,0xE4BF79A9L},{2UL,0xFBD00D1CL,0x0C2E5B72L},{0x8B968E40L,2UL,8UL},{0UL,4294967286UL,0x92A921F8L},{0x2A6744A7L,9UL,0x8B968E40L},{0x0B531676L,0x8B968E40L,0x6684DA42L},{9UL,8UL,0x8B968E40L}},{{4294967292UL,0x1AC94F22L,0x22FB3882L},{0x350F2DA1L,4294967289UL,0UL},{2UL,0x6684DA42L,2UL},{0x10B0DE98L,4294967286UL,0x390EA4EDL},{4294967292UL,0UL,0xFBD00D1CL},{2UL,0UL,4294967289UL},{0x0B531676L,4294967286UL,0x390EA4EDL},{0x1AC94F22L,9UL,4294967291UL}},{{2UL,0x92A921F8L,8UL},{0x22FB3882L,4294967292UL,0x92A921F8L},{2UL,8UL,0xE4BF79A9L},{9UL,0x529FBD41L,0x2A6744A7L},{2UL,2UL,7UL},{0x6684DA42L,0x0B531676L,0xFBD00D1CL},{7UL,0xDA94BC70L,8UL},{4294967292UL,8UL,8UL}},{{1UL,2UL,4294967295UL},{0x529FBD41L,4294967286UL,4294967295UL},{0xDA94BC70L,8UL,8UL},{1UL,4294967286UL,0UL},{0x8B968E40L,0x92A921F8L,4294967286UL},{4294967295UL,2UL,0x8B968E40L},{0x22FB3882L,4294967286UL,8UL},{0x0B531676L,0x529FBD41L,1UL}},{{4294967286UL,4294967286UL,9UL},{4294967291UL,0xFBD00D1CL,2UL},{0x529FBD41L,0x22FB3882L,0x529FBD41L},{0UL,2UL,0x2A6744A7L},{4294967295UL,0x0C2E5B72L,9UL},{0x0C2E5B72L,0x10B0DE98L,8UL},{0x0C2E5B72L,4294967291UL,8UL},{4294967295UL,0x0C2E5B72L,0x22FB3882L}},{{8UL,9UL,0x529FBD41L},{0x350F2DA1L,9UL,0x0B531676L},{2UL,2UL,8UL},{2UL,8UL,1UL},{4294967295UL,0UL,8UL},{4294967286UL,0x6684DA42L,0x390EA4EDL},{4294967292UL,0x10B0DE98L,0x350F2DA1L},{4294967286UL,1UL,9UL}},{{4294967286UL,9UL,0UL},{4294967286UL,0x2A6744A7L,0x0C2E5B72L},{4294967295UL,0x2A6744A7L,0x10B0DE98L},{2UL,9UL,0UL},{0x6684DA42L,4294967295UL,0UL},{4294967286UL,0x0B531676L,0xDA94BC70L},{0x390EA4EDL,4294967286UL,0xE4BF79A9L},{4294967295UL,0xDA94BC70L,8UL}},{{4294967295UL,0x0C2E5B72L,2UL},{4294967295UL,4294967286UL,8UL},{0x390EA4EDL,2UL,0x0C2E5B72L},{8UL,0xE4BF79A9L,4294967292UL},{4294967286UL,0UL,0xDA94BC70L},{7UL,4294967286UL,0x92A921F8L},{0x1AC94F22L,9UL,0x92A921F8L},{0xE4BF79A9L,0xDA94BC70L,0xDA94BC70L}},{{7UL,0xFBD00D1CL,4294967289UL},{8UL,0xE4BF79A9L,2UL},{0x92A921F8L,4294967295UL,8UL},{0x0B531676L,9UL,0x529FBD41L},{2UL,0x1AC94F22L,0UL},{0xFBD00D1CL,9UL,4294967295UL},{0UL,4294967295UL,9UL},{0x1AC94F22L,0x390EA4EDL,0x1AC94F22L}}}; + int i, j, k; + for (g_162 = 0; (g_162 == 1); g_162++) + { /* block id: 1127 */ + int32_t *l_1687 = &l_1440.f3.f1; + int32_t *l_1688[2]; + int i; + for (i = 0; i < 2; i++) + l_1688[i] = &l_1440.f4.f1; + l_1692[5][4][0]++; + } + (*g_1335) = 0x95FF514FL; + } + else + { /* block id: 1131 */ + uint32_t *l_1697 = &g_1326[0]; + uint32_t *l_1698 = (void*)0; + uint32_t *l_1699 = &g_649.f1; + int32_t l_1707 = 0x7787FDE2L; + int32_t l_1708 = 0xCE41E461L; + int32_t l_1709[10] = {(-3L),0xF4835AB5L,(-10L),1L,0xF4835AB5L,0xF4835AB5L,(-10L),0L,(-3L),(-10L)}; + uint32_t l_1710 = 0x55C6EA2EL; + union U3 *l_1716 = &g_1612; + int i; + if ((safe_unary_minus_func_uint32_t_u(((*l_1699) ^= ((*l_1697) = l_1696))))) + { /* block id: 1134 */ + int32_t *l_1700 = &g_647[0][2].f4.f1; + int32_t *l_1701 = &g_261.f1; + int32_t *l_1702 = &g_38.f4.f1; + int32_t *l_1703 = &g_38.f3.f1; + int32_t *l_1704 = &l_1691; + int32_t *l_1705 = &g_38.f4.f1; + int32_t *l_1706[7][10][3] = {{{&g_261.f1,&g_261.f1,&g_349},{(void*)0,&g_38.f4.f1,&g_349},{&l_54,(void*)0,&g_38.f4.f1},{(void*)0,&g_38.f4.f1,&g_349},{(void*)0,&g_349,&g_261.f1},{&l_54,&g_261.f1,&g_349},{(void*)0,&g_261.f1,&g_38.f4.f1},{(void*)0,&g_349,(void*)0},{(void*)0,&l_54,(void*)0},{&g_261.f1,&l_54,&l_54}},{{&g_38.f4.f1,&g_261.f1,(void*)0},{&l_54,(void*)0,&g_349},{&g_261.f1,&g_261.f1,(void*)0},{&g_38.f4.f1,&g_261.f1,&g_261.f1},{(void*)0,(void*)0,&g_38.f4.f1},{&g_38.f4.f1,&g_261.f1,&g_38.f4.f1},{&g_349,&g_261.f1,&g_261.f1},{&g_261.f1,&g_261.f1,&g_38.f4.f1},{&g_261.f1,(void*)0,(void*)0},{&g_349,(void*)0,&g_38.f4.f1}},{{&l_54,(void*)0,&g_261.f1},{&l_54,&g_38.f4.f1,&l_54},{&g_261.f1,&g_349,&g_261.f1},{(void*)0,&g_261.f1,&g_349},{&g_261.f1,(void*)0,&l_54},{&g_261.f1,&l_54,&g_38.f4.f1},{(void*)0,(void*)0,&l_54},{&g_261.f1,(void*)0,(void*)0},{&g_261.f1,&l_54,&g_261.f1},{&g_261.f1,(void*)0,&g_261.f1}},{{(void*)0,(void*)0,(void*)0},{(void*)0,(void*)0,&g_261.f1},{(void*)0,&g_261.f1,&g_261.f1},{&g_38.f4.f1,&g_38.f4.f1,&g_261.f1},{&g_349,&l_54,(void*)0},{&g_261.f1,&g_261.f1,&g_349},{(void*)0,&g_38.f4.f1,&g_349},{&l_54,(void*)0,&g_38.f4.f1},{(void*)0,&g_38.f4.f1,&g_349},{(void*)0,&g_349,&g_261.f1}},{{&l_54,&g_261.f1,&g_349},{(void*)0,&g_261.f1,&g_38.f4.f1},{(void*)0,&g_349,(void*)0},{(void*)0,&l_54,(void*)0},{&g_261.f1,&l_54,&l_54},{&g_38.f4.f1,&g_261.f1,(void*)0},{&l_54,(void*)0,&g_349},{&g_261.f1,&g_261.f1,(void*)0},{&g_38.f4.f1,&g_261.f1,&g_261.f1},{(void*)0,(void*)0,&g_38.f4.f1}},{{&g_38.f4.f1,&g_261.f1,&g_38.f4.f1},{&g_349,&g_261.f1,&g_261.f1},{&g_261.f1,&g_261.f1,&g_38.f4.f1},{&g_261.f1,(void*)0,(void*)0},{&g_349,(void*)0,&g_38.f4.f1},{&l_54,(void*)0,&g_261.f1},{&l_54,&g_38.f4.f1,&l_54},{&g_261.f1,&g_349,&g_261.f1},{(void*)0,&g_261.f1,&g_349},{&g_261.f1,(void*)0,&l_54}},{{&g_261.f1,&l_54,&g_38.f4.f1},{(void*)0,(void*)0,&l_54},{&g_261.f1,(void*)0,(void*)0},{&g_261.f1,&l_54,&g_261.f1},{&g_261.f1,(void*)0,&g_261.f1},{(void*)0,(void*)0,(void*)0},{&g_349,(void*)0,&g_261.f1},{(void*)0,&g_261.f1,&l_54},{&g_38.f4.f1,&g_38.f4.f1,&g_261.f1},{&g_349,&g_38.f4.f1,(void*)0}}}; + struct S2 l_1713 = {4,4,484,-3}; + int i, j, k; + l_1710--; + return l_1713; + } + else + { /* block id: 1137 */ + for (g_261.f1 = 20; (g_261.f1 != 23); ++g_261.f1) + { /* block id: 1140 */ + uint8_t ** const ****l_1718[5] = {&l_1717,&l_1717,&l_1717,&l_1717,&l_1717}; + uint8_t *l_1725 = &g_647[0][2].f3.f7; + uint8_t ** const l_1724 = &l_1725; + uint8_t ** const *l_1723 = &l_1724; + uint8_t ** const ** const l_1722 = &l_1723; + uint8_t ** const ** const *l_1721 = &l_1722; + uint8_t ** const ** const **l_1720[10][4] = {{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,(void*)0},{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,&l_1721},{&l_1721,&l_1721,&l_1721,&l_1721}}; + int i, j; + (*g_1429) = l_1716; + (*g_1335) ^= (((g_1719 = l_1717) == (g_1726[1] = &g_1357)) & (safe_add_func_uint8_t_u_u((g_145 || (g_533.f5 < 8UL)), 0xA5L))); + } + } + } + for (l_1440.f4.f4 = 0; (l_1440.f4.f4 == 9); l_1440.f4.f4 = safe_add_func_uint16_t_u_u(l_1440.f4.f4, 9)) + { /* block id: 1150 */ + union U4 **l_1735[5] = {&g_122,&g_122,&g_122,&g_122,&g_122}; + int32_t l_1740[8] = {0xFC73E1D4L,0xFC73E1D4L,0xFC73E1D4L,0xFC73E1D4L,0xFC73E1D4L,0xFC73E1D4L,0xFC73E1D4L,0xFC73E1D4L}; + int i; + l_1736 = &g_53; + (*g_1335) &= (safe_rshift_func_int8_t_s_u(l_1441, l_1740[3])); + } + return l_1741; +} + + +/* ------------------------------------------ */ +/* + * reads : g_409 g_649.f4.f5 g_647.f0 g_17.f1 g_261.f5 g_915 g_331 g_916 g_171 g_38.f3.f7 g_84 g_483 g_1335 g_38.f4.f0 g_123.f3 g_1518 g_1531 g_1429 g_153 g_1544 g_261.f0 g_839 g_649.f3.f1 g_261.f8 g_1137 + * writes: g_331 g_84 g_38.f4.f4 g_145 g_483 g_286 g_123.f3 g_38.f3.f5 g_1518 g_1531 g_649.f3.f5 g_1430 g_153 g_1544 g_261.f7 g_117 g_1541 g_170 g_261.f0 g_839 g_649.f3.f1 g_1137 + */ +static int32_t func_2(int16_t p_3, uint32_t p_4, union U4 p_5, union U3 p_6, int8_t * p_7) +{ /* block id: 961 */ + int32_t l_1461 = 0xAFB1BEA9L; + int32_t l_1466 = 0L; + int32_t l_1467 = 0L; + struct S2 l_1477 = {4,13,-1491,31}; + int32_t l_1489[7][2] = {{0x9EFD9BBBL,0xCA0AE120L},{0xCA0AE120L,0xA234F30FL},{1L,0xCA0AE120L},{1L,0xA234F30FL},{0x9EFD9BBBL,0x9EFD9BBBL},{1L,0x9EFD9BBBL},{0x9EFD9BBBL,0xCA0AE120L}}; + int32_t *l_1514 = &g_38.f3.f1; + int32_t l_1517[1][6] = {{0xCC1674BFL,1L,0xCC1674BFL,0x5EA4E9F3L,0xCC1674BFL,0x5EA4E9F3L}}; + int32_t l_1538 = 0L; + int32_t l_1539[5][1]; + int8_t **l_1551 = &g_9; + union U3 l_1593 = {0}; + int8_t l_1610 = 0x6FL; + struct S0 l_1625 = {1L,0x0BB1CD48L,1L,2L,0UL,65535UL,0xB93E2ECEL,0x47L,12556,-5L}; + uint32_t l_1636 = 0x578E5FF5L; + uint8_t ***l_1653 = &g_170[7][2][3]; + int i, j; + for (i = 0; i < 5; i++) + { + for (j = 0; j < 1; j++) + l_1539[i][j] = 1L; + } + for (p_4 = 0; (p_4 <= 0); p_4 += 1) + { /* block id: 964 */ + const uint8_t l_1460 = 0xB8L; + int32_t l_1463[10][1][1] = {{{(-1L)}},{{9L}},{{(-1L)}},{{9L}},{{(-1L)}},{{9L}},{{(-1L)}},{{9L}},{{(-1L)}},{{9L}}}; + int32_t l_1565 = 1L; + int32_t *l_1586[3]; + int32_t l_1587 = (-8L); + uint32_t l_1588[7] = {4294967291UL,4294967291UL,4294967291UL,4294967291UL,4294967291UL,4294967291UL,4294967291UL}; + struct S2 * const l_1600 = &g_955; + struct S1 *l_1632 = &g_649; + int16_t l_1633 = 7L; + int32_t l_1634 = 1L; + int i, j, k; + for (i = 0; i < 3; i++) + l_1586[i] = (void*)0; + for (g_331 = 0; (g_331 <= 2); g_331 += 1) + { /* block id: 967 */ + uint8_t l_1458 = 0x87L; + int32_t l_1468[3][3][7] = {{{(-6L),5L,(-2L),(-1L),0x8E0A04E9L,0xC75362A1L,0xBD5F5C25L},{0xC75362A1L,0xAD8E0FC0L,(-1L),1L,0x8E0A04E9L,0xBD5F5C25L,0x8E0A04E9L},{(-6L),0L,0xBD5F5C25L,0L,0L,0L,0xBD82D250L}},{{0x83B8F5DAL,0x8E0A04E9L,0L,(-1L),(-6L),0xAD8E0FC0L,0L},{0xBD82D250L,(-1L),0L,5L,(-1L),5L,0x83B8F5DAL},{(-1L),(-1L),(-1L),(-1L),(-1L),0xC75362A1L,0xAD8E0FC0L}},{{0L,(-1L),(-2L),0L,0x83B8F5DAL,0x4F47A865L,(-6L)},{0L,(-6L),0x4F47A865L,(-1L),0x4F47A865L,(-6L),0xBD82D250L},{0x4F47A865L,0xBD82D250L,(-1L),(-1L),0L,(-2L),0xAD8E0FC0L}}}; + int32_t l_1528 = 0xB122EC6DL; + int32_t **l_1536 = &l_1514; + int i, j, k; + for (g_84 = 0; (g_84 <= 0); g_84 += 1) + { /* block id: 970 */ + uint32_t *l_1459 = &g_38.f4.f4; + int32_t l_1464 = 0x59056E1AL; + int32_t l_1465 = (-3L); + int32_t l_1469[10] = {0x104B07B6L,0x104B07B6L,0L,3L,(-1L),(-1L),(-1L),(-5L),0L,3L}; + uint8_t l_1511 = 0x50L; + int i, j; + if ((((((safe_mod_func_uint16_t_u_u(g_409[p_4][p_4], (safe_mod_func_uint32_t_u_u((safe_lshift_func_uint8_t_u_s((((((*l_1459) = ((0xCAC1CD73L > ((safe_mul_func_int16_t_s_s(g_649.f4.f5, (p_5.f1 >= l_1458))) & 0x25L)) >= p_4)) ^ l_1458) , ((-4L) != p_3)) || 0x48AC096FL), l_1460)), l_1461)))) , g_647[0][2].f0) , p_5.f1) < p_5.f0) || l_1458)) + { /* block id: 972 */ + int32_t *l_1462[3][6] = {{&g_38.f4.f1,(void*)0,(void*)0,&g_60,&g_38.f4.f1,&g_38.f4.f1},{(void*)0,&g_60,(void*)0,&g_38.f4.f1,(void*)0,&g_38.f4.f1},{&g_60,&g_60,&g_60,(void*)0,(void*)0,(void*)0}}; + uint16_t l_1470 = 0x5209L; + int16_t *l_1478 = &g_145; + int i, j; + l_1470--; + if ((safe_add_func_int8_t_s_s((safe_sub_func_int8_t_s_s(0x17L, ((l_1477 , (((g_483[g_84][g_331] |= (((*l_1459) = (((*l_1478) = g_17.f1) >= (safe_div_func_uint8_t_u_u((0x75L <= ((safe_sub_func_int16_t_s_s((safe_mod_func_uint32_t_u_u((safe_mul_func_uint16_t_u_u(g_261.f5, (safe_rshift_func_uint16_t_u_u(l_1489[1][1], 4)))), (safe_rshift_func_int8_t_s_u((*g_915), (p_6 , (p_5 , 0x16L)))))), p_5.f3)) | p_4)), (*g_171))))) & 0x7D335349L)) < 0x17L) , 0x750BBD16L)) , (-1L)))), 0x7CL))) + { /* block id: 977 */ + g_286[7] = l_1462[1][4]; + if (l_1466) + break; + } + else + { /* block id: 980 */ + (*g_1335) = l_1489[1][1]; + } + } + else + { /* block id: 983 */ + int32_t l_1494 = 0x74364BECL; + (*g_1335) = (safe_mod_func_int8_t_s_s(((*p_7) , l_1494), (safe_sub_func_uint8_t_u_u(l_1468[2][0][3], ((safe_add_func_uint8_t_u_u((safe_mod_func_uint16_t_u_u(0x91AAL, 0x74C9L)), 0x99L)) && ((void*)0 != &l_1463[8][0][0])))))); + } + for (g_38.f3.f5 = 0; (g_38.f3.f5 <= 0); g_38.f3.f5 += 1) + { /* block id: 988 */ + int32_t *l_1516 = &l_1468[2][0][3]; + int32_t l_1527[6]; + int8_t l_1529[1]; + int i; + for (i = 0; i < 6; i++) + l_1527[i] = 0xE537A27DL; + for (i = 0; i < 1; i++) + l_1529[i] = 0x07L; + if ((*g_1335)) + { /* block id: 989 */ + int32_t *l_1503 = &l_1464; + int32_t *l_1504 = &l_1463[8][0][0]; + int32_t *l_1505 = &l_1463[8][0][0]; + int32_t *l_1506 = &l_1464; + int32_t *l_1507 = &g_38.f4.f1; + int32_t *l_1508 = (void*)0; + int32_t *l_1509 = &g_349; + int32_t *l_1510[1][9][2] = {{{(void*)0,(void*)0},{(void*)0,(void*)0},{(void*)0,(void*)0},{(void*)0,(void*)0},{(void*)0,(void*)0},{(void*)0,(void*)0},{(void*)0,(void*)0},{(void*)0,(void*)0},{(void*)0,(void*)0}}}; + int32_t **l_1515[8] = {&l_1505,&l_1503,&l_1505,&l_1503,&l_1505,&l_1503,&l_1505,&l_1503}; + int i, j, k; + l_1511--; + l_1516 = (l_1514 = (void*)0); + if (l_1469[4]) + break; + ++g_1518; + } + else + { /* block id: 995 */ + int32_t *l_1521 = (void*)0; + int32_t *l_1522 = &g_38.f4.f1; + int32_t *l_1523 = &l_1468[0][2][0]; + int32_t *l_1524 = &g_649.f4.f1; + int32_t *l_1525 = &l_1467; + int32_t *l_1526[6]; + int i; + for (i = 0; i < 6; i++) + l_1526[i] = &g_123.f3; + --g_1531; + (*l_1523) = (p_5.f3 = (safe_rshift_func_uint8_t_u_u((l_1465 && l_1468[2][0][3]), 2))); + } + for (g_649.f3.f5 = 0; (g_649.f3.f5 <= 2); g_649.f3.f5 += 1) + { /* block id: 1002 */ + if ((*g_1335)) + break; + p_5.f3 = 0x2C72DB93L; + l_1536 = (p_6 , &l_1514); + (*l_1536) = &g_60; + } + (*g_1429) = &p_6; + } + for (g_153 = 0; (g_153 <= 0); g_153 += 1) + { /* block id: 1012 */ + int32_t *l_1537[4] = {&l_1469[5],&l_1469[5],&l_1469[5],&l_1469[5]}; + int i; + g_1544++; + for (g_261.f7 = 0; g_261.f7 < 10; g_261.f7 += 1) + { + for (g_117 = 0; g_117 < 6; g_117 += 1) + { + for (g_1541 = 0; g_1541 < 4; g_1541 += 1) + { + g_170[g_261.f7][g_117][g_1541] = (void*)0; + } + } + } + for (g_261.f0 = 0; (g_261.f0 <= 0); g_261.f0 += 1) + { /* block id: 1017 */ + struct S0 *l_1555 = &g_649.f4; + struct S0 ** const l_1554 = &l_1555; + struct S0 ** const *l_1553 = &l_1554; + struct S0 ** const **l_1552 = &l_1553; + int i, j, k; + (*g_1335) ^= (l_1517[p_4][(g_153 + 3)] < (((((p_5.f1 > (*p_7)) ^ (++g_839[g_84][(g_84 + 2)][(g_153 + 1)])) != p_5.f3) > ((p_4 , l_1551) == (p_4 , &p_7))) ^ (((*l_1552) = &g_355) != &g_355))); + } + if (l_1511) + { /* block id: 1022 */ + (*g_1335) = l_1463[8][0][0]; + } + else + { /* block id: 1024 */ + uint16_t l_1556 = 65535UL; + (*g_1335) ^= p_5.f2; + l_1556++; + } + } + } + if ((*g_1335)) + continue; + for (g_649.f3.f1 = 0; (g_649.f3.f1 <= 2); g_649.f3.f1 += 1) + { /* block id: 1033 */ + int8_t l_1559 = 0L; + int32_t *l_1564[10]; + int i; + for (i = 0; i < 10; i++) + l_1564[i] = &g_53.f3; + p_5.f3 = (l_1468[0][2][0] ^= ((((((*g_1335) = p_5.f1) < l_1559) & 0x9EL) <= ((p_5.f3 == g_916[0]) & (*p_7))) > (safe_div_func_uint32_t_u_u((l_1559 , ((safe_sub_func_int32_t_s_s((p_5.f0 >= 0x8144L), 0xEE724EF8L)) | p_5.f2)), g_261.f8)))); + for (g_1137 = 0; (g_1137 <= 0); g_1137 += 1) + { /* block id: 1039 */ + int8_t l_1566[5]; + int32_t l_1570 = (-8L); + uint32_t l_1572 = 0xC321B895L; + int16_t l_1575 = 3L; + int32_t l_1577 = 0xFAA972D2L; + int32_t l_1580[6][9][1] = {{{(-1L)},{(-1L)},{0L},{0L},{0x4AC32553L},{3L},{(-8L)},{0L},{0L}},{{0L},{0x86A44D05L},{0x49675262L},{(-1L)},{0L},{0x86A44D05L},{(-1L)},{0L},{0x4AC32553L}},{{8L},{8L},{(-1L)},{0x86A44D05L},{3L},{(-8L)},{1L},{(-1L)},{0L}},{{0xF523460DL},{0x4AC32553L},{(-1L)},{0L},{3L},{8L},{0L},{0L},{0xF523460DL}},{{0xF523460DL},{(-1L)},{0x86A44D05L},{0L},{(-1L)},{8L},{0x49675262L},{8L},{(-1L)}},{{(-8L)},{(-1L)},{0L},{1L},{1L},{0x49675262L},{0x49675262L},{0xF523460DL},{(-1L)}}}; + uint32_t l_1583 = 0x72B7531BL; + int i, j, k; + for (i = 0; i < 5; i++) + l_1566[i] = (-6L); + if (l_1565) + { /* block id: 1040 */ + uint32_t l_1567 = 0x70C56CA8L; + int32_t l_1571 = 0x9C298983L; + --l_1567; + l_1572++; + } + else + { /* block id: 1043 */ + int32_t l_1576 = 0x128FAAB6L; + int32_t l_1578 = 0L; + int32_t l_1579 = 0x4DD76C26L; + int32_t l_1581 = 1L; + int32_t l_1582 = 0xC5B4927FL; + if (p_5.f3) + break; + if (l_1566[2]) + break; + if (l_1575) + break; + ++l_1583; + } + } + } + } + if ((*g_1335)) + break; + l_1588[3]++; + for (g_1544 = 0; (g_1544 <= 2); g_1544 += 1) + { /* block id: 1056 */ + uint8_t **l_1605 = (void*)0; + uint8_t *** const l_1604 = &l_1605; + uint8_t *** const *l_1603[2][5]; + uint8_t ****l_1608 = &g_1607; + int32_t l_1609 = (-10L); + int32_t l_1615 = 0xA243D01EL; + int32_t l_1618 = 1L; + struct S2 *l_1630[3][9] = {{&g_955,&g_955,&g_955,(void*)0,&l_1477,&l_1477,&g_955,(void*)0,&g_955},{&g_17,&g_955,&g_17,&l_1477,&l_1477,&l_1477,&g_955,&g_955,&g_955},{&l_1477,&l_1477,&l_1477,&g_955,(void*)0,(void*)0,&l_1477,&g_955,&l_1477}}; + struct S2 **l_1629 = &l_1630[1][2]; + union U3 l_1642 = {0}; + int32_t l_1645 = 0xA6054A11L; + int32_t l_1646 = 0xBDF295F5L; + int16_t l_1665 = (-1L); + int i, j; + for (i = 0; i < 2; i++) + { + for (j = 0; j < 5; j++) + l_1603[i][j] = &l_1604; + } + } + } + return p_5.f2; +} + + +/* ------------------------------------------ */ +/* + * reads : g_1335 g_123.f3 g_647.f4.f1 + * writes: g_647.f4.f1 g_123.f3 + */ +static union U4 func_11(struct S2 p_12, struct S1 p_13, int8_t p_14, struct S0 p_15, const int8_t * p_16) +{ /* block id: 951 */ + int32_t *l_1442 = (void*)0; + int32_t *l_1443 = &g_647[0][2].f4.f1; + int32_t **l_1444 = (void*)0; + int32_t **l_1445 = &l_1442; + union U4 l_1449 = {4294967295UL}; + (*l_1443) &= (*g_1335); + (*l_1445) = l_1443; + for (p_13.f3.f0 = 16; (p_13.f3.f0 != (-10)); p_13.f3.f0--) + { /* block id: 956 */ + struct S1 *l_1448 = (void*)0; + (*g_1335) = ((l_1448 = &p_13) == (void*)0); + } + return l_1449; +} + + +/* ------------------------------------------ */ +/* + * reads : g_60 g_472 g_116 g_445 g_483 g_331 g_355 g_356 g_261 g_192 g_17 g_53.f1 g_171 g_38.f3.f7 g_349 g_409 g_38.f4.f9 g_38.f3.f4 g_530 g_533.f3.f6 g_38.f4.f0 g_533.f4.f1 g_647.f0 g_287 g_647.f3.f3 g_649.f3.f8 g_38.f3.f1 g_533.f3.f2 g_649.f5 g_84 g_122 g_53 g_123 g_161 g_123.f3 g_10 g_566 g_38.f4.f1 g_38.f3.f3 g_533.f5 g_38.f3.f9 g_542 g_38.f3.f8 g_38.f4.f7 g_58 g_117 g_38.f3.f6 g_53.f3 g_145 g_153 g_168 g_170 g_649.f4.f0 g_187 g_38.f3 g_123.f1 g_38.f4.f2 g_123.f2 g_38.f1 g_38.f5 g_38.f4.f8 g_53.f2 g_38 g_62 g_325 g_333 g_455 g_388 g_76 g_162 g_647.f4.f0 g_647.f5 g_647.f3.f1 g_839 g_382 g_902 g_543 g_649.f3.f0 g_649.f4.f1 g_647.f1 g_647.f4.f5 g_647.f3.f0 g_647.f3.f8 g_647.f2 g_533.f4.f3 g_533 g_1004 g_1048 g_647.f3.f6 g_649.f4.f5 g_647.f3.f7 g_1137 g_337 g_649.f4.f9 g_647.f4.f8 g_123.f0 g_1211 g_915 g_916 g_649 g_647.f4.f9 g_1003 g_647.f4.f4 g_1326 g_473 g_1335 g_1357 g_1429 + * writes: g_60 g_337 g_38.f4.f0 g_153 g_472 g_116 g_192 g_483 g_331 g_349 g_261.f1 g_261.f4 g_38.f5 g_261.f5 g_647.f0 g_649.f3.f1 g_649.f3.f4 g_333 g_649.f5 g_84 g_38.f4.f5 g_161 g_123.f3 g_10 g_542 g_38.f4.f1 g_286 g_145 g_649.f4.f1 g_38.f4.f7 g_117 g_122 g_38.f3.f1 g_38.f1 g_53.f3 g_168 g_38.f3.f5 g_187 g_325 g_38.f3.f7 g_445 g_76 g_647.f3.f1 g_839 g_38.f0 g_647.f4.f1 g_647.f3.f5 g_647.f5 g_382 g_902 g_543 g_915 g_647.f4.f5 g_647.f3.f0 g_1004 g_759 g_1048 g_38.f4.f4 g_1074 g_649.f4.f8 g_1137 g_649.f4.f0 g_1003 g_1211 g_455 g_356 g_1209 g_647.f4.f4 g_1357 + */ +static uint32_t func_18(struct S1 p_19, int32_t p_20) +{ /* block id: 458 */ + uint32_t l_658[1][2]; + int8_t *l_682 = &g_647[0][2].f0; + int32_t l_692 = (-1L); + int32_t l_693 = 2L; + uint8_t l_694 = 9UL; + struct S0 l_716 = {3L,0x5D477098L,0L,-9L,0xD47F27D6L,1UL,4294967286UL,4UL,22858,0xE484L}; + struct S2 l_739 = {4,4,-2171,26}; + const union U3 l_757 = {0}; + struct S1 l_758 = {0x74L,4294967289UL,7337,{0x53L,0x6B9AB7C8L,1L,0x60D2B8F5L,4294967295UL,0x8A6EL,0xBE5D2111L,0x33L,18365,0x4BA7L},{0xB8L,0xEA78045BL,0xE43A86F5L,-7L,4294967290UL,0x1651L,1UL,9UL,14106,1L},0x5EL}; + uint8_t *l_795[5] = {&g_647[0][2].f5,&g_647[0][2].f5,&g_647[0][2].f5,&g_647[0][2].f5,&g_647[0][2].f5}; + uint32_t l_876 = 0xD3F3E3F7L; + struct S0 ** const *l_928 = &g_355; + union U3 *l_930 = &g_388; + union U3 **l_929 = &l_930; + int32_t l_945 = 0xDCD46FD5L; + int32_t l_997 = 2L; + int32_t l_998 = 7L; + int32_t l_999 = 0L; + int32_t l_1000 = 4L; + int32_t l_1001 = 1L; + struct S0 ***l_1033 = (void*)0; + uint32_t l_1242[6] = {1UL,1UL,1UL,1UL,1UL,1UL}; + int32_t l_1304 = 0x11423609L; + struct S1 *l_1438 = &g_647[1][2]; + int i, j; + for (i = 0; i < 1; i++) + { + for (j = 0; j < 2; j++) + l_658[i][j] = 0x5750E93FL; + } + for (p_20 = 0; (p_20 != (-19)); p_20 = safe_sub_func_int32_t_s_s(p_20, 4)) + { /* block id: 461 */ + uint32_t l_656 = 0xCDCD6142L; + uint16_t *l_657 = &g_261.f5; + const int8_t *l_665 = &g_116; + int8_t *l_673[1][2]; + int32_t l_678 = 0x196B3C6CL; + int16_t l_681 = 0xE642L; + int32_t l_683 = (-5L); + int32_t l_707 = 7L; + const union U3 l_760 = {0}; + const union U3 l_767 = {0}; + int32_t **l_798 = (void*)0; + int32_t *l_800[7][5] = {{&l_758.f4.f1,&g_38.f4.f1,&g_647[0][2].f3.f1,(void*)0,(void*)0},{&g_647[0][2].f3.f1,(void*)0,&l_716.f1,&l_692,(void*)0},{&l_692,&l_758.f4.f1,&l_692,&g_38.f4.f1,&g_38.f3.f1},{&g_38.f3.f1,&l_716.f1,&l_716.f1,&l_692,&g_647[0][2].f4.f1},{&g_38.f3.f1,(void*)0,&g_647[0][2].f3.f1,&g_647[0][2].f4.f1,(void*)0},{&l_692,&g_38.f4.f1,&g_38.f3.f1,&l_692,&l_692},{&g_647[0][2].f3.f1,&g_38.f4.f1,&l_692,&g_38.f4.f1,&l_716.f1}}; + int32_t **l_799 = &l_800[2][0]; + int32_t **l_801 = (void*)0; + int32_t *l_803 = &g_123.f3; + int32_t **l_802[4][1][7] = {{{&l_803,(void*)0,(void*)0,&l_803,&l_803,&l_803,&l_803}},{{(void*)0,&l_803,(void*)0,&l_803,&l_803,&l_803,&l_803}},{{&l_803,(void*)0,(void*)0,&l_803,(void*)0,&l_803,&l_803}},{{&l_803,(void*)0,(void*)0,(void*)0,(void*)0,&l_803,(void*)0}}}; + int32_t *l_804 = &l_758.f4.f1; + int16_t *l_805 = &g_84; + int16_t *l_806 = &g_145; + int16_t *l_807[3][9][2]; + int i, j, k; + for (i = 0; i < 1; i++) + { + for (j = 0; j < 2; j++) + l_673[i][j] = &g_38.f4.f0; + } + for (i = 0; i < 3; i++) + { + for (j = 0; j < 9; j++) + { + for (k = 0; k < 2; k++) + l_807[i][j][k] = &l_681; + } + } + if (((((!(+(safe_mul_func_int16_t_s_s((p_19.f3.f7 != (l_656 >= (func_25(&g_331) , ((*l_657) &= p_19.f4.f6)))), l_658[0][1])))) ^ l_656) | (safe_lshift_func_uint8_t_u_u((safe_mul_func_uint16_t_u_u(0UL, g_533.f3.f6)), 2))) ^ p_19.f4.f7)) + { /* block id: 463 */ + return p_19.f4.f1; + } + else + { /* block id: 465 */ + const uint32_t l_671 = 4294967295UL; + int32_t l_688 = (-1L); + uint16_t *l_701 = &g_192[2]; + struct S1 *l_710[8]; + struct S0 l_756 = {0x4FL,-9L,0xB27B101BL,-1L,0x3C137442L,65530UL,4294967289UL,0x56L,45415,1L}; + const union U3 l_768[4] = {{0},{0},{0},{0}}; + int8_t *l_773 = &g_649.f4.f0; + uint16_t l_775 = 0x8EBFL; + int16_t *l_783 = (void*)0; + int16_t *l_784 = &g_84; + uint8_t *l_794 = &g_647[0][2].f5; + uint8_t **l_793[3]; + int16_t l_796 = (-6L); + int32_t *l_797 = &l_716.f1; + int i; + for (i = 0; i < 8; i++) + l_710[i] = &g_647[1][1]; + for (i = 0; i < 3; i++) + l_793[i] = &l_794; + for (p_19.f3.f1 = 23; (p_19.f3.f1 < 15); p_19.f3.f1--) + { /* block id: 468 */ + int8_t * const l_666 = (void*)0; + int16_t l_672 = (-5L); + int8_t **l_674 = &l_673[0][1]; + int32_t *l_675 = (void*)0; + int32_t *l_676 = &g_60; + int32_t *l_677[8]; + uint32_t *l_704 = &g_649.f3.f4; + int8_t l_742 = 0xADL; + int32_t *l_745 = &g_649.f4.f1; + const union U3 l_755 = {0}; + int i; + for (i = 0; i < 8; i++) + l_677[i] = &g_123.f3; + l_678 = (p_19.f4.f6 & ((((*l_676) = (0x3BA2L && (((func_25(&g_331) && ((func_25(((*l_674) = l_673[0][1])) , (void*)0) == &g_473)) < g_533.f4.f1) ^ p_19.f4.f7))) ^ 0xE368407DL) == 0xF457L)); + if (((safe_mod_func_uint32_t_u_u(0x1C594E6EL, l_681)) || func_25(l_682))) + { /* block id: 472 */ + return g_38.f4.f9; + } + else + { /* block id: 474 */ + uint32_t l_684 = 4294967295UL; + int32_t l_690 = 7L; + int32_t l_691[4][5] = {{0xF74D99E4L,(-8L),0xFA86F321L,0xFA86F321L,0x31F9E346L},{0xC9638F01L,0L,(-8L),0xFA86F321L,(-10L)},{0xFA86F321L,0xFA86F321L,(-10L),0xC9638F01L,0x31F9E346L},{0xFA86F321L,0xC9638F01L,0xC9638F01L,0xF74D99E4L,(-8L)}}; + int i, j; + ++l_684; + for (g_649.f3.f1 = 1; (g_649.f3.f1 <= 9); g_649.f3.f1 += 1) + { /* block id: 478 */ + uint8_t l_687 = 255UL; + int32_t l_689[9][4][1] = {{{0xD72A769DL},{0xD72A769DL},{0xD72A769DL},{1L}},{{0x3C8189ADL},{0xBCE55E60L},{1L},{(-10L)}},{{1L},{3L},{0xBCE55E60L},{(-10L)}},{{0L},{(-10L)},{(-2L)},{0xD72A769DL}},{{0x3C8189ADL},{0xBCE55E60L},{1L},{3L}},{{0L},{0x3C8189ADL},{1L},{1L}},{{1L},{0x3C8189ADL},{(-10L)},{0xD72A769DL}},{{0x3C8189ADL},{3L},{0xCD68F5ECL},{1L}},{{0xD72A769DL},{(-2L)},{(-2L)},{(-2L)}}}; + int i, j, k; + (*l_676) |= l_684; + l_687 ^= l_671; + l_694--; + } + for (p_19.f1 = 0; (p_19.f1 < 52); p_19.f1++) + { /* block id: 485 */ + return p_20; + } + } + if ((safe_rshift_func_uint16_t_u_s((((l_701 == &g_455) >= (~(func_25((*l_674)) ^ (0x7DAE9B49L >= (safe_rshift_func_int8_t_s_u((3L | (((l_693 = (p_19.f1 && ((*l_704) = ((l_678 &= 0x05L) , l_656)))) , g_287) | l_681)), p_19.f3.f3)))))) || 0x2696L), g_647[0][2].f3.f3))) + { /* block id: 492 */ + int32_t *l_714[7]; + int i; + for (i = 0; i < 7; i++) + l_714[i] = &g_38.f3.f1; + (*l_676) = (safe_sub_func_uint32_t_u_u(p_19.f4.f9, l_707)); + for (p_19.f0 = (-4); (p_19.f0 == (-25)); p_19.f0--) + { /* block id: 496 */ + g_60 ^= p_19.f3.f4; + } + if ((l_710[7] == (void*)0)) + { /* block id: 499 */ + uint32_t l_711 = 0x38AD3B8CL; + int32_t *l_715 = &l_693; + uint32_t *l_721 = &g_333; + uint8_t *l_743 = &g_649.f5; + int16_t *l_744 = &g_84; + l_711++; + p_19.f4.f1 = p_19.f3.f2; + l_715 = l_714[0]; + (*l_676) = (func_21((l_716 , g_649.f3.f8), ((*l_744) |= (safe_sub_func_uint8_t_u_u(((safe_div_func_uint8_t_u_u(((*l_743) &= (((*l_721) = ((*l_704) = 0UL)) & (p_19.f3.f0 || (l_683 = ((safe_add_func_uint8_t_u_u(((l_716.f8 || (safe_lshift_func_uint8_t_u_s((safe_unary_minus_func_uint32_t_u((safe_sub_func_int32_t_s_s((safe_mul_func_int16_t_s_s((safe_add_func_uint8_t_u_u((safe_rshift_func_uint8_t_u_u((*l_715), (safe_sub_func_int8_t_s_s(p_19.f1, (safe_lshift_func_uint8_t_u_s((+(l_739 , (safe_mul_func_uint8_t_u_u((*g_171), 0x10L)))), p_19.f3.f7)))))), l_656)), l_688)), g_533.f3.f2)))), l_716.f9))) , l_742), 0x09L)) != 0x29L))))), l_688)) <= l_688), p_19.f3.f6))), l_658[0][1]) , (*l_715)); + } + else + { /* block id: 509 */ + int32_t **l_746 = &l_714[4]; + int32_t **l_747 = (void*)0; + int32_t **l_748 = &l_675; + (*l_676) = 1L; + (*l_748) = ((*l_746) = l_745); + } + g_38.f4.f1 &= func_25(&g_331); + } + else + { /* block id: 515 */ + uint8_t l_761 = 0x9DL; + int32_t l_776 = (-8L); + for (g_153 = 2; (g_153 <= 7); g_153 += 1) + { /* block id: 518 */ + int32_t l_751 = 7L; + uint32_t l_752 = 4294967295UL; + int i; + (*l_745) = (safe_sub_func_uint32_t_u_u(((*l_704) = p_20), g_161)); + (*l_676) &= (-9L); + --l_752; + } + l_678 |= (((((*l_745) = func_25(func_27(l_755, (l_756 , l_757), func_27(l_755, l_760, l_682, l_673[0][0], l_761), &g_331, p_19.f1))) >= p_19.f3.f3) >= p_19.f4.f7) != l_758.f3.f1); + (*l_676) &= p_19.f4.f8; + if ((g_261.f1 = p_19.f2)) + { /* block id: 528 */ + return l_756.f9; + } + else + { /* block id: 530 */ + const union U3 l_766 = {0}; + int32_t l_774 = (-6L); + l_776 = (safe_mod_func_uint8_t_u_u((safe_add_func_int16_t_s_s((func_25((l_739 , func_27(l_755, l_766, func_39(func_27(l_766, l_767, func_27(l_768[1], func_33(((246UL != (safe_lshift_func_int16_t_s_s(g_261.f2, (((((safe_mul_func_int8_t_s_s(0x5DL, 0xE3L)) , l_755) , (-1L)) && 0xB0L) >= 4294967295UL)))) , 0x0312L), l_758, l_773, l_774), l_673[0][1], l_673[0][0], l_683), l_773, l_775), l_682, p_19.f3.f4, l_774, l_766), (*l_674), l_707))) > p_20), p_19.f4.f6)), p_19.f3.f1)); + return l_656; + } + } + } + l_678 ^= (safe_mul_func_uint16_t_u_u(((((safe_div_func_int16_t_s_s(((*l_784) = (safe_rshift_func_int8_t_s_s(func_25(l_682), 7))), g_162)) & ((safe_lshift_func_uint16_t_u_s((safe_div_func_int16_t_s_s((l_707 <= (safe_sub_func_uint32_t_u_u(((l_795[1] = func_27(l_768[1], l_768[1], &g_331, l_673[0][1], (safe_lshift_func_int8_t_s_u(p_20, 1)))) == l_665), p_19.f1))), (-9L))), g_261.f2)) >= p_19.f3.f5)) | l_796) ^ 4294967295UL), g_261.f0)); + (*l_797) &= (l_656 && ((l_756 , (p_19.f4.f5 <= ((p_19.f4.f7 = (g_58[2][6] || ((6UL ^ p_19.f4.f4) >= ((func_25(func_27(l_767, l_757, l_673[0][1], &g_10, p_19.f4.f0)) != l_756.f4) ^ (-6L))))) || 1UL))) & p_19.f3.f9)); + } + l_804 = ((*l_799) = &p_20); + p_19.f3.f1 ^= ((l_692 = (((((*l_806) = ((*l_805) = p_19.f4.f1)) & (0x5AA9L == (l_758.f3.f1 = p_19.f3.f4))) && (p_19.f3.f4 >= p_19.f2)) >= (((*l_657) = (g_647[0][2].f4.f0 < p_19.f3.f0)) >= p_19.f3.f2))) , (safe_mod_func_int8_t_s_s(0x1AL, 0xA1L))); + for (g_38.f3.f7 = 15; (g_38.f3.f7 <= 15); g_38.f3.f7 = safe_add_func_int16_t_s_s(g_38.f3.f7, 8)) + { /* block id: 552 */ + if (p_19.f3.f2) + break; + } + } + if (((l_739 , &l_739) == (void*)0)) + { /* block id: 556 */ + int32_t l_820 = 0x4C27233AL; + union U3 l_821 = {0}; + const struct S0 l_827 = {0xCAL,0xC3908190L,1L,0x2F706558L,0UL,1UL,0xD3690E4AL,0xEAL,30645,3L}; + int8_t *l_844 = &g_38.f0; + uint16_t l_871[4] = {0UL,0UL,0UL,0UL}; + int32_t l_899 = (-4L); + int32_t l_948[3]; + struct S2 l_1032 = {3,2,-2693,-0}; + int32_t l_1128 = (-7L); + int i; + for (i = 0; i < 3; i++) + l_948[i] = 4L; +lbl_879: + for (l_716.f7 = 20; (l_716.f7 < 44); l_716.f7 = safe_add_func_uint8_t_u_u(l_716.f7, 9)) + { /* block id: 559 */ + int32_t *l_822 = &g_123.f3; + (*l_822) ^= (safe_mul_func_int16_t_s_s(l_739.f2, ((safe_rshift_func_uint8_t_u_u(((safe_rshift_func_int8_t_s_u(l_820, 2)) & 0xA18EL), p_19.f3.f5)) , (0x545E8495L <= (0UL & ((((p_19 , l_821) , (-5L)) , p_19.f3.f0) , p_19.f3.f4)))))); + } + for (l_758.f3.f7 = 0; (l_758.f3.f7 != 45); l_758.f3.f7++) + { /* block id: 564 */ + union U3 *l_830 = &g_62; + union U3 **l_829 = &l_830; + union U3 *** const l_828 = &l_829; + int32_t *l_832 = &l_758.f4.f1; + int32_t *l_845 = &g_647[0][2].f4.f1; + uint16_t *l_846 = &g_647[0][2].f3.f5; + for (l_758.f3.f5 = 0; (l_758.f3.f5 != 21); l_758.f3.f5++) + { /* block id: 567 */ + int32_t *l_831 = &g_647[0][2].f3.f1; + (*l_831) &= (p_19.f3.f5 == ((l_827 , ((p_19.f4.f0 , l_828) == &l_829)) || g_647[0][2].f5)); + } + l_832 = &p_20; + for (l_694 = (-5); (l_694 < 7); l_694++) + { /* block id: 573 */ + struct S2 *l_836 = (void*)0; + struct S2 **l_835 = &l_836; + int32_t *l_837 = (void*)0; + int32_t *l_838[2]; + int i; + for (i = 0; i < 2; i++) + l_838[i] = &l_758.f4.f1; + (**l_828) = (void*)0; + (*l_832) ^= l_716.f2; + (*l_835) = &g_17; + g_839[0][2][5]++; + } + (*l_832) = ((safe_add_func_uint32_t_u_u(4294967295UL, (*l_832))) >= (((*l_846) = (func_25(l_844) != ((*l_845) = l_716.f4))) | 0x7909L)); + } + for (g_649.f5 = 0; (g_649.f5 == 58); g_649.f5 = safe_add_func_int32_t_s_s(g_649.f5, 1)) + { /* block id: 585 */ + const union U3 l_857 = {0}; + int8_t * const l_858 = (void*)0; + int8_t *l_861 = &g_647[0][2].f3.f0; + int32_t l_862 = 0x087338C6L; + int32_t l_895 = 0x30A8AD6AL; + int32_t l_901 = 0x875CFB11L; + const union U3 l_920[2][9][10] = {{{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}}},{{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}}}}; + int32_t l_995 = 1L; + int32_t l_996[1][5]; + uint32_t l_1042 = 4294967294UL; + const struct S2 *l_1071 = &l_739; + struct S0 l_1096 = {0x19L,-1L,0x3243B482L,0x6699A28CL,0x2A0FE804L,0x7798L,0xECF10168L,1UL,46076,0x2600L}; + int32_t *l_1109 = &l_1001; + struct S1 l_1116 = {5L,5UL,5135,{0L,0x0A2D2E68L,0x3144BF2EL,9L,4294967290UL,0x9613L,9UL,0x32L,1519,1L},{-3L,0xB88176E2L,-1L,0xCBF54D7BL,4294967286UL,0x7AEBL,0x0FE1CB94L,0xADL,26793,-9L},255UL}; + uint8_t l_1134 = 0UL; + int i, j, k; + for (i = 0; i < 1; i++) + { + for (j = 0; j < 5; j++) + l_996[i][j] = 0L; + } + if (((safe_mod_func_uint8_t_u_u((safe_rshift_func_int16_t_s_s((p_20 < 0x8DF9B692L), 5)), (safe_lshift_func_int8_t_s_s((safe_mul_func_int8_t_s_s(func_25(func_27(l_857, func_33(func_25(l_795[1]), p_19, l_795[3], p_19.f4.f3), l_861, l_844, l_862)), p_19.f3.f9)), 5)))) && g_10)) + { /* block id: 586 */ + uint16_t l_872 = 0xC991L; + int8_t l_874 = (-1L); + struct S2 l_878 = {4,4,546,-4}; + int32_t l_890 = 4L; + int32_t l_891 = 5L; + int32_t l_894 = 0x5D4E5021L; + int32_t l_896 = 1L; + int32_t l_898 = (-1L); + int32_t l_900 = 1L; + struct S2 *l_912 = (void*)0; + struct S2 **l_911 = &l_912; + if (p_19.f4.f1) + { /* block id: 587 */ + struct S1 l_863 = {0L,4294967295UL,3940,{0L,0x9EF8E51CL,-5L,0x09381873L,2UL,0xEBC9L,1UL,0x09L,30388,0x7AAFL},{1L,0x2BF43DACL,0x4E690341L,1L,4294967295UL,9UL,1UL,0xD6L,13923,0x5B33L},7UL}; + int8_t *l_868[7]; + uint8_t l_873 = 0xC2L; + uint32_t *l_875 = &l_716.f4; + int32_t *l_877 = &g_38.f3.f1; + int32_t l_892 = 0x00BDE7CAL; + int32_t l_897[1][9] = {{0x003A0088L,0x003A0088L,0x003A0088L,0x003A0088L,0x003A0088L,0x003A0088L,0x003A0088L,0x003A0088L,0x003A0088L}}; + int8_t *l_921 = &g_543; + int i, j; + for (i = 0; i < 7; i++) + l_868[i] = &g_382; + (*l_877) = ((((*l_875) |= (l_863 , (safe_add_func_int32_t_s_s(func_25(func_39(func_39(l_861, &g_331, ((((func_25(((safe_lshift_func_int8_t_s_s(l_758.f2, 7)) , l_868[1])) < (safe_rshift_func_uint8_t_u_u((l_827.f4 ^ p_19.f4.f2), 1))) < ((((((l_872 = (~(l_863.f4.f6 || l_871[1]))) || 0UL) , l_873) && l_862) > p_19.f1) != p_19.f4.f6)) != 0x3400L) ^ l_739.f3), l_874, l_857), l_844, l_758.f1, l_739.f1, l_757)), 0xDA6D45ACL)))) <= 4294967292UL) , l_876); + if ((l_878 , ((void*)0 == &p_20))) + { /* block id: 591 */ + int32_t *l_884 = &g_38.f4.f1; + int32_t *l_885 = (void*)0; + int32_t *l_886 = (void*)0; + int32_t *l_887 = (void*)0; + int32_t *l_888 = &g_649.f3.f1; + int32_t *l_889[5][3][4] = {{{&g_542,&l_863.f3.f1,&l_863.f3.f1,(void*)0},{(void*)0,&g_38.f3.f1,&l_716.f1,&g_647[0][2].f3.f1},{&l_716.f1,(void*)0,&l_716.f1,&l_716.f1}},{{&l_863.f4.f1,&l_716.f1,&l_716.f1,(void*)0},{&g_647[0][2].f3.f1,&l_863.f4.f1,&l_716.f1,&g_38.f3.f1},{&g_38.f4.f1,&l_863.f3.f1,&l_716.f1,&l_716.f1}},{{&l_863.f3.f1,&g_38.f4.f1,&l_863.f3.f1,&g_647[0][2].f3.f1},{&l_863.f3.f1,&g_647[0][2].f3.f1,&l_716.f1,&g_542},{&l_716.f1,&l_863.f4.f1,(void*)0,&g_647[0][2].f3.f1}},{{&g_542,&l_716.f1,(void*)0,&l_716.f1},{&g_38.f3.f1,(void*)0,&g_647[0][2].f3.f1,&g_38.f3.f1},{&g_337,&g_542,(void*)0,(void*)0}},{{&g_337,&l_716.f1,&g_542,&l_716.f1},{&g_337,&l_863.f4.f1,&l_863.f4.f1,&g_647[0][2].f3.f1},{&g_38.f3.f1,&l_716.f1,&g_337,(void*)0}}}; + int8_t l_893 = 0xCCL; + int i, j, k; + if (g_17.f2) + goto lbl_879; + (*l_877) = (safe_sub_func_uint8_t_u_u((((((safe_add_func_int16_t_s_s(((*g_171) ^ func_25(&g_10)), (p_19 , p_19.f4.f0))) ^ (l_862 & p_19.f3.f1)) , 0UL) && l_827.f9) == (*l_877)), l_827.f7)); + g_902++; + if (p_19.f3.f0) + break; + } + else + { /* block id: 596 */ + uint8_t l_913[9][7] = {{254UL,255UL,253UL,0x51L,4UL,0x16L,252UL},{0x34L,254UL,0xC8L,0x4EL,0x51L,1UL,0xDEL},{252UL,0x4EL,0x39L,253UL,0x16L,0x34L,0UL},{6UL,0x39L,252UL,0x64L,252UL,0x00L,0xDEL},{0x4EL,0UL,3UL,7UL,0x67L,0UL,0x64L},{0x76L,255UL,0x67L,0xA9L,0x67L,7UL,0x4EL},{0xDEL,253UL,0x76L,0x65L,0x51L,7UL,253UL},{7UL,3UL,1UL,0x16L,0xA9L,7UL,252UL},{4UL,0xA7L,0UL,7UL,0xC8L,0x4EL,252UL}}; + const int8_t **l_914[4]; + int8_t * const l_917 = &l_758.f4.f0; + int8_t *l_922 = &l_716.f0; + int32_t l_923 = (-1L); + int i, j; + for (i = 0; i < 4; i++) + l_914[i] = (void*)0; + (*l_877) |= (safe_sub_func_int16_t_s_s((p_19.f3.f1 >= (l_913[6][6] = (safe_add_func_int8_t_s_s(func_25(&g_543), (g_649.f3.f0 < (safe_rshift_func_int16_t_s_s(l_758.f4.f8, (l_872 < (l_911 == (void*)0))))))))), 1L)); + l_923 ^= (g_38.f3.f6 & func_25(func_39(func_27(func_33(p_19.f3.f8, p_19, func_39((g_915 = &g_331), l_917, (safe_div_func_uint8_t_u_u(255UL, 1L)), g_483[1][2], l_857), g_649.f4.f1), l_920[0][2][2], l_921, l_922, l_871[1]), &l_874, p_19.f3.f7, l_692, l_920[0][2][2]))); + } + (*l_877) = (safe_sub_func_uint16_t_u_u(g_647[0][2].f1, (0x0AL != p_19.f4.f0))); + } + else + { /* block id: 603 */ + union U3 **l_931[8][3][8] = {{{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930},{&l_930,(void*)0,&l_930,&l_930,&l_930,(void*)0,(void*)0,&l_930},{&l_930,&l_930,&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930}},{{&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930,&l_930,(void*)0},{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930},{(void*)0,&l_930,&l_930,&l_930,&l_930,&l_930,(void*)0,&l_930}},{{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930},{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930},{&l_930,&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930,(void*)0}},{{&l_930,&l_930,(void*)0,(void*)0,&l_930,&l_930,(void*)0,&l_930},{&l_930,&l_930,&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930},{(void*)0,&l_930,&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930}},{{&l_930,(void*)0,&l_930,(void*)0,(void*)0,(void*)0,&l_930,(void*)0},{&l_930,&l_930,&l_930,&l_930,(void*)0,&l_930,&l_930,&l_930},{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930}},{{&l_930,(void*)0,&l_930,&l_930,&l_930,(void*)0,&l_930,&l_930},{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930},{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930}},{{&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930},{&l_930,&l_930,&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930},{(void*)0,&l_930,&l_930,&l_930,&l_930,(void*)0,&l_930,&l_930}},{{&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930,&l_930,(void*)0},{&l_930,(void*)0,&l_930,&l_930,&l_930,&l_930,&l_930,&l_930},{&l_930,(void*)0,&l_930,(void*)0,(void*)0,&l_930,(void*)0,&l_930}}}; + const struct S0 *l_934 = &g_649.f3; + const struct S0 **l_933 = &l_934; + const struct S0 ***l_932 = &l_933; + uint16_t *l_935 = &g_647[0][2].f4.f5; + int8_t **l_936[7][10][1] = {{{&g_759[7][4][0]},{&l_844},{&l_861},{&l_861},{&g_759[5][5][0]},{&l_861},{(void*)0},{&l_844},{&g_759[7][3][0]},{&g_759[5][5][0]}},{{&g_759[0][0][1]},{&g_759[7][3][0]},{&g_759[7][3][0]},{&g_759[7][3][0]},{&l_861},{&g_759[5][5][0]},{(void*)0},{&g_759[7][3][0]},{&g_759[7][3][0]},{&l_861}},{{&g_759[7][3][0]},{&g_759[7][3][0]},{&l_844},{&g_759[7][3][0]},{&l_861},{&l_844},{&g_759[7][3][0]},{&g_759[7][3][0]},{&g_759[3][2][0]},{&l_844}},{{&l_861},{&g_759[7][3][0]},{&g_759[7][3][0]},{&g_759[7][3][0]},{&g_759[0][0][1]},{&l_844},{&l_861},{&g_759[7][3][0]},{(void*)0},{&g_759[7][4][0]}},{{(void*)0},{&l_861},{&l_861},{&l_861},{&l_682},{(void*)0},{&l_682},{&g_759[3][2][0]},{&g_759[5][5][0]},{&g_759[7][3][0]}},{{&l_844},{(void*)0},{&g_759[3][2][0]},{(void*)0},{&l_861},{&l_861},{&g_759[0][0][1]},{&l_861},{&g_759[7][3][0]},{&l_682}},{{&l_844},{&g_759[7][3][0]},{&g_759[7][3][0]},{&l_844},{(void*)0},{&g_759[7][3][0]},{&g_759[7][3][0]},{&g_759[7][3][0]},{(void*)0},{&l_844}}}; + int32_t *l_937 = &l_900; + uint32_t l_949 = 0x87C0B725L; + int i, j, k; + (*l_937) &= (safe_lshift_func_uint16_t_u_u(l_758.f4.f8, func_25((l_861 = (func_21(func_25(l_795[4]), ((g_839[0][2][5] >= 1L) == (&g_17 != (void*)0)), ((*l_935) ^= (l_928 == ((l_929 == l_931[6][1][4]) , l_932)))) , l_861))))); + for (l_758.f1 = (-5); (l_758.f1 >= 22); l_758.f1 = safe_add_func_int8_t_s_s(l_758.f1, 5)) + { /* block id: 609 */ + int32_t *l_940 = &g_542; + int32_t *l_941 = &g_38.f3.f1; + int32_t *l_942 = &l_898; + int32_t *l_943 = &l_900; + int32_t *l_944 = &l_891; + int32_t *l_946 = &l_693; + int32_t *l_947[8][6] = {{&l_896,&l_896,&g_123.f3,&l_896,&l_896,&l_758.f4.f1},{&g_123.f3,&g_123.f3,&l_693,&l_896,(void*)0,(void*)0},{&l_758.f4.f1,(void*)0,(void*)0,&l_693,(void*)0,&l_894},{(void*)0,&g_123.f3,&g_123.f3,&l_693,&l_896,(void*)0},{&l_894,&l_758.f4.f1,&l_896,&l_896,&l_693,&l_896},{&l_894,&l_758.f4.f1,&l_894,&l_693,(void*)0,&l_693},{(void*)0,&l_758.f4.f1,&l_693,&g_123.f3,&g_123.f3,&l_894},{&l_693,&l_693,&l_693,&l_693,&l_758.f4.f1,&g_123.f3}}; + int i, j; + --l_949; + } + if (l_895) + break; + } + for (l_716.f0 = 0; (l_716.f0 != 7); l_716.f0++) + { /* block id: 616 */ + struct S2 *l_954 = &g_955; + l_954 = &g_17; + } + for (g_543 = 1; (g_543 >= 0); g_543 -= 1) + { /* block id: 621 */ + int32_t *l_967 = &l_758.f4.f1; + uint16_t *l_972 = &g_647[0][2].f4.f5; + int32_t l_992 = 0L; + int32_t l_993 = 0xA1FDC560L; + int32_t l_994 = (-1L); + int32_t l_1002 = 0L; + l_948[2] = ((*l_967) = (((safe_mod_func_int16_t_s_s(g_647[0][2].f3.f8, p_19.f3.f7)) , p_20) , (safe_add_func_uint8_t_u_u(((safe_mod_func_int32_t_s_s((-1L), (g_647[0][2].f2 & p_19.f4.f0))) | ((safe_unary_minus_func_uint16_t_u((safe_mod_func_uint8_t_u_u((*g_171), (safe_sub_func_uint16_t_u_u(p_19.f3.f4, g_533.f4.f3)))))) , p_19.f3.f1)), l_874)))); + (*l_967) = (safe_mul_func_uint8_t_u_u(((*g_171) = l_692), (((l_896 = p_19.f3.f8) && (--p_19.f4.f7)) <= (p_19.f4.f0 <= ((g_17 , (((*l_972) = 5UL) <= (safe_div_func_uint32_t_u_u((5UL == (safe_div_func_uint16_t_u_u(g_38.f5, ((p_19.f3.f9 || (g_60 = (g_533 , l_716.f4))) ^ 0L)))), p_19.f4.f6)))) , p_19.f3.f9))))); + p_20 &= ((safe_div_func_int16_t_s_s(l_878.f1, 0xB70CL)) == (g_38.f3.f2 >= g_123.f3)); + for (l_758.f3.f1 = 0; (l_758.f3.f1 <= 1); l_758.f3.f1 += 1) + { /* block id: 633 */ + int32_t *l_979 = &l_716.f1; + int32_t *l_980 = &l_716.f1; + int32_t *l_981 = (void*)0; + int32_t *l_982 = &l_693; + int32_t *l_983 = (void*)0; + int32_t *l_984 = &l_900; + int32_t *l_985 = (void*)0; + int32_t *l_986 = &l_758.f4.f1; + int32_t *l_987 = &l_900; + int32_t *l_988 = &g_647[0][2].f4.f1; + int32_t *l_989 = &l_901; + int32_t *l_990 = &l_862; + int32_t *l_991[9][8][3] = {{{(void*)0,&g_647[0][2].f4.f1,&g_542},{&l_758.f4.f1,&l_898,&g_647[0][2].f3.f1},{&l_899,&l_898,&g_649.f3.f1},{&l_948[2],&l_758.f3.f1,&l_948[2]},{&l_692,(void*)0,&l_898},{&l_948[2],&g_542,&g_647[0][2].f4.f1},{(void*)0,&l_894,(void*)0},{&l_900,&l_948[2],&l_890}},{{&g_349,(void*)0,&g_123.f3},{(void*)0,&l_948[2],&g_542},{&g_542,&l_894,&l_899},{&l_758.f3.f1,&g_542,(void*)0},{(void*)0,(void*)0,(void*)0},{&g_542,&g_542,&l_948[2]},{&l_894,&g_60,&l_901},{(void*)0,&l_898,&g_647[0][2].f4.f1}},{{&l_758.f4.f1,(void*)0,(void*)0},{(void*)0,&l_898,&l_895},{&g_647[0][2].f4.f1,&g_123.f3,&l_898},{&l_890,&l_900,(void*)0},{(void*)0,&g_542,&g_542},{&g_542,&l_948[2],(void*)0},{&g_60,(void*)0,&l_899},{&l_898,&g_542,&l_758.f4.f1}},{{&l_901,&g_649.f3.f1,&l_899},{(void*)0,&l_758.f4.f1,(void*)0},{&l_692,(void*)0,&g_542},{(void*)0,&g_337,&l_758.f4.f1},{&g_60,(void*)0,&g_542},{&l_948[2],&l_692,&l_948[2]},{(void*)0,&l_692,(void*)0},{&g_542,&g_649.f4.f1,(void*)0}},{{&g_649.f3.f1,&l_692,(void*)0},{&l_758.f4.f1,&l_758.f3.f1,&l_898},{(void*)0,&l_758.f4.f1,&g_649.f3.f1},{&g_647[0][2].f3.f1,&g_647[0][2].f3.f1,&l_895},{&l_758.f4.f1,(void*)0,(void*)0},{&l_758.f3.f1,&l_758.f4.f1,&g_337},{&l_692,(void*)0,&g_542},{&g_649.f4.f1,&l_890,&g_649.f4.f1}},{{&l_692,&g_649.f3.f1,(void*)0},{&l_758.f3.f1,&l_900,(void*)0},{&l_758.f4.f1,&g_647[0][2].f4.f1,&g_647[0][2].f4.f1},{&g_649.f4.f1,&l_758.f4.f1,&l_758.f4.f1},{&l_758.f4.f1,&g_542,&l_692},{&l_692,&l_895,&l_898},{(void*)0,(void*)0,(void*)0},{(void*)0,(void*)0,(void*)0}},{{&g_649.f3.f1,&g_349,&l_898},{&l_900,&g_647[0][2].f3.f1,&l_758.f4.f1},{&g_647[0][2].f4.f1,&l_899,&g_349},{&l_758.f4.f1,&g_649.f4.f1,&l_758.f4.f1},{&g_542,(void*)0,&g_123.f3},{&l_948[2],&l_900,&l_948[2]},{&l_758.f4.f1,&g_60,&g_60},{&g_647[0][2].f4.f1,&l_900,&g_647[0][2].f3.f1}},{{(void*)0,(void*)0,&g_649.f3.f1},{&g_647[0][2].f3.f1,&g_649.f4.f1,&g_647[0][2].f4.f1},{&l_899,&l_899,&g_123.f3},{&g_649.f4.f1,&g_649.f4.f1,&l_895},{(void*)0,&l_901,&g_542},{&l_900,&l_948[2],&l_758.f4.f1},{&g_60,(void*)0,&g_60},{(void*)0,(void*)0,&l_948[2]}},{{(void*)0,&l_894,&g_647[0][2].f4.f1},{&l_948[2],&l_758.f3.f1,&l_758.f3.f1},{&g_60,(void*)0,(void*)0},{&g_649.f4.f1,&l_758.f4.f1,(void*)0},{&l_901,(void*)0,&g_649.f3.f1},{&l_948[2],&g_649.f4.f1,&l_890},{(void*)0,&l_898,&g_649.f3.f1},{(void*)0,&l_890,(void*)0}}}; + uint32_t *l_1019 = &g_325; + int i, j, k; + g_1004++; + (*l_979) = 8L; + g_261.f1 = (safe_mul_func_int16_t_s_s(g_647[0][2].f0, (safe_mod_func_uint32_t_u_u(((safe_add_func_int16_t_s_s((safe_add_func_int32_t_s_s(l_739.f0, ((*l_1019) = (p_19.f4.f3 & ((((*l_987) = (g_38.f3.f3 | ((l_948[2] &= p_19.f2) || 0x2AA23E55L))) > (safe_mul_func_uint16_t_u_u(((p_19.f4.f7 &= (*g_171)) || (*l_967)), (safe_lshift_func_uint8_t_u_u(p_19.f3.f9, l_995))))) <= g_839[0][2][5]))))), 0x9BBAL)) < 0x458AL), (*l_967))))); + (*l_989) ^= p_19.f3.f2; + } + } + return g_1004; + } + else + { /* block id: 645 */ + uint8_t l_1020[8][4][5] = {{{0x8CL,253UL,9UL,0x28L,248UL},{6UL,0x85L,0UL,0x3EL,0UL},{0xBDL,1UL,255UL,0x9CL,0x58L},{0xEDL,9UL,0x58L,0x3EL,1UL}},{{0x9CL,0xB9L,0xB9L,1UL,0UL},{3UL,1UL,248UL,248UL,6UL},{8UL,8UL,0xCDL,6UL,0x28L},{1UL,253UL,0xB7L,0xEDL,0x30L}},{{0x43L,0UL,6UL,255UL,0x30L},{252UL,0xD5L,252UL,246UL,1UL},{1UL,9UL,0x3EL,255UL,0x28L},{1UL,8UL,0x25L,1UL,5UL}},{{9UL,255UL,1UL,252UL,0UL},{0xCAL,1UL,0xEDL,255UL,255UL},{0x30L,255UL,1UL,0UL,0x58L},{0xCAL,0xB9L,0xB7L,0xB7L,0x0EL}},{{9UL,0x85L,250UL,8UL,0x45L},{1UL,252UL,0xCAL,0x43L,255UL},{0UL,255UL,8UL,255UL,253UL},{0xCDL,1UL,252UL,8UL,255UL}},{{3UL,1UL,9UL,0xCDL,252UL},{253UL,255UL,6UL,0xCAL,1UL},{248UL,255UL,1UL,0x43L,255UL},{0UL,3UL,0x9CL,1UL,0x30L}},{{0UL,0x43L,0x0EL,6UL,3UL},{1UL,0UL,0x3EL,0x9CL,1UL},{255UL,0xCAL,0xB9L,0xB7L,0xB7L},{0x3EL,0xEDL,0x3EL,0x8CL,255UL}},{{1UL,255UL,0x3EL,0x25L,1UL},{0x1BL,0x8BL,0x28L,9UL,0x3EL},{0UL,5UL,8UL,253UL,252UL},{0x8BL,252UL,255UL,253UL,9UL}}}; + int32_t *l_1021 = &g_647[0][2].f3.f1; + const int32_t **l_1022 = &g_286[9]; + const union U3 l_1037 = {0}; + int8_t *l_1038[4] = {&g_38.f4.f0,&g_38.f4.f0,&g_38.f4.f0,&g_38.f4.f0}; + int32_t l_1046[3]; + uint8_t l_1054 = 0x2CL; + int32_t l_1078 = (-8L); + union U4 **l_1081[5][4] = {{&g_122,&g_122,&g_122,&g_122},{&g_122,&g_122,&g_122,&g_122},{&g_122,&g_122,&g_122,&g_122},{&g_122,&g_122,&g_122,&g_122},{&g_122,&g_122,&g_122,&g_122}}; + int i, j, k; + for (i = 0; i < 3; i++) + l_1046[i] = (-9L); + (*l_1021) = (l_1020[6][3][2] & 0x0B1E74EEL); + (*l_1021) = 0x760BF5A6L; + (*l_1022) = &g_287; + for (l_758.f4.f5 = 0; (l_758.f4.f5 > 3); l_758.f4.f5 = safe_add_func_uint16_t_u_u(l_758.f4.f5, 6)) + { /* block id: 651 */ + uint8_t l_1029 = 0xEDL; + struct S0 ****l_1034 = (void*)0; + struct S0 ****l_1035 = &l_1033; + int16_t *l_1036 = &g_84; + int8_t **l_1039 = (void*)0; + int8_t **l_1040 = (void*)0; + int8_t **l_1041 = &g_759[7][3][0]; + int32_t l_1047[10][4] = {{0xA4219068L,0xC697727CL,0x14E6613EL,(-7L)},{1L,6L,6L,0x4D2B8984L},{0xE9FB831BL,0xA4219068L,0x8EE6138EL,6L},{(-1L),0x8EE6138EL,0x8EE6138EL,(-7L)},{0x4D2B8984L,0x67D86386L,0x8EE6138EL,6L},{0xEE538D5FL,8L,6L,0xE9FB831BL},{8L,0x8EE6138EL,0x14E6613EL,0x4D2B8984L},{0x67D86386L,0x4D2B8984L,0xE9FB831BL,0x4D2B8984L},{0x8EE6138EL,0xEE538D5FL,0xD19C07C1L,0x4D2B8984L},{(-7L),0xE9FB831BL,1L,0xC697727CL}}; + int i, j; + (*l_1021) = (safe_div_func_uint8_t_u_u((safe_add_func_uint8_t_u_u(l_1029, (safe_rshift_func_int16_t_s_u((func_25(func_39((p_19.f1 , (l_1032 , l_682)), l_861, (((*l_1036) = (l_928 != ((*l_1035) = l_1033))) != (((func_25(((*l_1041) = (l_844 = func_27(l_1037, (**l_929), &g_10, l_1038[2], l_862)))) != 0x30L) < l_1042) & p_19.f4.f5)), l_997, l_821)) & p_19.f5), p_19.f3.f5)))), 0x07L)); + for (l_998 = 0; (l_998 > 21); ++l_998) + { /* block id: 659 */ + int32_t *l_1045[6][4]; + int i, j; + for (i = 0; i < 6; i++) + { + for (j = 0; j < 4; j++) + l_1045[i][j] = &g_123.f3; + } + ++g_1048; + } + for (g_38.f4.f4 = (-8); (g_38.f4.f4 != 1); g_38.f4.f4++) + { /* block id: 664 */ + int32_t *l_1053[10] = {(void*)0,&l_948[2],(void*)0,(void*)0,(void*)0,&l_948[2],(void*)0,&l_948[2],&l_948[2],&l_948[2]}; + const struct S2 **l_1072 = (void*)0; + const struct S2 **l_1073[8] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0}; + int32_t l_1079 = 0x2F43FF97L; + uint32_t *l_1080 = &g_261.f4; + int i; + --l_1054; + l_948[2] &= (safe_mod_func_uint32_t_u_u(((safe_sub_func_uint8_t_u_u(p_19.f3.f2, (safe_div_func_int8_t_s_s(((!(safe_sub_func_int32_t_s_s(((p_19.f4.f7 = (((*l_1080) = (safe_add_func_int8_t_s_s(l_827.f4, (safe_add_func_uint8_t_u_u((safe_mod_func_int16_t_s_s((((((g_1074[0][0][2] = l_1071) == (void*)0) ^ (((safe_div_func_int8_t_s_s((((*l_1021) = p_19.f4.f3) < func_25(((*l_1041) = l_861))), (p_19.f4.f4 | ((l_901 && l_827.f0) != 1L)))) > p_19.f3.f6) <= 0x17ADL)) != l_1078) , 0x116BL), 0x5151L)), l_1079))))) > 0x153595DBL)) || l_895), p_19.f3.f6))) , (*l_1021)), p_19.f3.f1)))) < 4UL), l_827.f6)); + (*l_1021) = ((void*)0 == l_1081[2][1]); + g_647[0][2].f4.f1 = ((safe_rshift_func_uint8_t_u_u(((*g_171) = 7UL), (safe_sub_func_int16_t_s_s(l_1042, (&l_871[1] == &l_871[1]))))) && (safe_div_func_int32_t_s_s(((*l_1021) = (safe_mod_func_uint16_t_u_u(g_647[0][2].f3.f6, g_261.f4))), g_649.f4.f5))); + } + for (g_261.f1 = 0; (g_261.f1 <= 2); g_261.f1 += 1) + { /* block id: 679 */ + struct S2 *l_1091 = &g_955; + struct S2 **l_1090 = &l_1091; + int i, j, k; + (*l_1090) = (void*)0; + (*l_1021) = (safe_add_func_int32_t_s_s(0xD3BA7D74L, l_1020[(g_261.f1 + 3)][(g_261.f1 + 1)][(g_261.f1 + 1)])); + p_20 = ((void*)0 != &g_337); + } + } + } + for (g_261.f4 = 18; (g_261.f4 != 2); --g_261.f4) + { /* block id: 688 */ + union U4 *l_1112 = (void*)0; + const union U3 l_1120 = {0}; + int32_t l_1121 = 3L; + int32_t l_1133 = 1L; + if ((l_1032 , 0L)) + { /* block id: 689 */ + int8_t *l_1117 = &l_758.f0; + uint32_t *l_1122 = (void*)0; + for (g_38.f3.f7 = 0; (g_38.f3.f7 <= 2); g_38.f3.f7 += 1) + { /* block id: 692 */ + int32_t *l_1097 = &l_758.f4.f1; + int32_t **l_1106[10] = {&l_1097,&l_1097,&l_1097,&l_1097,&l_1097,&l_1097,&l_1097,&l_1097,&l_1097,&l_1097}; + int i; + (*l_1097) |= ((l_1032 , l_1096) , (g_647[0][2].f3.f6 < g_647[0][2].f3.f7)); + (*l_1097) |= (safe_lshift_func_int16_t_s_s((safe_div_func_int8_t_s_s(p_19.f4.f6, (safe_div_func_uint8_t_u_u(p_19.f4.f1, ((*l_861) = (safe_div_func_uint16_t_u_u(p_19.f4.f5, p_19.f4.f9))))))), p_19.f3.f9)); + g_286[9] = &p_20; + } + for (p_19.f4.f0 = 0; (p_19.f4.f0 <= (-6)); --p_19.f4.f0) + { /* block id: 700 */ + int32_t *l_1111 = (void*)0; + int32_t **l_1110 = &l_1111; + union U4 **l_1113[7]; + int8_t *l_1118 = &g_331; + union U3 l_1119 = {0}; + int i; + for (i = 0; i < 7; i++) + l_1113[i] = &l_1112; + (*l_1110) = (l_1109 = &p_20); + g_122 = l_1112; + (*l_1111) = ((safe_rshift_func_int16_t_s_u((*l_1109), ((l_1120 , 4294967294UL) && l_1121))) <= 0x414FL); + } + (*l_1109) = ((g_649.f4.f8 = p_19.f3.f9) | ((safe_div_func_int32_t_s_s(p_19.f4.f2, 0x59CADDC3L)) , 0UL)); + } + else + { /* block id: 708 */ + struct S1 l_1125 = {-7L,0x02B4988DL,622,{0L,-1L,0x06A61F61L,-5L,0x0FBE2CFEL,65534UL,0UL,0xB6L,27286,-1L},{0xF1L,5L,0xBD36395BL,2L,4294967292UL,65534UL,5UL,0UL,19642,0xDA76L},5UL}; + (*l_1109) = ((*g_171) > (l_1125 , (safe_mul_func_uint8_t_u_u((l_1128 = 1UL), p_19.f4.f0)))); + if (l_1121) + { /* block id: 711 */ + return p_19.f1; + } + else + { /* block id: 713 */ + return l_1121; + } + } + if (p_19.f3.f3) + { /* block id: 717 */ + const struct S0 l_1130 = {-3L,0x0E8EA95CL,2L,0x6FA3F0D1L,1UL,65533UL,0x2932AD5FL,1UL,14192,-3L}; + for (l_1116.f4.f4 = 0; (l_1116.f4.f4 <= 4); l_1116.f4.f4 += 1) + { /* block id: 720 */ + const int32_t **l_1129 = &g_286[9]; + (*l_1129) = &g_287; + } + (*l_1109) = ((l_1130 , p_19) , 1L); + } + else + { /* block id: 724 */ + for (l_1116.f3.f1 = 0; (l_1116.f3.f1 <= 2); l_1116.f3.f1 += 1) + { /* block id: 727 */ + int32_t **l_1131 = &l_1109; + int32_t *l_1132[9][5] = {{&l_758.f3.f1,&g_349,&l_999,(void*)0,&g_349},{&l_996[0][3],&g_53.f3,&l_999,&g_337,&g_53.f3},{(void*)0,&l_758.f3.f1,(void*)0,&l_758.f3.f1,&l_758.f3.f1},{&l_999,&l_996[0][3],&g_337,&l_996[0][3],&l_996[0][3]},{(void*)0,(void*)0,&g_349,&l_999,(void*)0},{&g_337,&l_999,&g_53.f3,&l_996[0][3],&l_999},{&g_349,(void*)0,&l_999,(void*)0,(void*)0},{&l_996[0][3],&g_337,&l_996[0][3],&g_337,&g_337},{&l_999,&g_349,(void*)0,&g_349,&g_349}}; + int i, j; + (*l_1131) = &l_999; + l_1134++; + if (g_483[(l_1116.f3.f1 + 1)][l_1116.f3.f1]) + break; + (*l_1109) &= ((g_1137 <= p_19.f1) < l_871[1]); + } + } + (*l_1109) = p_19.f3.f5; + } + return p_19.f4.f2; + } + } + else + { /* block id: 738 */ + uint16_t l_1143 = 6UL; + int32_t l_1144 = 0xC34EB222L; + struct S2 l_1147 = {8,14,2852,7}; + int8_t l_1148 = 0L; + int32_t l_1178 = 9L; + uint8_t l_1180 = 2UL; + int32_t l_1205 = (-1L); + int32_t l_1207[6][2] = {{0xC64684D3L,0xEB9B98CCL},{9L,0xEB9B98CCL},{9L,0xC64684D3L},{9L,0xC64684D3L},{0xEB9B98CCL,0xC64684D3L},{9L,9L}}; + int8_t **l_1260 = &l_682; + struct S1 l_1278 = {-9L,0x5D60330CL,2276,{7L,0x8E4F35ECL,-1L,0x18DD381CL,4294967295UL,65528UL,2UL,249UL,32173,0L},{0L,0xB02AB65DL,-7L,6L,1UL,0x4FD1L,0x8E0216F8L,1UL,42655,3L},3UL}; + int32_t *l_1310 = &l_1001; + int i, j; + for (g_1137 = 0; (g_1137 == 57); g_1137++) + { /* block id: 741 */ + int32_t *l_1140 = &g_337; + (*l_1140) |= l_945; + (*l_1140) = 1L; + } + p_19.f4.f1 &= p_19.f3.f7; + if ((((safe_div_func_int8_t_s_s(((*l_682) = func_25(l_795[1])), (l_1144 ^= l_1143))) && (((safe_sub_func_int8_t_s_s(((((*l_682) = p_19.f3.f2) < ((((p_19.f3.f9 , l_739) , l_1147) , (((l_1148 = l_1147.f3) < (p_19.f4.f7 = p_19.f3.f7)) == g_1137)) == 1UL)) != (-1L)), p_19.f3.f2)) , 0xC215D138L) | 0x363ACD71L)) | g_649.f4.f9)) + { /* block id: 751 */ + int8_t *l_1151 = &g_649.f4.f0; + int32_t l_1152 = 0x3A6E25C1L; + uint32_t l_1224 = 4294967294UL; + const struct S2 * const l_1225 = &l_739; + int32_t *l_1239 = &g_649.f4.f1; + int32_t *l_1240 = &l_1000; + int32_t *l_1241[9]; + int32_t l_1245 = 0x0C03241EL; + uint16_t l_1263 = 1UL; + union U4 l_1269 = {0UL}; + uint32_t l_1305 = 0xF526EBC9L; + int i; + for (i = 0; i < 9; i++) + l_1241[i] = &l_1000; + if ((safe_mod_func_uint16_t_u_u(g_647[0][2].f4.f8, func_25(l_1151)))) + { /* block id: 752 */ + const int32_t l_1156 = 0L; + int32_t l_1179 = 0x691B0629L; + for (g_649.f4.f1 = 0; (g_649.f4.f1 <= 4); g_649.f4.f1 += 1) + { /* block id: 755 */ + int32_t *l_1153 = &g_337; + int32_t *l_1171 = &l_997; + int32_t *l_1172 = &l_1001; + int32_t *l_1173 = &g_123.f3; + int32_t *l_1174 = &l_758.f4.f1; + int32_t *l_1175 = &g_53.f3; + int32_t *l_1176 = &l_693; + int32_t *l_1177[5][9] = {{&l_692,&l_692,(void*)0,&l_1000,&l_692,&l_692,&l_997,&l_692,(void*)0},{&g_38.f3.f1,(void*)0,&g_38.f3.f1,&l_1144,&l_1144,&l_997,&l_1144,&l_1152,&l_1144},{(void*)0,&l_997,&l_692,&l_1000,&l_692,&l_692,&l_692,&l_1000,(void*)0},{&l_1152,&l_1152,(void*)0,&l_1144,&l_1152,&l_1152,(void*)0,&g_38.f3.f1,&l_1144},{&l_997,&l_997,(void*)0,&l_997,&l_997,&l_692,(void*)0,(void*)0,(void*)0}}; + struct S0 *l_1183 = &g_649.f4; + int16_t l_1206 = (-1L); + int i, j; + (*l_1153) = ((l_1143 ^ l_1152) == p_19.f2); + for (l_758.f4.f5 = 0; (l_758.f4.f5 <= 4); l_758.f4.f5 += 1) + { /* block id: 759 */ + int8_t **l_1169 = &g_759[7][3][0]; + int8_t **l_1170 = &l_682; + int i; + (*l_1153) = (safe_rshift_func_int8_t_s_u(l_1156, (safe_add_func_uint8_t_u_u(0UL, ((*l_1151) &= (p_19.f4.f0 = (safe_mod_func_uint16_t_u_u((l_1148 <= (safe_mul_func_uint16_t_u_u((safe_div_func_int32_t_s_s(l_1147.f2, ((safe_mul_func_uint8_t_u_u((safe_add_func_int32_t_s_s(l_1148, func_25(((l_739 , p_19.f5) , ((*l_1170) = ((*l_1169) = l_795[g_649.f4.f1])))))), p_19.f3.f3)) , g_123.f0))), p_19.f1))), 1UL)))))))); + g_38.f3.f1 ^= 0x11C9B3ABL; + } + l_1180++; + for (g_331 = 0; (g_331 <= 3); g_331 += 1) + { /* block id: 770 */ + p_20 = (l_1179 = ((((void*)0 == l_1183) && (safe_div_func_int16_t_s_s((safe_div_func_uint16_t_u_u((safe_sub_func_uint8_t_u_u(((safe_rshift_func_uint8_t_u_s(p_19.f4.f8, 3)) | p_19.f4.f1), p_19.f3.f8)), (safe_lshift_func_uint8_t_u_u(255UL, ((*g_171) = (((p_19.f3.f3 | (p_19.f4.f3 ^ p_19.f4.f3)) && (*g_171)) <= p_19.f3.f6)))))), p_19.f4.f5))) || p_19.f3.f1)); + } + for (p_19.f0 = 0; (p_19.f0 <= 3); p_19.f0 += 1) + { /* block id: 777 */ + struct S2 l_1196 = {5,14,-631,-30}; + int16_t *l_1204 = &g_1003; + int32_t l_1208 = 0xB107A3B4L; + int32_t l_1210 = 0x6388050BL; + (*l_1172) = (safe_rshift_func_uint8_t_u_s(3UL, (p_19.f4.f0 |= ((l_1196 , g_533.f1) < ((safe_unary_minus_func_int32_t_s((3UL && (p_19.f3.f0 == (((((*l_1151) = ((safe_add_func_uint8_t_u_u(((*g_171)--), (safe_mul_func_int16_t_s_s((l_999 = ((*l_1204) = p_19.f3.f2)), g_647[0][2].f3.f6)))) == l_1178)) ^ 1L) == 0xEEFDL) || l_1144))))) != p_19.f5))))); + --g_1211; + (*l_1172) = ((safe_add_func_uint32_t_u_u(((safe_mul_func_int16_t_s_s(((p_19.f3 , (safe_mod_func_uint32_t_u_u((p_19.f4.f4 <= (safe_mul_func_uint16_t_u_u((((safe_sub_func_uint32_t_u_u(p_19.f2, p_19.f4.f6)) , (l_758 , &g_84)) != &g_84), g_649.f4.f0))), p_19.f4.f9))) && (*g_915)), p_19.f4.f3)) || l_1152), l_1224)) ^ l_758.f4.f8); + (*l_1173) = p_19.f0; + } + } + g_649.f3.f1 = p_19.f0; + for (g_455 = 0; (g_455 <= 1); g_455 += 1) + { /* block id: 792 */ + for (l_1179 = 1; (l_1179 >= 0); l_1179 -= 1) + { /* block id: 795 */ + int i, j; + return l_1207[(l_1179 + 2)][g_455]; + } + } + } + else + { /* block id: 799 */ + int32_t *l_1226 = &g_261.f1; + (*g_355) = (void*)0; + if (((*l_1226) = (p_19.f3.f1 = (l_1225 == (g_649 , l_1225))))) + { /* block id: 803 */ + int32_t l_1233[3]; + int i; + for (i = 0; i < 3; i++) + l_1233[i] = (-3L); + for (l_758.f3.f7 = (-13); (l_758.f3.f7 <= 27); l_758.f3.f7++) + { /* block id: 806 */ + (*l_1226) = (safe_rshift_func_uint16_t_u_u(g_533.f5, 9)); + } + for (l_758.f3.f4 = (-25); (l_758.f3.f4 != 4); ++l_758.f3.f4) + { /* block id: 811 */ + int32_t **l_1234 = &l_1226; + if (l_1233[1]) + break; + (*l_1234) = &g_60; + (*l_1226) |= (safe_mul_func_int8_t_s_s((p_19.f0 |= ((((void*)0 == &g_116) == ((*l_682) ^= 0x79L)) > 247UL)), 247UL)); + } + } + else + { /* block id: 818 */ + struct S1 *l_1238 = &g_649; + struct S1 **l_1237 = &l_1238; + (*l_1237) = &p_19; + } + (*l_1226) = ((void*)0 != l_1151); + for (l_716.f4 = 0; l_716.f4 < 1; l_716.f4 += 1) + { + for (p_19.f3.f1 = 0; p_19.f3.f1 < 3; p_19.f3.f1 += 1) + { + for (g_331 = 0; g_331 < 6; g_331 += 1) + { + g_839[l_716.f4][p_19.f3.f1][g_331] = 255UL; + } + } + } + } + l_1242[5]--; + if ((p_19.f4.f3 >= p_19.f3.f2)) + { /* block id: 825 */ + uint32_t l_1246[3][4] = {{0x0E8AAD32L,0x0E8AAD32L,0x0E8AAD32L,0x0E8AAD32L},{0x0E8AAD32L,0x0E8AAD32L,0x0E8AAD32L,0x0E8AAD32L},{0x0E8AAD32L,0x0E8AAD32L,0x0E8AAD32L,0x0E8AAD32L}}; + int i, j; + ++l_1246[1][1]; + } + else + { /* block id: 827 */ + const uint16_t l_1249 = 65535UL; + int16_t *l_1261 = &g_1209; + uint8_t l_1262 = 255UL; + struct S1 l_1266 = {0xA5L,0xE5DF3B3CL,832,{-1L,1L,0x67D42FBDL,0xE3476D55L,0xDAEF557CL,0x68EEL,0xFA514F3AL,0UL,5745,-1L},{0x90L,0x7E1333B4L,0x9E0967EAL,1L,0x200F1C1FL,65535UL,4294967291UL,0UL,10990,0x8B62L},0xF1L}; + struct S2 *l_1309 = &g_955; + struct S2 **l_1308[4] = {&l_1309,&l_1309,&l_1309,&l_1309}; + int i; + for (g_38.f4.f0 = 3; (g_38.f4.f0 >= 1); g_38.f4.f0 -= 1) + { /* block id: 830 */ + int16_t l_1250 = 1L; + (*l_1239) = l_1249; + (*l_1239) = l_1250; + for (p_19.f3.f0 = 0; (p_19.f3.f0 <= 0); p_19.f3.f0 += 1) + { /* block id: 835 */ + uint16_t *l_1255 = &l_758.f3.f5; + int16_t *l_1259[7] = {&l_1250,&l_1250,&g_1003,&g_1209,&g_1209,&l_1250,&g_1003}; + int i, j; + (*l_1240) = (((((g_38.f4.f7 , (((safe_add_func_uint16_t_u_u(65535UL, (l_716.f1 = (safe_rshift_func_uint16_t_u_u((p_19.f3.f5 = ((*l_1255) = l_692)), (((l_658[p_19.f3.f0][(p_19.f3.f0 + 1)] ^= 0x2C8A95F1L) | (((safe_unary_minus_func_int16_t_s((l_1178 & ((g_84 |= 8L) > g_647[0][2].f4.f9)))) , l_1260) != (void*)0)) ^ 3L)))))) , l_1261) == (void*)0)) != l_1262) | p_19.f3.f0) > l_1263) ^ l_1250); + g_286[6] = &p_20; + } + } + for (g_1003 = 0; (g_1003 > (-28)); --g_1003) + { /* block id: 847 */ + int8_t *l_1275 = &l_758.f0; + int32_t l_1296[2][2][3]; + int32_t **l_1303 = &l_1240; + int i, j, k; + for (i = 0; i < 2; i++) + { + for (j = 0; j < 2; j++) + { + for (k = 0; k < 3; k++) + l_1296[i][j][k] = 0x27093157L; + } + } + (*l_1239) = (l_1266 , (p_19.f2 ^ (!g_533.f4.f8))); + if (((*l_1239) |= p_19.f3.f3)) + { /* block id: 850 */ + uint8_t l_1270 = 0xC3L; + int32_t **l_1276[7][5] = {{&l_1241[8],(void*)0,&l_1241[8],(void*)0,&l_1241[8]},{&l_1239,&l_1239,&l_1239,&l_1239,&l_1239},{&l_1241[8],(void*)0,&l_1241[8],(void*)0,&l_1241[8]},{&l_1239,&l_1239,&l_1239,&l_1239,&l_1239},{&l_1241[8],(void*)0,&l_1241[8],(void*)0,&l_1241[8]},{&l_1239,&l_1239,&l_1239,&l_1239,&l_1239},{&l_1241[8],(void*)0,&l_1241[8],(void*)0,&l_1241[8]}}; + int i, j; + (*l_1239) |= ((p_19.f4.f0 = ((0x8C061D61L && 0x17338171L) , (safe_div_func_uint32_t_u_u(g_38.f4.f9, ((+(l_1269 , ((((*l_1261) = (p_19.f3.f6 | l_1270)) < g_261.f9) < (safe_lshift_func_uint8_t_u_s((safe_mod_func_uint32_t_u_u((*l_1240), p_19.f4.f7)), 1))))) ^ 0x36L))))) & p_19.f3.f8); + l_1240 = (p_19 , &g_542); + } + else + { /* block id: 855 */ + int32_t **l_1277[5] = {&l_1241[7],&l_1241[7],&l_1241[7],&l_1241[7],&l_1241[7]}; + uint16_t *l_1283 = &g_1048; + uint32_t *l_1299 = &g_647[0][2].f4.f4; + const int32_t **l_1302 = &g_286[9]; + int i; + l_1240 = &p_20; + p_19.f3.f1 &= (func_33(l_1266.f4.f5, l_1278, &g_543, g_38.f4.f9) , p_19.f4.f1); + (*l_1239) |= (g_53.f3 &= (safe_sub_func_int8_t_s_s(((safe_add_func_int16_t_s_s(g_1211, ((*g_171) , ((*l_1283) = g_649.f3.f9)))) , 0xD8L), (p_19.f3.f8 != ((safe_sub_func_uint16_t_u_u((safe_rshift_func_uint16_t_u_u((safe_lshift_func_int8_t_s_u((safe_add_func_uint8_t_u_u(l_758.f3.f2, (((safe_rshift_func_uint8_t_u_u(l_1296[1][1][1], 7)) & ((safe_rshift_func_uint8_t_u_u(((--(*l_1299)) <= p_19.f4.f5), 0)) || l_1296[1][1][0])) ^ 0x4B48L))), p_19.f3.f1)), 7)), (-3L))) >= p_19.f4.f2))))); + (*l_1302) = &g_287; + } + (*l_1303) = &l_1207[5][0]; + if (l_1304) + { /* block id: 865 */ + (*l_1240) = l_1148; + (*g_355) = (*g_355); + } + else + { /* block id: 868 */ + l_1305--; + } + } + g_1074[0][0][2] = &l_739; + } + l_1310 = &g_349; + } + else + { /* block id: 875 */ + int32_t **l_1311 = &l_1310; + (*l_1311) = (void*)0; + p_19.f3.f1 = p_19.f3.f4; + (*l_1311) = &g_60; + } + } + for (g_649.f4.f1 = (-9); (g_649.f4.f1 > 12); ++g_649.f4.f1) + { /* block id: 883 */ + int32_t *l_1315 = (void*)0; + int32_t **l_1314 = &l_1315; + (*l_1314) = &g_349; + } + for (g_455 = 0; (g_455 <= 1); g_455 += 1) + { /* block id: 888 */ + struct S1 l_1325 = {0x07L,4294967295UL,5208,{-2L,-1L,2L,0x2A5A2472L,0UL,0UL,2UL,0x4EL,8479,-1L},{0L,0x30263B2FL,0x4700AD23L,1L,4294967287UL,65528UL,4294967295UL,0x5AL,38245,0x4C90L},255UL}; + int8_t **l_1362[7][3][5] = {{{&l_682,&g_759[7][3][0],(void*)0,&g_759[7][3][0],&g_759[7][3][0]},{&g_759[9][4][0],&g_759[6][0][1],&g_759[2][1][1],&l_682,&g_759[6][0][1]},{&g_759[7][3][0],&l_682,&g_759[7][3][0],&l_682,&l_682}},{{&g_759[2][1][1],&g_759[3][0][1],&l_682,&g_759[9][4][0],&g_759[9][4][0]},{&g_759[7][3][0],&g_759[7][3][0],&g_759[7][3][0],(void*)0,&g_759[7][3][0]},{&l_682,&g_759[2][1][1],&g_759[9][4][0],&g_759[3][0][1],&g_759[2][1][1]}},{{&l_682,&g_759[7][3][0],(void*)0,&g_759[7][3][0],&g_759[7][3][0]},{&g_759[9][4][0],&l_682,&g_759[3][0][1],&l_682,&l_682},{(void*)0,&l_682,&g_759[7][3][0],&g_759[7][3][0],&l_682}},{{&g_759[3][0][1],&g_759[9][4][0],&l_682,&g_759[6][0][1],&g_759[9][4][0]},{&g_759[7][3][0],(void*)0,&g_759[7][3][0],&l_682,(void*)0},{&l_682,&g_759[3][0][1],&g_759[6][0][1],&g_759[3][0][1],&g_759[3][0][1]}},{{&g_759[7][3][0],&g_759[7][3][0],&l_682,&g_759[7][3][0],&g_759[7][3][0]},{&g_759[6][0][1],&l_682,&g_759[9][4][0],&g_759[2][1][1],&l_682},{&l_682,&g_759[7][3][0],&g_759[7][3][0],&g_759[7][3][0],&g_759[7][3][0]}},{{&g_759[3][0][1],&g_759[6][0][1],&g_759[2][1][1],&g_759[6][0][1],&g_759[6][0][1]},{&g_759[7][3][0],&l_682,&g_759[7][3][0],&l_682,&l_682},{&g_759[2][1][1],&g_759[3][0][1],&l_682,&g_759[9][4][0],&g_759[3][0][1]}},{{&g_759[7][3][0],&g_759[7][3][0],&l_682,(void*)0,&g_759[7][3][0]},{&g_759[6][0][1],&g_759[2][1][1],&g_759[9][4][0],&g_759[3][0][1],&g_759[2][1][1]},{&l_682,&g_759[7][3][0],(void*)0,&g_759[7][3][0],&g_759[7][3][0]}}}; + int8_t ***l_1361[7] = {&l_1362[6][0][3],&l_1362[6][0][3],&l_1362[6][0][3],&l_1362[6][0][3],&l_1362[2][0][0],&l_1362[2][0][0],&l_1362[2][0][0]}; + union U4 l_1409 = {0x11131204L}; + uint16_t l_1432 = 0xB3EEL; + int i, j, k; + if ((safe_lshift_func_int16_t_s_s(p_19.f3.f5, 15))) + { /* block id: 889 */ + uint32_t l_1320 = 0x76C312A9L; + int8_t *l_1348 = &g_161; + uint16_t *l_1349 = (void*)0; + uint16_t *l_1350 = (void*)0; + uint16_t *l_1351 = (void*)0; + uint16_t *l_1352[1][2]; + int i, j; + for (i = 0; i < 1; i++) + { + for (j = 0; j < 2; j++) + l_1352[i][j] = (void*)0; + } + for (p_19.f5 = 0; (p_19.f5 <= 1); p_19.f5 += 1) + { /* block id: 892 */ + int32_t *l_1318 = &g_123.f3; + int32_t *l_1319[10]; + int i; + for (i = 0; i < 10; i++) + l_1319[i] = &g_123.f3; + l_1320++; + if ((safe_rshift_func_uint16_t_u_u(65532UL, g_543))) + { /* block id: 894 */ + g_38.f3.f1 |= ((*l_1318) ^= ((((p_19 , (l_1325 , g_1326[0])) , (safe_sub_func_int32_t_s_s(p_19.f4.f4, (safe_lshift_func_uint8_t_u_s((((p_19.f2 > p_19.f5) >= (((*g_171) |= (safe_mul_func_uint16_t_u_u((p_19.f3.f7 , g_916[0]), (safe_mod_func_int32_t_s_s((((void*)0 == (*g_472)) == (*g_915)), g_647[0][2].f3.f0))))) >= l_1320)) == (-3L)), l_758.f3.f2))))) == p_19.f3.f0) , p_19.f4.f9)); + } + else + { /* block id: 898 */ + int32_t **l_1336[8]; + const struct S2 ***l_1337 = (void*)0; + const struct S2 **l_1339 = &g_1074[1][0][1]; + const struct S2 ***l_1338 = &l_1339; + int i; + for (i = 0; i < 8; i++) + l_1336[i] = &g_1335; + if (l_1320) + break; + g_286[9] = g_1335; + for (g_325 = 0; (g_325 <= 1); g_325 += 1) + { /* block id: 903 */ + (*g_1335) = l_1320; + (*g_1335) &= 1L; + } + (*l_1338) = &g_1074[1][1][2]; + } + return p_19.f4.f1; + } + (*g_1335) = (safe_mul_func_uint16_t_u_u(((-10L) >= (safe_div_func_uint32_t_u_u((safe_div_func_uint16_t_u_u(l_1320, l_1325.f4.f5)), (safe_add_func_int16_t_s_s(0x16C4L, (l_1325.f4.f1 = g_58[2][2])))))), 5UL)); + } + else + { /* block id: 913 */ + (*g_1335) &= l_758.f4.f6; + } + for (g_325 = 0; (g_325 <= 1); g_325 += 1) + { /* block id: 918 */ + uint8_t ** const ***l_1358 = &g_1357; + const union U3 l_1370 = {0}; + struct S2 l_1371 = {1,14,1414,-4}; + int8_t *l_1372 = &l_758.f3.f0; + union U3 **l_1425 = &l_930; + if ((0L <= (((*l_1358) = ((safe_div_func_uint32_t_u_u(0x7B6C844AL, (*g_1335))) , g_1357)) != ((safe_sub_func_uint16_t_u_u((((void*)0 == l_1361[6]) >= l_1325.f4.f9), (safe_mod_func_uint16_t_u_u(0x6EDDL, p_20)))) , (void*)0)))) + { /* block id: 920 */ + int8_t *l_1367 = &g_38.f0; + uint8_t l_1379 = 255UL; + int32_t l_1399 = 0xA4663E91L; + uint16_t l_1400[4][10] = {{0UL,0xAF0DL,65535UL,65535UL,65535UL,1UL,0UL,0xAF0DL,1UL,0xAF0DL},{0x0095L,65535UL,0UL,0x0095L,0x0095L,65535UL,0xAF0DL,65535UL,65535UL,65535UL},{0xAF0DL,0UL,0xAF0DL,0xAF0DL,0xAF0DL,0x0095L,1UL,0UL,0x0095L,0UL},{65535UL,0xAF0DL,1UL,65535UL,65535UL,0xAF0DL,0UL,0xAF0DL,0xAF0DL,0xAF0DL}}; + uint8_t l_1420 = 0xFDL; + union U3 **l_1431 = &l_930; + int i, j; + if (((p_19.f4 , (safe_rshift_func_int16_t_s_s(l_1325.f4.f3, p_19.f3.f9))) >= ((~(safe_mul_func_int8_t_s_s(p_19.f0, 0xE9L))) != (*g_915)))) + { /* block id: 922 */ + int32_t *l_1373 = &g_649.f3.f1; + int32_t *l_1374 = &l_692; + int32_t *l_1375 = (void*)0; + int32_t *l_1376 = &g_123.f3; + int32_t *l_1377 = &g_649.f4.f1; + int32_t *l_1378[3][3][9] = {{{&l_997,&g_261.f1,&g_261.f1,(void*)0,(void*)0,&l_997,&g_261.f1,(void*)0,&l_997},{&l_716.f1,&l_758.f3.f1,&l_758.f3.f1,&l_999,(void*)0,&l_716.f1,&l_758.f3.f1,&l_999,&l_716.f1},{(void*)0,(void*)0,&l_997,&l_997,(void*)0,&l_997,(void*)0,&l_997,&g_60}},{{(void*)0,&l_716.f1,&l_716.f1,(void*)0,&l_1325.f4.f1,(void*)0,&l_716.f1,(void*)0,&g_38.f3.f1},{(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,&g_60,&g_60,&g_261.f1},{&l_1325.f4.f1,(void*)0,(void*)0,&g_38.f4.f1,&l_999,&g_38.f4.f1,&g_38.f3.f1,&g_38.f3.f1,&l_758.f3.f1}},{{(void*)0,(void*)0,(void*)0,&g_261.f1,&l_997,(void*)0,(void*)0,&g_261.f1,(void*)0},{&l_999,&l_1325.f4.f1,&l_1325.f4.f1,&l_758.f3.f1,(void*)0,&l_999,&l_1325.f4.f1,&l_758.f3.f1,&l_716.f1},{&l_997,&l_997,(void*)0,(void*)0,(void*)0,(void*)0,&l_997,(void*)0,(void*)0}}}; + int i, j, k; + --l_1379; + } + else + { /* block id: 924 */ + int32_t l_1382 = (-1L); + int32_t *l_1383 = &l_758.f3.f1; + int32_t *l_1384 = &g_38.f4.f1; + int32_t *l_1385 = &l_693; + int32_t *l_1386 = (void*)0; + int32_t *l_1387 = (void*)0; + int32_t *l_1388 = (void*)0; + int32_t *l_1389 = &l_758.f4.f1; + int32_t *l_1390 = &g_647[0][2].f4.f1; + int32_t *l_1391 = &l_716.f1; + int32_t *l_1392 = &g_337; + int32_t *l_1393 = (void*)0; + int32_t *l_1394 = &g_542; + int32_t *l_1395 = &g_337; + int32_t *l_1396 = &l_758.f4.f1; + int32_t *l_1397 = &g_337; + int32_t *l_1398[1]; + uint16_t *l_1406 = &l_1325.f4.f5; + int i; + for (i = 0; i < 1; i++) + l_1398[i] = &g_38.f4.f1; + (*g_1335) = l_1382; + if (p_19.f1) + break; + ++l_1400[3][5]; + if ((9UL || (safe_unary_minus_func_uint16_t_u(((*l_1406) = 0UL))))) + { /* block id: 929 */ + uint32_t l_1426[9][8][3] = {{{4294967295UL,4294967295UL,0x4BB5D0D3L},{0x9C29707CL,0x4BB5D0D3L,0x9C29707CL},{0x9C29707CL,0xD94D2CD1L,0xD94D2CD1L},{4294967295UL,0x4BB5D0D3L,0xD94D2CD1L},{0xB06D31A0L,4294967295UL,0x9C29707CL},{4294967295UL,0xD94D2CD1L,0x4BB5D0D3L},{0x9C29707CL,0x9C29707CL,0x9C29707CL},{0x9C29707CL,0x4BB5D0D3L,0xD94D2CD1L}},{{4294967295UL,0x9C29707CL,0xD94D2CD1L},{0xB06D31A0L,0xD94D2CD1L,0x9C29707CL},{4294967295UL,0xD94D2CD1L,0x4BB5D0D3L},{0x9C29707CL,0x9C29707CL,0x9C29707CL},{0xB06D31A0L,0x4BB5D0D3L,0xD94D2CD1L},{0xD94D2CD1L,0x9C29707CL,0xD94D2CD1L},{4294967295UL,0xD94D2CD1L,0x9C29707CL},{0xD94D2CD1L,0xD94D2CD1L,0x4BB5D0D3L}},{{0xB06D31A0L,0x9C29707CL,0x9C29707CL},{0xB06D31A0L,0x4BB5D0D3L,0xD94D2CD1L},{0xD94D2CD1L,0x9C29707CL,0x4BB5D0D3L},{4294967295UL,0xD94D2CD1L,0xB06D31A0L},{0xD94D2CD1L,0xD94D2CD1L,0x9C29707CL},{0xB06D31A0L,0x9C29707CL,0xB06D31A0L},{0xB06D31A0L,0x4BB5D0D3L,0x4BB5D0D3L},{0xD94D2CD1L,0x9C29707CL,0x4BB5D0D3L}},{{4294967295UL,0xD94D2CD1L,0xB06D31A0L},{0xD94D2CD1L,0xD94D2CD1L,0x9C29707CL},{0xB06D31A0L,0xB06D31A0L,0xB06D31A0L},{0xB06D31A0L,0x9C29707CL,0x4BB5D0D3L},{0xD94D2CD1L,0xB06D31A0L,0x4BB5D0D3L},{4294967295UL,0x4BB5D0D3L,0xB06D31A0L},{0xD94D2CD1L,0x4BB5D0D3L,0x9C29707CL},{0xB06D31A0L,0xB06D31A0L,0xB06D31A0L}},{{0xB06D31A0L,0x9C29707CL,0x4BB5D0D3L},{0xD94D2CD1L,0xB06D31A0L,0x4BB5D0D3L},{0xD94D2CD1L,0x4BB5D0D3L,0xB06D31A0L},{0x4BB5D0D3L,0x4BB5D0D3L,0x9C29707CL},{4294967295UL,0xB06D31A0L,0xB06D31A0L},{4294967295UL,0x9C29707CL,0x4BB5D0D3L},{0x4BB5D0D3L,0xB06D31A0L,0x4BB5D0D3L},{0xD94D2CD1L,0x4BB5D0D3L,0xB06D31A0L}},{{0x4BB5D0D3L,0x4BB5D0D3L,0x9C29707CL},{4294967295UL,0xB06D31A0L,0xB06D31A0L},{4294967295UL,0x9C29707CL,0x9C29707CL},{0x4BB5D0D3L,0xB06D31A0L,0x9C29707CL},{0xD94D2CD1L,0x4BB5D0D3L,4294967295UL},{0x4BB5D0D3L,0x4BB5D0D3L,0xB06D31A0L},{4294967295UL,0xB06D31A0L,4294967295UL},{4294967295UL,0x9C29707CL,0x9C29707CL}},{{0x4BB5D0D3L,0xB06D31A0L,0x9C29707CL},{0xD94D2CD1L,0x4BB5D0D3L,4294967295UL},{0x4BB5D0D3L,0x4BB5D0D3L,0xB06D31A0L},{4294967295UL,4294967295UL,4294967295UL},{4294967295UL,0xB06D31A0L,0x9C29707CL},{0x4BB5D0D3L,4294967295UL,0x9C29707CL},{0xD94D2CD1L,0x9C29707CL,4294967295UL},{0x4BB5D0D3L,0x9C29707CL,0xB06D31A0L}},{{4294967295UL,4294967295UL,4294967295UL},{4294967295UL,0xB06D31A0L,0x9C29707CL},{0x4BB5D0D3L,4294967295UL,0x9C29707CL},{0xD94D2CD1L,0x9C29707CL,4294967295UL},{0x9C29707CL,0x9C29707CL,0xB06D31A0L},{0xD94D2CD1L,4294967295UL,4294967295UL},{0xD94D2CD1L,0xB06D31A0L,0x9C29707CL},{0x9C29707CL,4294967295UL,0x9C29707CL}},{{0x4BB5D0D3L,0x9C29707CL,4294967295UL},{0x9C29707CL,0x9C29707CL,0xB06D31A0L},{0xD94D2CD1L,4294967295UL,4294967295UL},{0xD94D2CD1L,0xB06D31A0L,0x9C29707CL},{0x9C29707CL,4294967295UL,0x9C29707CL},{0x4BB5D0D3L,0x9C29707CL,0xD94D2CD1L},{0x9C29707CL,0x9C29707CL,4294967295UL},{0xD94D2CD1L,4294967295UL,0xD94D2CD1L}}}; + int i, j, k; + (*g_1335) |= ((safe_lshift_func_uint16_t_u_u(1UL, 0)) | (252UL || ((((l_1409 , (((safe_add_func_uint8_t_u_u(((0x32L > (((g_533.f4.f9 > (p_19.f3.f8 | (safe_lshift_func_uint16_t_u_s(0x5B8DL, (p_19.f4.f6 < 0x7DACD0DBL))))) , g_1003) < 1UL)) <= p_19.f3.f5), (*l_1391))) , (*l_1391)) == g_916[0])) && p_19.f3.f1) ^ g_533.f3.f3) , p_19.f4.f8))); + (*l_1395) = (((safe_rshift_func_uint16_t_u_s(((*l_1406) = (safe_mul_func_int8_t_s_s(((l_1400[3][5] < (-1L)) > ((*g_171) = (((+(safe_lshift_func_int16_t_s_s((l_1420 = ((void*)0 == &g_473)), 14))) >= (safe_rshift_func_int8_t_s_u((safe_lshift_func_int8_t_s_u(((p_19.f3.f9 >= ((void*)0 == l_1425)) & ((p_19.f4.f3 & 0x5AA9156EL) > l_1426[3][1][2])), 1)), (*g_171)))) , 0x2DL))), 4UL))), g_445[0][0][2])) , &g_1209) != &g_84); + } + else + { /* block id: 935 */ + uint32_t l_1435[4]; + struct S1 **l_1439 = &l_1438; + int i; + for (i = 0; i < 4; i++) + l_1435[i] = 1UL; + (*g_1335) = ((l_1371.f2 = (((g_649.f4.f9 && (safe_lshift_func_uint8_t_u_u((~((l_1431 = g_1429) != (void*)0)), 0))) , (l_1432 && ((*l_682) = (&p_19 == ((l_739.f1 && p_19.f2) , &l_758))))) == (safe_sub_func_int16_t_s_s(((((*l_1383) = 0xA56CF2CBL) == 0xD49EB02FL) , (-5L)), 0x23A2L)))) >= 0x05L); + l_1435[0]--; + (*l_1439) = l_1438; + } + } + } + else + { /* block id: 945 */ + return l_1325.f4.f5; + } + } + } + return l_716.f5; +} + + +/* ------------------------------------------ */ +/* + * reads : g_355 g_356 g_122 g_53 g_123 g_60 g_472 g_116 g_445 g_483 g_161 g_261 g_192 g_17 g_53.f1 g_171 g_38.f3.f7 g_349 g_409 g_38.f4.f9 g_38.f3.f4 g_530 g_123.f3 g_10 g_566 g_533.f3.f6 g_38.f4.f1 g_38.f3.f3 g_533.f3.f2 g_533.f5 g_38.f3.f9 g_542 g_331 g_38.f4.f0 + * writes: g_38.f4.f5 g_60 g_337 g_38.f4.f0 g_153 g_472 g_116 g_192 g_483 g_161 g_349 g_261.f1 g_261.f4 g_38.f5 g_123.f3 g_10 g_542 g_331 g_38.f4.f1 g_286 g_145 g_261.f5 + */ +static struct S1 func_21(int32_t p_22, const int16_t p_23, uint16_t p_24) +{ /* block id: 382 */ + uint32_t l_535[2][8][5] = {{{0x138D0E76L,0x2C1E8844L,0xB970581EL,0xB970581EL,0xD8D52754L},{4294967295UL,0x138D0E76L,0x688BD7B9L,1UL,0xF3548984L},{3UL,4294967292UL,0xF3548984L,0x1A3AF077L,4294967295UL},{4294967286UL,0x0F6E1B43L,0x0F6E1B43L,0x9F444DF5L,1UL},{4294967291UL,0x138D0E76L,4294967295UL,1UL,0x1A3AF077L},{0x67F50868L,4294967295UL,1UL,4294967295UL,0x0F6E1B43L},{0xABEC7593L,1UL,0xB970581EL,4294967295UL,1UL},{4294967291UL,4294967286UL,0x138D0E76L,0x138D0E76L,0xF3548984L}},{{0xD8D52754L,4294967291UL,1UL,0x08E3A866L,4294967289UL},{0x524DE3EEL,0x67F50868L,4294967289UL,0x2C1E8844L,1UL},{4294967295UL,0xABEC7593L,0xABEC7593L,1UL,4294967292UL},{0x688BD7B9L,4294967291UL,7UL,0x27CF7B8FL,0x2C1E8844L},{4294967291UL,0xD8D52754L,0x9F444DF5L,0xD8D52754L,0xABEC7593L},{4294967292UL,4294967295UL,0x138D0E76L,1UL,0x08E3A866L},{0x688BD7B9L,4294967295UL,4294967291UL,4294967291UL,4294967289UL},{0xF3548984L,0x688BD7B9L,0x9F444DF5L,0x13E5E833L,4294967295UL}}}; + int32_t *l_538[3]; + int32_t l_539 = 0xE1FA355EL; + int16_t l_540 = (-1L); + int16_t l_541 = 0x68BAL; + uint32_t l_544 = 0x97ABB548L; + uint16_t *l_549 = &g_38.f4.f5; + int8_t *l_550 = &g_161; + const union U3 l_553 = {0}; + const struct S2 *l_555 = &g_17; + const struct S2 **l_554 = &l_555; + uint32_t l_556 = 0x4E9A72CCL; + uint8_t l_559[5]; + union U4 l_561 = {0xAADE27DFL}; + struct S0 l_586[10][1][9] = {{{{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL},{0x4BL,1L,-1L,-1L,0x786B0F65L,0x78DFL,4294967295UL,248UL,16939,0L},{0xFEL,0x0BFA526BL,-8L,1L,0x3894B361L,2UL,0x087212DFL,0x6BL,3272,0x8E37L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0L,0x1C548EF4L,0x63D3046DL,0x32D395BFL,0x497E50DFL,0x6DE9L,4294967287UL,1UL,32538,0xA0D0L}}},{{{0xB2L,-6L,0x596AE4D3L,0xB60EA2C0L,0x4240F8DEL,65527UL,0x1C58568BL,0xA6L,25025,0x9C95L},{0xFBL,0x1178E9E6L,0x1E1EF8C0L,5L,0xD898B59BL,0x2D50L,0x948699B4L,0x57L,36453,0xF7B0L},{0x4DL,0xAC8A0B1FL,1L,0x3EB669A9L,0xF6A65A4FL,5UL,1UL,0x09L,30655,0x0778L},{0xE9L,1L,0xF218C628L,1L,4294967286UL,0x2B8AL,0x2D65247EL,3UL,45823,-2L},{1L,-1L,-1L,0xCF58B35EL,0xB9E44CDBL,7UL,2UL,0x79L,15233,-1L},{1L,0L,1L,0xE853B4DFL,0x5152E0C5L,0xF1A3L,4UL,0x23L,9215,0x9EA2L},{1L,-1L,-1L,0xCF58B35EL,0xB9E44CDBL,7UL,2UL,0x79L,15233,-1L},{0xF3L,2L,-3L,2L,4294967287UL,0x1045L,0UL,0xC5L,38900,0x7159L},{1L,-1L,-1L,0xCF58B35EL,0xB9E44CDBL,7UL,2UL,0x79L,15233,-1L}}},{{{0L,0x1C548EF4L,0x63D3046DL,0x32D395BFL,0x497E50DFL,0x6DE9L,4294967287UL,1UL,32538,0xA0D0L},{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0xFEL,0x0BFA526BL,-8L,1L,0x3894B361L,2UL,0x087212DFL,0x6BL,3272,0x8E37L},{0x4FL,-2L,0xB2C9FCE8L,-3L,0xC8E50863L,0xA6C6L,0x6A2A7A2EL,6UL,6105,1L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0xFEL,0x0BFA526BL,-8L,1L,0x3894B361L,2UL,0x087212DFL,0x6BL,3272,0x8E37L},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL}}},{{{0x20L,0L,0x63A82AA4L,-1L,0x4649D3F3L,1UL,0x40EAAE73L,249UL,774,0x3A93L},{9L,0xC452084CL,0x59266262L,-1L,0x29FD75BCL,1UL,0xF5147CA6L,8UL,21574,0L},{0xB2L,-6L,0x596AE4D3L,0xB60EA2C0L,0x4240F8DEL,65527UL,0x1C58568BL,0xA6L,25025,0x9C95L},{0xE9L,1L,0xF218C628L,1L,4294967286UL,0x2B8AL,0x2D65247EL,3UL,45823,-2L},{0xB2L,-6L,0x596AE4D3L,0xB60EA2C0L,0x4240F8DEL,65527UL,0x1C58568BL,0xA6L,25025,0x9C95L},{1L,-1L,0x03351643L,0x8B9FFD1CL,4294967293UL,0x2B43L,0x19E5B642L,0UL,34982,0x98ECL},{1L,0x82D348C4L,-4L,0x43578E83L,0UL,0x3ECEL,4294967295UL,255UL,26684,0x5F8CL},{0L,0x46D5632EL,0xE85D8307L,0L,0x7400BFC1L,0UL,0x2FB38577L,0UL,24281,0x9D81L},{0x20L,0L,0x63A82AA4L,-1L,0x4649D3F3L,1UL,0x40EAAE73L,249UL,774,0x3A93L}}},{{{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL},{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0xFEL,0x0BFA526BL,-8L,1L,0x3894B361L,2UL,0x087212DFL,0x6BL,3272,0x8E37L},{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0L,0x1C548EF4L,0x63D3046DL,0x32D395BFL,0x497E50DFL,0x6DE9L,4294967287UL,1UL,32538,0xA0D0L},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL}}},{{{0x52L,-1L,0xFF7E7FFCL,-1L,0xBEAF8D3DL,9UL,4294967289UL,4UL,23323,0x5593L},{0xFBL,0x1178E9E6L,0x1E1EF8C0L,5L,0xD898B59BL,0x2D50L,0x948699B4L,0x57L,36453,0xF7B0L},{1L,0x91C5A802L,6L,0x1495CED4L,0UL,65535UL,0x13E85E88L,255UL,26219,-10L},{1L,0L,1L,0xE853B4DFL,0x5152E0C5L,0xF1A3L,4UL,0x23L,9215,0x9EA2L},{0x52L,-1L,0xFF7E7FFCL,-1L,0xBEAF8D3DL,9UL,4294967289UL,4UL,23323,0x5593L},{0xE9L,1L,0xF218C628L,1L,4294967286UL,0x2B8AL,0x2D65247EL,3UL,45823,-2L},{1L,0x82D348C4L,-4L,0x43578E83L,0UL,0x3ECEL,4294967295UL,255UL,26684,0x5F8CL},{0xFBL,0x1178E9E6L,0x1E1EF8C0L,5L,0xD898B59BL,0x2D50L,0x948699B4L,0x57L,36453,0xF7B0L},{0x4DL,0xAC8A0B1FL,1L,0x3EB669A9L,0xF6A65A4FL,5UL,1UL,0x09L,30655,0x0778L}}},{{{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL},{0x4BL,1L,-1L,-1L,0x786B0F65L,0x78DFL,4294967295UL,248UL,16939,0L},{0xFEL,0x0BFA526BL,-8L,1L,0x3894B361L,2UL,0x087212DFL,0x6BL,3272,0x8E37L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L}}},{{{1L,0x91C5A802L,6L,0x1495CED4L,0UL,65535UL,0x13E85E88L,255UL,26219,-10L},{0L,0x46D5632EL,0xE85D8307L,0L,0x7400BFC1L,0UL,0x2FB38577L,0UL,24281,0x9D81L},{0x52L,-1L,0xFF7E7FFCL,-1L,0xBEAF8D3DL,9UL,4294967289UL,4UL,23323,0x5593L},{0xF3L,2L,-3L,2L,4294967287UL,0x1045L,0UL,0xC5L,38900,0x7159L},{0xB2L,-6L,0x596AE4D3L,0xB60EA2C0L,0x4240F8DEL,65527UL,0x1C58568BL,0xA6L,25025,0x9C95L},{0xFBL,0x1178E9E6L,0x1E1EF8C0L,5L,0xD898B59BL,0x2D50L,0x948699B4L,0x57L,36453,0xF7B0L},{1L,-1L,-1L,0xCF58B35EL,0xB9E44CDBL,7UL,2UL,0x79L,15233,-1L},{9L,0xC452084CL,0x59266262L,-1L,0x29FD75BCL,1UL,0xF5147CA6L,8UL,21574,0L},{0xB2L,-6L,0x596AE4D3L,0xB60EA2C0L,0x4240F8DEL,65527UL,0x1C58568BL,0xA6L,25025,0x9C95L}}},{{{0x0EL,0xFF548897L,1L,6L,0x306758FAL,8UL,4294967286UL,8UL,44897,-1L},{0xFEL,0x0BFA526BL,-8L,1L,0x3894B361L,2UL,0x087212DFL,0x6BL,3272,0x8E37L},{0x4BL,1L,-1L,-1L,0x786B0F65L,0x78DFL,4294967295UL,248UL,16939,0L},{0x4FL,-2L,0xB2C9FCE8L,-3L,0xC8E50863L,0xA6C6L,0x6A2A7A2EL,6UL,6105,1L},{0x4FL,-2L,0xB2C9FCE8L,-3L,0xC8E50863L,0xA6C6L,0x6A2A7A2EL,6UL,6105,1L},{0L,0x1C548EF4L,0x63D3046DL,0x32D395BFL,0x497E50DFL,0x6DE9L,4294967287UL,1UL,32538,0xA0D0L},{0x4FL,-2L,0xB2C9FCE8L,-3L,0xC8E50863L,0xA6C6L,0x6A2A7A2EL,6UL,6105,1L},{0xBDL,-9L,0x725E32BDL,0xD5EE398FL,1UL,0x0B2FL,0x76880E89L,3UL,26335,4L},{0xCCL,0x3FDD2CD8L,0L,0x9158A8A8L,7UL,8UL,0UL,0x3AL,24382,0xC4AAL}}},{{{0x52L,-1L,0xFF7E7FFCL,-1L,0xBEAF8D3DL,9UL,4294967289UL,4UL,23323,0x5593L},{0xF3L,2L,-3L,2L,4294967287UL,0x1045L,0UL,0xC5L,38900,0x7159L},{1L,0x82D348C4L,-4L,0x43578E83L,0UL,0x3ECEL,4294967295UL,255UL,26684,0x5F8CL},{0xFBL,0x1178E9E6L,0x1E1EF8C0L,5L,0xD898B59BL,0x2D50L,0x948699B4L,0x57L,36453,0xF7B0L},{1L,-1L,-1L,0xCF58B35EL,0xB9E44CDBL,7UL,2UL,0x79L,15233,-1L},{0xFBL,0x1178E9E6L,0x1E1EF8C0L,5L,0xD898B59BL,0x2D50L,0x948699B4L,0x57L,36453,0xF7B0L},{0xB2L,-6L,0x596AE4D3L,0xB60EA2C0L,0x4240F8DEL,65527UL,0x1C58568BL,0xA6L,25025,0x9C95L},{0xFBL,0x1178E9E6L,0x1E1EF8C0L,5L,0xD898B59BL,0x2D50L,0x948699B4L,0x57L,36453,0xF7B0L},{1L,0x91C5A802L,6L,0x1495CED4L,0UL,65535UL,0x13E85E88L,255UL,26219,-10L}}}}; + uint16_t l_644 = 8UL; + struct S1 l_650 = {-1L,4UL,1951,{0x86L,3L,2L,0x3EA43885L,0xF90FF822L,0xC85DL,0x8D17FC8FL,0x2AL,16340,0xDE14L},{0L,0x07D939B3L,0x85A753C2L,-1L,0x230FAFD0L,0xA0B4L,4294967295UL,0xA5L,12714,0xC07CL},0x53L}; + int i, j, k; + for (i = 0; i < 3; i++) + l_538[i] = &g_60; + for (i = 0; i < 5; i++) + l_559[i] = 0x65L; +lbl_638: + ++l_535[0][4][3]; + ++l_544; + l_556 ^= (((void*)0 == (*g_355)) <= (((*l_549) = (safe_lshift_func_uint16_t_u_u(0x8C33L, 12))) != (p_24 <= ((((((*g_122) , func_25(l_550)) || (p_24 , (safe_sub_func_int16_t_s_s(func_25(func_27(l_553, l_553, &g_161, &g_161, p_23)), p_22)))) , l_554) == &l_555) ^ (*g_171))))); + for (g_349 = 4; (g_349 > (-23)); g_349 = safe_sub_func_int32_t_s_s(g_349, 2)) + { /* block id: 389 */ + uint16_t l_577 = 0x21D2L; + int32_t l_579 = 0xB0984251L; + struct S0 ***l_607 = &g_355; + struct S1 l_620 = {0L,4294967287UL,4645,{0L,1L,-1L,-7L,0x3AB0026DL,5UL,5UL,0xF5L,46157,0x4C10L},{1L,-1L,-1L,0x9A2814EBL,0xA14D5F68L,1UL,0x4B6C206AL,0x46L,26688,5L},9UL}; + int32_t l_637 = 0x8F2E2D64L; + int32_t l_640[4][9] = {{0xFC87C297L,0x5D467A11L,0x5D467A11L,0x5D467A11L,0xFC87C297L,0xC8C3BA64L,0xFC87C297L,0xFC87C297L,0xFC87C297L},{0x8BDCE455L,0xF3097EF8L,8L,0x2B4347D6L,5L,8L,8L,0x2B4347D6L,0xF3097EF8L},{0xC8C3BA64L,0xFC87C297L,0x5D467A11L,0xC8C3BA64L,0x5D467A11L,0x34852B32L,(-4L),0xFC87C297L,0x34852B32L},{5L,5L,5L,0x2B4347D6L,8L,0x8BDCE455L,0x2B4347D6L,0x8BDCE455L,0xF3097EF8L}}; + struct S1 *l_646 = &g_647[0][2]; + int i, j; + if (l_559[4]) + { /* block id: 390 */ + struct S0 l_560 = {0x82L,0xDA7DB119L,3L,-1L,0x00E3B26DL,0x2564L,0x562F77B0L,0x0FL,2648,0L}; + g_542 = (l_560 , 0x2A272170L); + } + else + { /* block id: 392 */ + const int16_t l_582[3] = {(-7L),(-7L),(-7L)}; + const int8_t *l_589 = &g_382; + const int8_t **l_588[6][9][3] = {{{(void*)0,&l_589,&l_589},{(void*)0,(void*)0,(void*)0},{&l_589,&l_589,&l_589},{&l_589,(void*)0,&l_589},{&l_589,&l_589,&l_589},{(void*)0,(void*)0,(void*)0},{&l_589,&l_589,&l_589},{&l_589,(void*)0,&l_589},{&l_589,&l_589,&l_589}},{{(void*)0,&l_589,(void*)0},{&l_589,(void*)0,&l_589},{(void*)0,(void*)0,&l_589},{&l_589,&l_589,&l_589},{&l_589,&l_589,(void*)0},{&l_589,&l_589,&l_589},{(void*)0,&l_589,&l_589},{&l_589,&l_589,&l_589},{&l_589,(void*)0,&l_589}},{{(void*)0,(void*)0,(void*)0},{&l_589,&l_589,&l_589},{&l_589,&l_589,&l_589},{(void*)0,(void*)0,&l_589},{(void*)0,&l_589,&l_589},{(void*)0,(void*)0,(void*)0},{(void*)0,&l_589,&l_589},{(void*)0,(void*)0,&l_589},{&l_589,&l_589,&l_589}},{{&l_589,(void*)0,(void*)0},{(void*)0,&l_589,&l_589},{&l_589,(void*)0,(void*)0},{&l_589,&l_589,&l_589},{(void*)0,(void*)0,&l_589},{&l_589,&l_589,&l_589},{&l_589,(void*)0,(void*)0},{&l_589,&l_589,&l_589},{(void*)0,&l_589,(void*)0}},{{&l_589,(void*)0,&l_589},{(void*)0,(void*)0,&l_589},{&l_589,&l_589,&l_589},{&l_589,&l_589,(void*)0},{&l_589,&l_589,(void*)0},{(void*)0,&l_589,&l_589},{&l_589,&l_589,&l_589},{&l_589,(void*)0,&l_589},{(void*)0,(void*)0,&l_589}},{{&l_589,&l_589,&l_589},{&l_589,&l_589,&l_589},{(void*)0,(void*)0,&l_589},{(void*)0,&l_589,(void*)0},{(void*)0,(void*)0,(void*)0},{(void*)0,&l_589,&l_589},{(void*)0,(void*)0,&l_589},{&l_589,&l_589,&l_589},{&l_589,(void*)0,(void*)0}}}; + const int8_t ***l_587 = &l_588[3][7][2]; + int8_t ***l_591 = (void*)0; + struct S0 l_593[5] = {{-1L,-1L,0L,0L,0xACD14E7CL,0x1233L,6UL,4UL,38128,0x51E8L},{-1L,-1L,0L,0L,0xACD14E7CL,0x1233L,6UL,4UL,38128,0x51E8L},{-1L,-1L,0L,0L,0xACD14E7CL,0x1233L,6UL,4UL,38128,0x51E8L},{-1L,-1L,0L,0L,0xACD14E7CL,0x1233L,6UL,4UL,38128,0x51E8L},{-1L,-1L,0L,0L,0xACD14E7CL,0x1233L,6UL,4UL,38128,0x51E8L}}; + struct S2 *l_616 = &g_17; + struct S1 l_651 = {0x47L,1UL,4607,{-8L,0x3CD7FE87L,1L,-1L,4294967295UL,0xE033L,0x169016C7L,0UL,32611,0xF18EL},{0L,0x73311419L,0xFE9F5BF4L,-1L,0x4CF23DCEL,1UL,4294967288UL,250UL,8397,-1L},0x21L}; + int i, j, k; + for (l_556 = 0; (l_556 <= 9); l_556 += 1) + { /* block id: 395 */ + uint8_t ***l_565 = &g_168; + uint8_t **** const l_564 = &l_565; + int32_t l_578[1]; + struct S1 *l_648[6][1][2]; + int i, j, k; + for (i = 0; i < 1; i++) + l_578[i] = 1L; + for (i = 0; i < 6; i++) + { + for (j = 0; j < 1; j++) + { + for (k = 0; k < 2; k++) + l_648[i][j][k] = &g_649; + } + } + if ((((!g_38.f3.f7) != (l_561 , (safe_add_func_int8_t_s_s(p_23, (l_564 == g_566[2]))))) >= (safe_rshift_func_int8_t_s_s((safe_rshift_func_int8_t_s_u((-1L), ((safe_mod_func_uint32_t_u_u(g_349, p_22)) == (safe_lshift_func_uint16_t_u_u(((((l_578[0] &= ((safe_div_func_int8_t_s_s(((*l_550) ^= ((l_577 = g_533.f3.f6) , 0xBBL)), p_22)) >= p_22)) | l_579) >= (*g_171)) & 0x71A2L), g_60))))), 4)))) + { /* block id: 399 */ + int32_t *l_581 = (void*)0; + for (g_331 = 8; (g_331 >= 0); g_331 -= 1) + { /* block id: 402 */ + int32_t l_580 = 4L; + int i; + g_38.f4.f1 ^= l_580; + if (p_24) + break; + g_286[l_556] = l_581; + if (l_582[1]) + continue; + } + } + else + { /* block id: 408 */ + struct S0 l_585 = {-3L,0xDA105169L,1L,0x3EE0BFECL,4294967288UL,0x43F2L,0x05774C36L,0x08L,16541,-7L}; + struct S0 ***l_606[6]; + union U3 l_621 = {0}; + union U3 *l_634 = &l_621; + union U3 **l_633[8] = {&l_634,&l_634,&l_634,&l_634,&l_634,&l_634,&l_634,&l_634}; + union U3 ***l_632 = &l_633[5]; + int i; + for (i = 0; i < 6; i++) + l_606[i] = &g_355; + for (g_10 = 1; (g_10 >= 0); g_10 -= 1) + { /* block id: 411 */ + const int8_t ****l_590 = &l_587; + int8_t ****l_592 = &l_591; + struct S0 ***l_605 = &g_355; + struct S0 ****l_604[1][5][5] = {{{&l_605,&l_605,(void*)0,(void*)0,&l_605},{&l_605,&l_605,&l_605,&l_605,&l_605},{&l_605,&l_605,&l_605,(void*)0,&l_605},{(void*)0,&l_605,&l_605,(void*)0,(void*)0},{&l_605,&l_605,&l_605,&l_605,&l_605}}}; + const int32_t l_610 = (-8L); + int32_t l_615 = (-1L); + int i, j, k; + l_579 &= (safe_mod_func_uint8_t_u_u((((l_585 , (((((*g_122) , l_586[9][0][7]) , (g_145 = l_585.f5)) , ((*l_590) = l_587)) != ((*l_592) = l_591))) <= 1L) >= (l_593[3] , (((((safe_mul_func_uint16_t_u_u((safe_mul_func_uint16_t_u_u((safe_mod_func_int16_t_s_s(0x9751L, 0xB335L)), l_593[3].f6)), 0x1989L)) | l_582[1]) && (-5L)) || (-1L)) , 254UL))), p_24)); + l_593[3].f1 &= (g_261.f1 = (safe_mul_func_int8_t_s_s((safe_sub_func_int8_t_s_s(l_585.f8, (p_23 < ((l_606[0] = &g_355) != l_607)))), p_24))); + g_60 = (g_542 = (safe_div_func_uint32_t_u_u((((***l_607) , ((p_22 && l_593[3].f5) ^ (l_610 > (g_261.f5 = 0x942CL)))) ^ ((+(safe_div_func_uint16_t_u_u(p_23, ((*l_549) = g_38.f3.f4)))) | ((safe_rshift_func_int16_t_s_s(((0x5CF4F6E1L != p_23) , l_585.f6), 8)) != l_579))), g_38.f3.f3))); + l_615 = p_23; + } + l_616 = l_616; + for (g_38.f4.f0 = 1; (g_38.f4.f0 >= 0); g_38.f4.f0 -= 1) + { /* block id: 428 */ + int32_t **l_617 = &l_538[1]; + int16_t *l_635 = (void*)0; + int16_t *l_636[2][8][3] = {{{(void*)0,&g_84,(void*)0},{&g_84,&l_540,&g_145},{(void*)0,&l_540,&l_540},{&l_540,&l_540,&l_540},{&l_540,&g_84,&g_84},{&l_541,&l_541,&l_540},{&g_84,(void*)0,&l_540},{&g_145,&l_540,&g_145}},{{&g_84,&g_145,(void*)0},{&l_541,&l_540,&l_540},{&l_540,&g_145,&g_84},{&l_540,&l_540,&l_541},{(void*)0,(void*)0,&g_84},{&g_84,&l_541,&l_540},{(void*)0,&g_84,(void*)0},{&g_84,&l_540,&g_145}}}; + int i, j, k; + (*l_617) = &g_542; + (**l_617) = (safe_mul_func_int16_t_s_s((((l_620 , l_621) , (safe_mod_func_uint16_t_u_u(p_23, g_409[0][0]))) <= (((safe_lshift_func_int16_t_s_u((l_637 = (safe_mod_func_int8_t_s_s((p_24 && (!((l_578[0] = (safe_div_func_uint8_t_u_u(p_22, (safe_div_func_uint16_t_u_u(((*l_549) = ((((g_533.f3.f2 < p_24) , l_632) == &g_472) != g_533.f5)), 65535UL))))) , p_24))), (*g_171)))), g_38.f3.f9)) < p_24) ^ (**l_617))), p_22)); + if (l_585.f4) + goto lbl_638; + } + l_579 &= l_620.f2; + } + for (g_261.f1 = 0; (g_261.f1 <= 1); g_261.f1 += 1) + { /* block id: 440 */ + int32_t *l_639 = (void*)0; + union U3 *l_642 = &g_388; + union U3 **l_641 = &l_642; + union U3 ***l_643 = &l_641; + struct S1 *l_645 = (void*)0; + g_286[9] = l_639; + l_620.f3.f1 ^= 0x73C69CAAL; + (*l_643) = (l_640[1][6] , l_641); + if (p_24) + { /* block id: 444 */ + l_648[3][0][1] = (l_646 = (l_644 , l_645)); + return l_650; + } + else + { /* block id: 448 */ + if (p_23) + goto lbl_638; + l_578[0] = p_23; + return l_651; + } + } + } + } + } + return l_650; +} + + +/* ------------------------------------------ */ +/* + * reads : g_60 g_337 g_38.f4.f0 g_153 g_472 g_116 g_445 g_483 g_10 g_355 g_356 g_261 g_192 g_17 g_53.f1 g_171 g_38.f3.f7 g_349 g_409 g_38.f4.f9 g_38.f3.f4 g_530 g_161 g_331 g_647.f0 g_38.f0 g_38.f4.f7 g_647.f5 g_382 g_543 g_647.f3.f0 g_649.f4.f0 + * writes: g_60 g_337 g_38.f4.f0 g_153 g_472 g_116 g_192 g_483 g_10 g_349 g_261.f1 g_261.f4 g_38.f5 g_161 g_331 g_647.f0 g_38.f0 g_38.f4.f7 g_647.f5 g_382 g_543 g_647.f3.f0 g_649.f4.f0 + */ +static int32_t func_25(int8_t * p_26) +{ /* block id: 319 */ + union U3 *l_465 = &g_62; + int32_t *l_466 = &g_60; + int32_t l_468 = (-5L); + int16_t l_475 = 1L; + int32_t l_488 = 9L; + int32_t l_518 = 0x52F2CEDAL; + (*l_466) ^= (l_465 == l_465); + (*l_466) = (-1L); + for (g_337 = 3; (g_337 >= 0); g_337 -= 1) + { /* block id: 324 */ + int32_t *l_467[1]; + int32_t **l_469 = (void*)0; + int32_t **l_470 = &l_467[0]; + int8_t ***l_494[2]; + struct S2 * const l_496 = (void*)0; + int i; + for (i = 0; i < 1; i++) + l_467[i] = &g_261.f1; + for (i = 0; i < 2; i++) + l_494[i] = (void*)0; + l_468 &= ((*l_466) & (*l_466)); + (*l_470) = &g_349; + for (g_38.f4.f0 = 0; (g_38.f4.f0 <= 2); g_38.f4.f0 += 1) + { /* block id: 329 */ + int32_t l_471 = 0x1EFA3EBFL; + (*l_466) = (-5L); + if (l_471) + continue; + for (g_153 = 0; (g_153 <= 1); g_153 += 1) + { /* block id: 334 */ + union U3 * const **l_474 = &g_472; + (*l_470) = &g_349; + (*l_474) = g_472; + } + } + for (g_116 = 2; (g_116 >= 0); g_116 -= 1) + { /* block id: 341 */ + int16_t l_476[4][5][2] = {{{0xB52BL,0L},{0L,(-4L)},{0x8068L,0x9CA8L},{0x763FL,0x494DL},{0x204CL,1L}},{{0x911BL,0L},{0x4BD5L,(-9L)},{0x911BL,0xFB04L},{0x9201L,0x911BL},{0x911BL,0x8068L}},{{(-9L),0xA260L},{0x9201L,0x3483L},{0xA260L,(-9L)},{0xA260L,0x494DL},{0x911BL,0x204CL}},{{1L,0x494DL},{0x8068L,0x3483L},{0x8068L,0x4BD5L},{0x494DL,0L},{0x9201L,0x3483L}}}; + int32_t l_481 = 1L; + int32_t l_482 = 0xDECFF41DL; + int16_t l_519 = 0x3750L; + int i, j, k; + for (g_60 = 1; (g_60 >= 0); g_60 -= 1) + { /* block id: 344 */ + int32_t l_512 = 0x137184F0L; + struct S2 l_527 = {8,3,-2222,-10}; + int i, j, k; + if (((+(g_192[g_116] = g_445[g_116][g_60][(g_116 + 1)])) != l_475)) + { /* block id: 346 */ + uint16_t l_477 = 65527UL; + int32_t l_480[10] = {0xDEFA6D99L,0x9C6922C2L,0xDEFA6D99L,0x9C6922C2L,0xDEFA6D99L,0x9C6922C2L,0xDEFA6D99L,0x9C6922C2L,0xDEFA6D99L,0x9C6922C2L}; + int16_t *l_491 = &l_476[1][3][0]; + int i, j, k; + l_477++; + --g_483[1][2]; + if ((safe_rshift_func_int8_t_s_u(((*p_26) = (l_488 && (safe_sub_func_int16_t_s_s((*l_466), ((*l_491) &= (*l_466)))))), 2))) + { /* block id: 351 */ + uint32_t l_495 = 0x87EFFBB7L; + struct S2 *l_498 = &g_17; + struct S2 **l_497[3][10] = {{(void*)0,(void*)0,(void*)0,&l_498,&l_498,&l_498,&l_498,&l_498,&l_498,(void*)0},{(void*)0,&l_498,(void*)0,&l_498,&l_498,&l_498,&l_498,(void*)0,&l_498,(void*)0},{&l_498,&l_498,(void*)0,&l_498,&l_498,&l_498,(void*)0,(void*)0,&l_498,&l_498}}; + struct S2 **l_499 = &l_498; + int i, j; + l_495 &= (l_477 ^ (+((**l_470) = (safe_lshift_func_uint8_t_u_s((l_494[1] == (void*)0), (*p_26)))))); + (*l_499) = ((**g_355) , l_496); + } + else + { /* block id: 355 */ + uint32_t l_500 = 4294967295UL; + ++l_500; + } + g_261.f1 = ((safe_unary_minus_func_uint16_t_u(g_192[g_116])) || (g_17 , (safe_div_func_int16_t_s_s(g_60, ((g_53.f1 && l_481) && ((safe_rshift_func_uint16_t_u_u((+(safe_sub_func_uint32_t_u_u((safe_mul_func_int16_t_s_s((l_476[1][3][0] || (l_512 = ((l_480[1] & (&l_467[0] != &g_286[9])) , l_481))), g_17.f1)), l_476[1][3][0]))), 14)) || (*l_466))))))); + } + else + { /* block id: 360 */ + uint16_t l_517 = 4UL; + (**l_470) |= (safe_mul_func_int8_t_s_s((safe_lshift_func_uint8_t_u_u((*g_171), 5)), (l_517 , (*l_466)))); + } + (**l_470) ^= ((*l_466) && (((*l_466) == g_409[0][0]) , l_518)); + l_518 = (l_519 ^ l_519); + for (g_349 = (-26); (g_349 == (-2)); g_349 = safe_add_func_uint32_t_u_u(g_349, 2)) + { /* block id: 367 */ + uint8_t l_522[5][1][5] = {{{0UL,0UL,0UL,255UL,0xBAL}},{{0x6AL,254UL,0x6AL,9UL,0x40L}},{{0xBAL,0xF4L,0xF4L,0UL,0x75L}},{{0x40L,0x40L,0x40L,254UL,0xD5L}},{{0x75L,255UL,0x75L,0xF4L,0UL}}}; + const struct S1 *l_532 = &g_533; + const struct S1 ** const l_531 = &l_532; + int32_t l_534 = (-1L); + int i, j, k; + l_522[2][0][0]++; + for (g_261.f4 = (-26); (g_261.f4 == 13); ++g_261.f4) + { /* block id: 371 */ + uint8_t *l_528 = (void*)0; + uint8_t *l_529 = &g_38.f5; + l_534 ^= (l_481 = ((l_519 , (((0xD9L && ((((((l_527 , ((*p_26) = (((g_38.f3.f7 != (((*l_529) = 0UL) & 1L)) >= (*l_466)) < ((g_116 ^ ((*l_466) && g_38.f4.f9)) > (*p_26))))) != (*l_466)) >= g_349) > l_512) >= g_38.f3.f4) , (*l_466))) , 0L) , g_530)) != l_531)); + } + } + } + } + } + return (*l_466); +} + + +/* ------------------------------------------ */ +/* + * reads : g_123.f3 + * writes: g_123.f3 + */ +static int8_t * func_27(const union U3 p_28, const union U3 p_29, int8_t * p_30, int8_t * p_31, int8_t p_32) +{ /* block id: 314 */ + union U3 *l_459 = &g_62; + union U3 *l_461 = &g_62; + union U3 **l_460 = &l_461; + int32_t l_462 = 0x5FFEF395L; + int32_t *l_463 = &g_123.f3; + int8_t *l_464 = &g_10; + (*l_460) = (l_459 = l_459); + (*l_463) &= l_462; + return l_464; +} + + +/* ------------------------------------------ */ +/* + * reads : g_38.f3.f8 g_38.f4.f1 g_38.f4.f7 g_58 g_117 g_17.f3 g_38.f3.f6 g_60 g_38.f3.f9 g_38.f3.f1 g_38.f1 g_53.f3 g_145 g_153 g_168 g_170 g_123.f3 g_10 g_38.f3.f5 g_38.f4.f0 g_187 g_192 g_38.f3 g_123.f1 g_38.f4.f2 g_123.f2 g_38.f5 g_38.f4.f8 g_53.f2 g_17.f2 g_261.f6 g_261.f7 g_38 g_171 g_62 g_122 g_123 g_17.f0 g_261.f4 g_325 g_333 g_445 g_455 g_388 g_84 g_649.f4.f0 g_53 g_647.f5 g_543 + * writes: g_60 g_38.f4.f7 g_38.f4.f1 g_84 g_117 g_122 g_38.f3.f1 g_38.f1 g_53.f3 g_153 g_168 g_123.f3 g_38.f3.f5 g_38.f4.f0 g_187 g_192 g_10 g_261.f1 g_286 g_145 g_325 g_333 g_38.f3.f7 g_337 g_261.f5 g_445 g_116 + */ +static union U3 func_33(int16_t p_34, struct S1 p_35, int8_t * p_36, int16_t p_37) +{ /* block id: 15 */ + uint32_t l_87 = 0UL; + int32_t l_110 = (-4L); + int32_t l_115 = 5L; + union U4 l_134 = {4294967294UL}; + int8_t * const l_146 = &g_116; + uint8_t **l_173 = &g_171; + int32_t l_185 = 1L; + int32_t l_186 = 0x4994AC54L; + uint8_t ***l_216 = &l_173; + uint8_t ****l_215 = &l_216; + uint8_t ****l_218 = &l_216; + const int8_t *l_222[10]; + struct S2 l_244[3][2][8] = {{{{2,11,-2548,-25},{4,10,-1618,16},{2,11,-2548,-25},{4,10,-1618,16},{2,14,-84,-7},{4,10,-1618,16},{2,14,-84,-7},{2,11,-2548,-25}},{{2,11,-2548,-25},{2,11,-2548,-25},{2,11,-2548,-25},{4,10,-1618,16},{4,10,-1618,16},{4,10,-1618,16},{2,14,-84,-7},{2,14,-84,-7}}},{{{2,11,-2548,-25},{2,11,-2548,-25},{2,14,-84,-7},{4,10,-1618,16},{4,10,-1618,16},{2,11,-2548,-25},{2,14,-84,-7},{2,14,-84,-7}},{{2,14,-84,-7},{2,11,-2548,-25},{2,14,-84,-7},{2,11,-2548,-25},{4,10,-1618,16},{2,11,-2548,-25},{4,10,-1618,16},{2,14,-84,-7}}},{{{2,14,-84,-7},{2,14,-84,-7},{2,14,-84,-7},{2,11,-2548,-25},{2,11,-2548,-25},{2,11,-2548,-25},{4,10,-1618,16},{4,10,-1618,16}},{{2,14,-84,-7},{2,14,-84,-7},{4,10,-1618,16},{2,11,-2548,-25},{2,11,-2548,-25},{2,14,-84,-7},{4,10,-1618,16},{4,10,-1618,16}}}}; + uint8_t l_249 = 0x37L; + uint32_t l_256[1][2][10] = {{{0xF4C96F0BL,0UL,0xF4C96F0BL,0UL,0x0B358BC2L,0UL,0x0B358BC2L,0xF4C96F0BL,0x0B358BC2L,0xF4C96F0BL},{0UL,0UL,0xF4C96F0BL,0x0B358BC2L,0x0B358BC2L,0xF4C96F0BL,0xF4C96F0BL,0xF4C96F0BL,0UL,0UL}}}; + int8_t * const l_265 = &g_261.f0; + int8_t * const *l_264[3][7] = {{&l_265,&l_265,&l_265,&l_265,&l_265,&l_265,&l_265},{&l_265,&l_265,&l_265,&l_265,&l_265,&l_265,&l_265},{&l_265,&l_265,&l_265,&l_265,&l_265,&l_265,&l_265}}; + const int32_t *l_363[9][3][1] = {{{&l_110},{&g_337},{&l_186}},{{&l_186},{&l_110},{&g_337}},{{&g_337},{&l_186},{&l_110}},{{&l_110},{&g_337},{&l_186}},{{&l_186},{&l_110},{&g_337}},{{&g_337},{&l_186},{&l_110}},{{&l_110},{&g_337},{&l_186}},{{&l_186},{&l_110},{&g_337}},{{&g_337},{&l_186},{&l_110}}}; + union U3 *l_385 = (void*)0; + int8_t l_442 = 0x40L; + int32_t l_443 = 0x9A7CB5F4L; + int32_t l_444 = 0x61A537AAL; + int8_t l_454 = 0x8FL; + int32_t *l_457 = &l_110; + int32_t **l_456 = &l_457; + int i, j, k; + for (i = 0; i < 10; i++) + l_222[i] = &g_38.f4.f0; + if (l_87) + { /* block id: 16 */ + int32_t l_111 = 0x598B098BL; + int32_t l_112 = 0x4FF7E3BCL; + int32_t l_113[9] = {0L,0L,0L,0L,0L,0L,0L,0L,0L}; + int32_t l_114[2][10] = {{0x57937C94L,0x306FF473L,0x57937C94L,0x0149EDFFL,0x57937C94L,0x57937C94L,0x306FF473L,0x0149EDFFL,0x0149EDFFL,0x57937C94L},{0x306FF473L,0x57937C94L,0x57937C94L,0x57937C94L,0x0149EDFFL,0x0149EDFFL,0x0149EDFFL,0x306FF473L,0x306FF473L,0x306FF473L}}; + uint32_t l_132 = 0xB1A2BFF1L; + const uint32_t *l_133[7][7][1] = {{{&g_38.f1},{&g_38.f3.f4},{&g_38.f4.f4},{&g_117},{(void*)0},{&g_117},{&g_38.f3.f4}},{{(void*)0},{(void*)0},{(void*)0},{&g_117},{&g_38.f1},{&g_38.f1},{&g_76}},{{&g_38.f1},{(void*)0},{&g_38.f4.f4},{&g_76},{&g_38.f4.f4},{&g_38.f1},{(void*)0}},{{&g_38.f3.f4},{&g_38.f3.f4},{&g_38.f3.f4},{&g_76},{&g_38.f1},{&g_38.f3.f4},{&g_38.f1}},{{&g_38.f3.f4},{&g_38.f4.f4},{&g_117},{(void*)0},{&g_117},{&g_38.f3.f4},{(void*)0}},{{(void*)0},{(void*)0},{&g_117},{&g_38.f1},{&g_38.f1},{&g_38.f1},{&g_38.f1}},{{(void*)0},{&g_38.f3.f4},{&g_76},{&g_38.f4.f4},{&g_38.f1},{(void*)0},{&g_38.f3.f4}}}; + uint8_t l_138[3][8][6] = {{{0xD2L,0UL,0x5BL,0x18L,0x18L,0UL},{0x5BL,0x5BL,0x96L,255UL,0x82L,0xB2L},{0xBCL,0x3CL,0x18L,255UL,0xF4L,0x34L},{255UL,0UL,252UL,0x4DL,0x55L,0x34L},{0x96L,0x82L,0x18L,0xF4L,0x96L,0xB2L},{0xD2L,0x06L,0x96L,0UL,0xBCL,0UL},{0x55L,1UL,0x5BL,0x8BL,0xF4L,255UL},{0xB2L,252UL,0x06L,255UL,255UL,1UL}},{{0xB2L,0xB2L,252UL,0x8BL,0x50L,0x50L},{0x55L,0xF4L,0xF4L,0UL,0x34L,0x41L},{0xD2L,0x41L,0xA5L,0xF4L,255UL,0UL},{0x96L,0x82L,0x3CL,0x4DL,0xF4L,255UL},{255UL,0x82L,255UL,255UL,255UL,0xF4L},{0xBCL,0x41L,0UL,255UL,0x34L,0UL},{0x5BL,0xF4L,255UL,0x18L,0x50L,0x8BL},{0xD2L,0xB2L,252UL,0x06L,255UL,255UL}},{{0x3CL,252UL,252UL,0x01L,0xF4L,0x8BL},{0x41L,1UL,255UL,255UL,0xBCL,0UL},{0x01L,0xBCL,0UL,0x96L,1UL,0xF4L},{0x82L,0xF4L,255UL,255UL,252UL,0x4DL},{0x96L,255UL,0x50L,255UL,0xB2L,255UL},{0x82L,0x50L,0x82L,0x96L,0xF4L,255UL},{0x01L,0x34L,0xB2L,0x01L,0x41L,0x18L},{255UL,255UL,0UL,0x3CL,0xF4L,0x06L}}}; + union U4 *l_156[5]; + uint32_t l_205 = 1UL; + uint8_t ****l_217 = &l_216; + struct S0 l_219 = {0x69L,0L,0L,0L,0x29A4367DL,0xB8A6L,4294967289UL,0xBFL,9895,0xAA54L}; + int32_t *l_221 = &g_38.f3.f1; + int i, j, k; + for (i = 0; i < 5; i++) + l_156[i] = (void*)0; + for (p_35.f3.f0 = 0; (p_35.f3.f0 <= 4); p_35.f3.f0 += 1) + { /* block id: 19 */ + int8_t l_92[3][2][3] = {{{0x54L,0x30L,0x54L},{0xA4L,0L,0xA4L}},{{0x30L,0x43L,0x30L},{0L,0xEBL,0L}},{{0x43L,0x54L,0x43L},{0xEBL,0xA4L,0xEBL}}}; + int32_t *l_93 = (void*)0; + int32_t *l_94 = &g_60; + int i, j, k; + p_35.f3.f1 &= (0xE99DL == (safe_sub_func_int8_t_s_s(((((*l_94) = (safe_mod_func_uint32_t_u_u(g_38.f3.f8, l_92[1][0][0]))) > 0xBAF8CB8FL) >= (g_38.f4.f1 ^ (g_38.f4.f7 = (safe_rshift_func_uint16_t_u_u(0x75BEL, 10))))), 0UL))); + for (g_38.f4.f1 = 4; (g_38.f4.f1 >= 0); g_38.f4.f1 -= 1) + { /* block id: 25 */ + uint8_t *l_99 = &g_38.f4.f7; + int16_t *l_104 = &g_84; + int i, j; + (*l_94) = (safe_lshift_func_uint8_t_u_u(((*l_99)++), (safe_lshift_func_uint8_t_u_u((g_58[p_35.f3.f0][(g_38.f4.f1 + 3)] >= ((*l_104) = ((g_58[g_38.f4.f1][(g_38.f4.f1 + 2)] , g_58[g_38.f4.f1][(g_38.f4.f1 + 3)]) > l_87))), 2)))); + } + } + for (g_38.f4.f7 = (-10); (g_38.f4.f7 <= 13); g_38.f4.f7 = safe_add_func_int32_t_s_s(g_38.f4.f7, 1)) + { /* block id: 33 */ + int32_t *l_107 = &g_38.f4.f1; + int32_t *l_108 = (void*)0; + int32_t *l_109[1][6][10] = {{{&g_38.f4.f1,&g_60,&g_53.f3,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&g_38.f3.f1,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1},{&g_60,&g_53.f3,&g_53.f3,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&g_60,&g_60,&g_38.f3.f1},{&g_38.f4.f1,&g_38.f4.f1,&g_38.f3.f1,&g_38.f4.f1,&g_60,&g_38.f4.f1,&g_38.f3.f1,&g_53.f3,&g_38.f4.f1,&g_38.f4.f1},{&g_38.f4.f1,&g_53.f3,&g_53.f3,&g_60,&g_38.f4.f1,&g_38.f4.f1,&g_53.f3,&g_60,&g_60,&g_53.f3},{&g_38.f4.f1,&g_38.f4.f1,&g_53.f3,&g_38.f4.f1,&g_60,&g_38.f4.f1,&g_38.f3.f1,&g_53.f3,&g_60,&g_38.f4.f1},{&g_38.f4.f1,&g_38.f4.f1,&g_53.f3,&g_60,&g_60,&g_38.f4.f1,&g_53.f3,&g_38.f4.f1,&g_60,&g_38.f4.f1}}}; + union U4 *l_120 = &g_53; + union U4 **l_121[1][9]; + int i, j, k; + for (i = 0; i < 1; i++) + { + for (j = 0; j < 9; j++) + l_121[i][j] = &l_120; + } + --g_117; + g_122 = l_120; + l_114[0][1] = (p_35.f3.f1 = (g_38.f3.f1 = ((*l_107) = (l_111 & l_111)))); + } + if ((((safe_rshift_func_int8_t_s_u((safe_mul_func_uint16_t_u_u(((safe_lshift_func_uint16_t_u_u(((((safe_add_func_int32_t_s_s(0x6E06CC3FL, l_132)) , l_133[3][5][0]) == (l_134 , &g_76)) < ((safe_unary_minus_func_int8_t_s((&p_37 == &g_84))) , (((safe_rshift_func_int8_t_s_u((-10L), 2)) && l_87) , g_17.f3))), 5)) & l_134.f1), 1L)), l_138[0][6][2])) ^ g_38.f3.f6) != 0x6AL)) + { /* block id: 41 */ + int16_t l_139[7] = {0x9F0FL,0x9F0FL,0x9F0FL,0x9F0FL,0x9F0FL,0x9F0FL,0x9F0FL}; + int32_t *l_149 = &l_134.f3; + int32_t *l_150 = &l_134.f3; + int32_t *l_151 = &g_123.f3; + int32_t *l_152[10] = {&g_38.f4.f1,&l_113[0],&l_114[1][4],&l_114[1][4],&g_38.f4.f1,&g_53.f3,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&l_115}; + union U4 **l_157 = &l_156[1]; + int i; + for (g_60 = 0; (g_60 <= 2); g_60 += 1) + { /* block id: 44 */ + int32_t *l_140 = &g_38.f3.f1; + union U3 l_148 = {0}; + (*l_140) ^= (l_139[1] , g_38.f3.f9); + for (g_38.f1 = 0; (g_38.f1 <= 2); g_38.f1 += 1) + { /* block id: 48 */ + int32_t *l_147 = &g_53.f3; + (*l_147) = (safe_add_func_uint8_t_u_u((g_53.f3 , p_35.f3.f7), (((*l_140) = ((safe_rshift_func_uint8_t_u_u(g_145, (l_112 ^ 252UL))) == (p_35 , (l_146 == l_146)))) && (+p_35.f4.f9)))); + if (p_35.f0) + break; + return l_148; + } + } + --g_153; + (*l_157) = l_156[1]; + } + else + { /* block id: 57 */ + uint32_t l_163 = 0x8B299F90L; + uint8_t *l_167 = &l_138[2][7][4]; + uint8_t **l_166 = &l_167; + int32_t l_177 = (-1L); + int32_t l_184[2]; + uint8_t * const *l_196 = &g_171; + uint8_t * const **l_195[8][2][6] = {{{&l_196,&l_196,&l_196,&l_196,&l_196,&l_196},{&l_196,&l_196,(void*)0,(void*)0,&l_196,&l_196}},{{&l_196,&l_196,&l_196,&l_196,(void*)0,&l_196},{&l_196,&l_196,&l_196,&l_196,&l_196,&l_196}},{{&l_196,(void*)0,&l_196,&l_196,&l_196,&l_196},{(void*)0,(void*)0,&l_196,&l_196,(void*)0,&l_196}},{{(void*)0,&l_196,&l_196,(void*)0,&l_196,&l_196},{(void*)0,(void*)0,&l_196,&l_196,&l_196,&l_196}},{{(void*)0,&l_196,&l_196,&l_196,&l_196,&l_196},{&l_196,&l_196,&l_196,(void*)0,&l_196,&l_196}},{{&l_196,&l_196,(void*)0,(void*)0,(void*)0,&l_196},{(void*)0,&l_196,&l_196,(void*)0,&l_196,&l_196}},{{&l_196,&l_196,&l_196,(void*)0,&l_196,&l_196},{&l_196,&l_196,&l_196,&l_196,&l_196,&l_196}},{{&l_196,(void*)0,(void*)0,(void*)0,&l_196,&l_196},{&l_196,&l_196,(void*)0,&l_196,&l_196,&l_196}}}; + int32_t *l_220 = &l_134.f3; + int i, j, k; + for (i = 0; i < 2; i++) + l_184[i] = 0xC020D4C6L; + if (l_113[3]) + { /* block id: 58 */ + int32_t *l_158 = &l_134.f3; + int32_t *l_159 = &g_38.f4.f1; + int32_t *l_160[6][3] = {{&g_123.f3,&g_123.f3,&g_123.f3},{&g_38.f3.f1,&g_38.f3.f1,&g_38.f3.f1},{&g_123.f3,&g_123.f3,&g_123.f3},{&g_38.f3.f1,&g_38.f3.f1,&g_38.f3.f1},{&g_123.f3,&g_123.f3,&g_123.f3},{&g_38.f3.f1,&g_38.f3.f1,&g_38.f3.f1}}; + int i, j; + ++l_163; + l_166 = (void*)0; + } + else + { /* block id: 61 */ + uint8_t ***l_169 = &g_168; + uint8_t ***l_172[2][6][4]; + int32_t *l_174[1]; + union U3 l_180 = {0}; + int i, j, k; + for (i = 0; i < 2; i++) + { + for (j = 0; j < 6; j++) + { + for (k = 0; k < 4; k++) + l_172[i][j][k] = (void*)0; + } + } + for (i = 0; i < 1; i++) + l_174[i] = &g_53.f3; + g_123.f3 |= (((*l_169) = g_168) == (l_173 = g_170[6][1][0])); + l_177 ^= (safe_rshift_func_uint8_t_u_s(p_35.f4.f4, (*p_36))); + for (g_38.f3.f5 = 1; (g_38.f3.f5 <= 4); g_38.f3.f5 += 1) + { /* block id: 68 */ + uint32_t l_181[9][2][1] = {{{0x142A211DL},{0x2C0B9176L}},{{0x2C0B9176L},{0UL}},{{0UL},{1UL}},{{0UL},{1UL}},{{0x142A211DL},{0x142A211DL}},{{0UL},{5UL}},{{5UL},{0x2C0B9176L}},{{0x2C0B9176L},{0x142A211DL}},{{0x2C0B9176L},{0x142A211DL}}}; + int i, j, k; + l_177 = (((safe_add_func_int16_t_s_s(l_87, (((!((g_145 , l_180) , (l_163 | p_35.f4.f8))) ^ l_181[3][0][0]) & (safe_add_func_int16_t_s_s((((p_35.f4.f4 ^ (&l_156[g_38.f3.f5] != &l_156[g_38.f3.f5])) >= l_113[5]) & g_10), 0xACF0L))))) , l_163) ^ 0x1EFB2649L); + for (g_38.f4.f0 = 4; (g_38.f4.f0 >= 1); g_38.f4.f0 -= 1) + { /* block id: 72 */ + int16_t l_190 = (-1L); + int32_t l_191 = 1L; + uint8_t * const ***l_197 = &l_195[1][1][1]; + int i, j; + --g_187; + --g_192[2]; + g_38.f4.f1 = (&g_168 == ((*l_197) = l_195[2][0][4])); + g_60 = ((safe_mul_func_uint32_t_u_u(((p_35 , (g_58[g_38.f4.f0][g_38.f4.f0] || p_35.f4.f8)) >= p_37), ((safe_div_func_int16_t_s_s(((void*)0 != l_167), (safe_mul_func_int16_t_s_s((((1L <= ((g_38.f3 , (safe_unary_minus_func_int8_t_s(0xB8L))) != 0xCE43L)) ^ (-6L)) && l_184[0]), l_87)))) < (-1L)))) , l_190); + } + } + l_205++; + } + (*l_220) = (safe_div_func_int16_t_s_s(((g_123.f1 , (safe_lshift_func_int8_t_s_u((*p_36), (((0x2A3CL & (safe_add_func_int8_t_s_s((safe_unary_minus_func_int8_t_s(1L)), (*p_36)))) , (l_217 = l_215)) == l_218)))) ^ (((l_219 , g_38.f4.f2) , &g_161) == &g_10)), p_35.f2)); + } + (*l_221) |= l_115; + } + else + { /* block id: 86 */ + const int8_t **l_223 = &l_222[4]; + struct S0 l_224[2] = {{-10L,5L,7L,0xB3B3D443L,0xF4879BB8L,1UL,1UL,0x9EL,26012,5L},{-10L,5L,7L,0xB3B3D443L,0xF4879BB8L,1UL,1UL,0x9EL,26012,5L}}; + int16_t l_229 = 0xF760L; + uint16_t *l_232 = (void*)0; + uint16_t *l_233[2]; + int32_t *l_250 = (void*)0; + int32_t *l_251 = &l_115; + union U3 l_285 = {0}; + int32_t l_294 = 8L; + int32_t l_295 = 0x849D8FB3L; + int32_t l_296 = 0xA7A4D2B8L; + int i; + for (i = 0; i < 2; i++) + l_233[i] = &g_38.f4.f5; +lbl_262: + g_53.f3 ^= ((((p_35.f4.f1 || (((p_35.f4 , (((*l_223) = l_222[1]) != (l_224[1] , p_36))) , (safe_rshift_func_uint16_t_u_u((+(((safe_lshift_func_uint16_t_u_s((g_123.f2 != p_35.f5), (l_229 != (safe_add_func_uint16_t_u_u((p_35.f3.f5 = l_134.f1), p_35.f3.f4))))) , (void*)0) == &g_122)), l_224[1].f5))) > (*p_36))) < 0xDDL) && p_35.f4.f8) ^ p_35.f4.f8); +lbl_328: + (*l_251) |= (safe_sub_func_uint16_t_u_u(((l_224[1].f5 != (safe_sub_func_uint8_t_u_u(0UL, (((g_38.f3.f4 , l_134.f0) , ((safe_add_func_uint16_t_u_u(65533UL, g_58[2][2])) != ((safe_lshift_func_int8_t_s_u(((p_35.f3.f0 == (((safe_rshift_func_int8_t_s_s(((l_244[0][1][0] , (((safe_unary_minus_func_int16_t_s((safe_unary_minus_func_int8_t_s((safe_lshift_func_uint8_t_u_s(p_35.f3.f3, l_229)))))) == l_249) , 0L)) ^ g_38.f1), 4)) , p_35.f4.f1) || 4UL)) && 0xF589D1E2L), 2)) ^ (-7L)))) | 0xC9580029L)))) ^ 0x042B92E4L), p_35.f3.f9)); +lbl_330: + for (p_35.f1 = 0; (p_35.f1 <= 9); p_35.f1 += 1) + { /* block id: 93 */ + int32_t *l_257 = &g_123.f3; + struct S0 *l_260 = &g_261; + (*l_251) = (((((safe_mod_func_int16_t_s_s((0xD5L & (safe_lshift_func_uint16_t_u_s((((p_35.f4.f6 < (g_38.f5 <= (p_35.f5 == (*l_251)))) ^ ((~((&p_36 != (void*)0) == (p_35.f4.f2 , 1L))) > 0x85C3L)) >= 0xF4L), p_35.f3.f1))), g_38.f4.f8)) <= (*l_251)) , l_244[0][1][0].f2) == l_256[0][1][1]) > (-1L)); + if (g_53.f2) + continue; + l_257 = &g_60; + for (l_229 = 3; (l_229 >= 0); l_229 -= 1) + { /* block id: 99 */ + struct S0 *l_258 = &g_38.f3; + struct S0 **l_259[3]; + int32_t l_284 = 0x40E746C3L; + int i; + for (i = 0; i < 3; i++) + l_259[i] = &l_258; + if (p_35.f4.f6) + break; + l_260 = l_258; + if (l_87) + goto lbl_262; + for (g_10 = 0; (g_10 <= 9); g_10 += 1) + { /* block id: 105 */ + int8_t ***l_263[7] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0}; + const int32_t l_282 = 7L; + int16_t l_283 = 0x402EL; + int i; + l_264[1][1] = (void*)0; + for (g_117 = 0; (g_117 <= 9); g_117 += 1) + { /* block id: 109 */ + int i, j, k; + g_261.f1 = (safe_mul_func_int16_t_s_s(g_17.f2, ((safe_rshift_func_int8_t_s_u((g_261.f6 || (((g_192[2] = g_261.f7) & (safe_lshift_func_int8_t_s_s((safe_add_func_uint8_t_u_u((g_38 , (*g_171)), (safe_lshift_func_uint8_t_u_s((((p_35.f3.f5 | ((safe_mod_func_int32_t_s_s((0xF47FL ^ p_35.f3.f4), (safe_mul_func_int16_t_s_s((safe_mod_func_int16_t_s_s(l_244[0][1][0].f3, l_282)), p_35.f3.f4)))) != 0xB868E2F5L)) , l_283) == 65535UL), l_283)))), l_284))) >= 0x12C776FCL)), 0)) <= 0xE3A977B0L))); + } + return g_62; + } + } + } + if ((l_285 , p_35.f3.f6)) + { /* block id: 117 */ + uint8_t l_297 = 0x94L; + int32_t l_322 = 0L; + union U3 l_329[6][3][7] = {{{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}}},{{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}}},{{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}}},{{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}}},{{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}}},{{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}},{{0},{0},{0},{0},{0},{0},{0}}}}; + int32_t l_332 = 0xEB4B96B0L; + struct S0 **l_357 = &g_356[2][0]; + struct S0 **l_359 = &g_356[0][0]; + int i, j, k; +lbl_341: + for (g_38.f4.f7 = 0; (g_38.f4.f7 <= 0); g_38.f4.f7 += 1) + { /* block id: 120 */ + const int32_t *l_289 = &l_186; + const int32_t **l_288 = &l_289; + int32_t *l_290 = &l_134.f3; + int32_t *l_291 = &g_60; + int32_t *l_292 = &l_185; + int32_t *l_293[5] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0}; + int i; + (*l_288) = (g_286[9] = (void*)0); + ++l_297; + if ((*l_291)) + { /* block id: 124 */ + int16_t l_317 = 0x34A4L; + (*l_292) ^= (*l_251); + for (p_35.f3.f7 = 0; (p_35.f3.f7 <= 0); p_35.f3.f7 += 1) + { /* block id: 128 */ + int16_t *l_310 = &g_84; + int16_t *l_311[7] = {(void*)0,&l_229,(void*)0,&l_229,(void*)0,&l_229,(void*)0}; + struct S1 *l_313 = &g_38; + struct S1 **l_312 = &l_313; + struct S1 **l_314 = (void*)0; + struct S1 *l_316 = &g_38; + struct S1 **l_315 = &l_316; + int i; + (*l_292) = ((p_35.f3.f6 & (((safe_add_func_uint8_t_u_u((safe_rshift_func_uint8_t_u_s(l_297, l_297)), ((safe_rshift_func_int16_t_s_u((g_145 |= ((safe_add_func_uint32_t_u_u(((*g_122) , (l_297 < p_35.f1)), g_261.f6)) >= (safe_rshift_func_uint16_t_u_s(((g_10 <= ((*l_310) = 0x1273L)) || l_297), g_17.f0)))), 6)) , p_35.f3.f0))) ^ (*p_36)) != l_297)) != p_35.f3.f0); + (*l_315) = ((*l_312) = &p_35); + return g_62; + } + if (l_134.f3) + continue; + if (l_317) + { /* block id: 137 */ + (*l_291) = (safe_lshift_func_uint16_t_u_u(l_317, 2)); + } + else + { /* block id: 139 */ + int16_t l_323 = 0L; + int32_t l_324 = (-1L); + (*l_291) ^= p_35.f1; + (*l_251) &= ((*l_292) &= p_37); + g_60 = ((*l_290) = (safe_rshift_func_uint16_t_u_s(g_145, g_261.f4))); + --g_325; + } + } + else + { /* block id: 147 */ + if (p_35.f4.f0) + { /* block id: 148 */ + (*l_288) = &g_287; + if (p_35.f3.f1) + continue; + if (p_37) + goto lbl_328; + } + else + { /* block id: 152 */ + return l_329[3][0][4]; + } + if (l_297) + continue; + } + (*l_291) &= p_35.f3.f9; + for (l_185 = 0; (l_185 >= 0); l_185 -= 1) + { /* block id: 160 */ + int32_t l_336 = (-1L); + for (p_35.f3.f4 = 0; (p_35.f3.f4 <= 0); p_35.f3.f4 += 1) + { /* block id: 163 */ + if (g_38.f3.f8) + goto lbl_330; + ++g_333; + } + (*l_291) ^= (l_134.f0 && p_35.f3.f9); + (*l_290) |= ((*l_291) = p_35.f2); + for (g_84 = 0; (g_84 >= 0); g_84 -= 1) + { /* block id: 172 */ + (*l_291) |= l_244[0][1][0].f0; + } + for (g_38.f3.f7 = 0; (g_38.f3.f7 <= 0); g_38.f3.f7 += 1) + { /* block id: 177 */ + uint16_t l_338[10][7] = {{0x2767L,0x2767L,65532UL,0x2C97L,65532UL,65532UL,65532UL},{65532UL,0x2C97L,1UL,0x2C97L,0x2C97L,0x2C97L,0x2767L},{1UL,0x2C97L,65532UL,1UL,65532UL,65526UL,0x2767L},{65526UL,1UL,0x2767L,1UL,65532UL,0x2C97L,65526UL},{1UL,0x2767L,0x2767L,65532UL,0x2C97L,65532UL,65532UL},{1UL,1UL,65526UL,0x2767L,65526UL,65526UL,65526UL},{65526UL,0x2767L,65532UL,0x2767L,0x2C97L,0x2767L,1UL},{65532UL,0x2767L,65526UL,65532UL,65526UL,0x2C97L,1UL},{0x2C97L,65532UL,1UL,65532UL,65526UL,0x2767L,65526UL},{65532UL,1UL,1UL,65526UL,0x2767L,65526UL,65526UL}}; + int i, j; + l_338[6][3]++; + l_332 |= (g_123.f3 ^= p_34); + g_53.f3 = (g_337 = l_332); + } + } + } + for (l_297 = 0; (l_297 <= 0); l_297 += 1) + { /* block id: 188 */ + struct S1 *l_343 = &g_38; + struct S1 **l_342 = &l_343; + struct S1 *l_344 = (void*)0; + int32_t l_345 = 1L; + for (l_110 = 9; (l_110 >= 0); l_110 -= 1) + { /* block id: 191 */ + if (g_38.f3.f5) + goto lbl_341; + return g_62; + } + l_344 = ((*l_342) = (void*)0); + for (p_35.f3.f1 = 0; (p_35.f3.f1 <= 3); p_35.f3.f1 += 1) + { /* block id: 199 */ + (*l_251) = l_297; + for (g_261.f5 = 0; (g_261.f5 <= 0); g_261.f5 += 1) + { /* block id: 203 */ + int32_t **l_346[7][3][6] = {{{&l_250,(void*)0,&l_251,&l_251,&l_250,&l_250},{&l_250,&l_251,&l_251,&l_251,&l_250,(void*)0},{&l_251,&l_250,&l_251,(void*)0,&l_251,&l_251}},{{&l_250,&l_250,(void*)0,&l_251,&l_250,(void*)0},{&l_251,&l_251,&l_251,&l_250,&l_250,&l_250},{&l_250,&l_250,&l_251,&l_251,&l_251,&l_250}},{{&l_250,&l_251,&l_250,&l_251,&l_251,&l_250},{(void*)0,&l_251,&l_250,&l_251,&l_251,&l_251},{&l_251,&l_251,&l_250,&l_250,(void*)0,&l_251}},{{&l_250,&l_251,&l_251,(void*)0,&l_251,&l_251},{&l_251,(void*)0,(void*)0,(void*)0,&l_251,&l_251},{&l_250,&l_251,&l_251,&l_250,&l_251,&l_251}},{{&l_251,&l_251,&l_251,&l_251,&l_250,&l_251},{&l_251,&l_250,&l_250,&l_251,(void*)0,&l_251},{&l_251,(void*)0,&l_250,&l_250,&l_250,&l_251}},{{(void*)0,(void*)0,&l_251,(void*)0,&l_250,&l_251},{&l_250,&l_250,&l_251,&l_250,&l_251,&l_250},{(void*)0,&l_250,&l_251,&l_251,&l_251,&l_251}},{{&l_250,&l_251,&l_250,&l_251,&l_250,&l_250},{&l_250,&l_251,&l_251,&l_250,&l_250,&l_251},{&l_251,&l_250,&l_250,&l_250,&l_251,&l_250}}}; + int i, j, k; + l_345 |= 0x5F0BBE29L; + g_286[9] = &l_296; + } + } + for (g_325 = 0; (g_325 <= 0); g_325 += 1) + { /* block id: 210 */ + uint32_t l_350 = 4294967291UL; + struct S0 *l_354 = &g_38.f4; + struct S0 **l_353 = &l_354; + } + } + (*l_251) ^= (p_35.f4.f1 ^= (-2L)); + } + else + { /* block id: 237 */ + const int32_t **l_361 = (void*)0; + const int32_t **l_362[2]; + int i; + for (i = 0; i < 2; i++) + l_362[i] = &g_286[9]; + l_363[0][2][0] = &g_287; + } + } + if (p_35.f4.f7) + { /* block id: 241 */ + return g_62; + } + else + { /* block id: 243 */ + union U4 l_368 = {0xD2D93F7CL}; + int32_t *l_384[3]; + int16_t l_405 = 0x504DL; + int i; + for (i = 0; i < 3; i++) + l_384[i] = &l_368.f3; + for (l_249 = (-20); (l_249 <= 16); l_249 = safe_add_func_uint32_t_u_u(l_249, 7)) + { /* block id: 246 */ + uint16_t *l_375[2]; + uint8_t ** const *l_377 = &g_170[6][1][0]; + uint8_t ** const **l_376 = &l_377; + int32_t *l_378 = &g_38.f3.f1; + int32_t l_396 = 0x91E4A1E3L; + int32_t l_404 = 0x62E02450L; + int32_t l_406 = 9L; + int32_t l_408 = 0L; + uint32_t l_438 = 0xBF89C8AAL; + int i; + for (i = 0; i < 2; i++) + l_375[i] = (void*)0; + } + ++g_445[1][1][1]; + p_35.f4.f1 = (safe_sub_func_uint8_t_u_u((*g_171), ((~g_38.f3.f5) , ((*l_146) = (*p_36))))); + g_123.f3 = ((3L && ((*p_36) >= ((((g_123.f2 ^ (((safe_mul_func_uint16_t_u_u(((((safe_sub_func_int32_t_s_s(p_35.f4.f9, ((((*l_146) = l_454) , (((&g_286[3] != &l_363[7][2][0]) == p_35.f3.f7) | 0x3CC708BAL)) != p_35.f4.f7))) || p_34) >= p_35.f4.f4) | (-3L)), g_455)) & p_35.f3.f4) , 0x1116D29EL)) <= (*p_36)) ^ p_35.f4.f2) < p_35.f1))) | 0x3DL); + } + (*l_456) = &g_337; + l_385 = &g_388; + return (*l_385); +} + + +/* ------------------------------------------ */ +/* + * reads : g_76 g_38.f3.f9 g_38.f4.f7 g_84 g_10 g_647.f0 g_331 g_38.f0 g_647.f3.f0 + * writes: g_76 g_84 + */ +static int8_t * func_39(const int8_t * p_40, int8_t * const p_41, int8_t p_42, uint32_t p_43, union U3 p_44) +{ /* block id: 7 */ + int32_t *l_65[7] = {&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1,&g_38.f4.f1}; + int32_t **l_66 = &l_65[3]; + int32_t l_67 = 0xDE09DF94L; + int32_t l_74 = 0x400D3BC8L; + uint32_t *l_75 = &g_76; + int16_t *l_81 = (void*)0; + int16_t *l_82 = (void*)0; + int16_t *l_83 = &g_84; + int32_t *l_85 = &l_74; + int32_t l_86 = 0x510E35A5L; + int i; + l_86 ^= ((*l_85) = (((safe_rshift_func_int8_t_s_s(((((*l_83) |= ((((l_67 = (((*l_66) = l_65[3]) == &g_60)) ^ ((safe_add_func_int16_t_s_s((safe_rshift_func_uint8_t_u_s(((safe_add_func_int16_t_s_s(l_74, ((p_42 == ((*l_75)++)) < (safe_add_func_uint8_t_u_u(p_42, (l_66 == ((p_43 | 0x29BAL) , l_66))))))) > 0x7FL), 6)), g_38.f3.f9)) || g_38.f4.f7)) && p_43) & 0x27L)) != p_43) <= 0x4DE6L), (*p_41))) < 0x02L) > 0x57L)); + return &g_10; +} + + +/* ------------------------------------------ */ +/* + * reads : g_38.f3.f3 g_58 g_53.f3 g_60 + * writes: g_53.f3 g_58 g_60 + */ +static const int8_t * func_45(int8_t * p_46, int32_t p_47, uint32_t p_48, union U4 p_49, int8_t p_50) +{ /* block id: 2 */ + int32_t *l_57 = &g_53.f3; + int32_t *l_59 = &g_60; + const int8_t *l_61 = &g_38.f3.f0; + g_58[2][2] ^= ((*l_57) = (safe_rshift_func_uint8_t_u_s(g_38.f3.f3, 2))); + (*l_59) ^= (*l_57); + return l_61; +} + + + + +/* ---------------------------------------- */ +int main (int argc, char* argv[]) +{ + int i, j, k; + int print_hash_value = 0; + if (argc == 2 && strcmp(argv[1], "1") == 0) print_hash_value = 1; + platform_main_begin(); + crc32_gentab(); + func_1(); + transparent_crc(g_8, "g_8", print_hash_value); + transparent_crc(g_10, "g_10", print_hash_value); + transparent_crc(g_17.f0, "g_17.f0", print_hash_value); + transparent_crc(g_17.f1, "g_17.f1", print_hash_value); + transparent_crc(g_17.f2, "g_17.f2", print_hash_value); + transparent_crc(g_17.f3, "g_17.f3", print_hash_value); + transparent_crc(g_38.f0, "g_38.f0", print_hash_value); + transparent_crc(g_38.f1, "g_38.f1", print_hash_value); + transparent_crc(g_38.f2, "g_38.f2", print_hash_value); + transparent_crc(g_38.f3.f0, "g_38.f3.f0", print_hash_value); + transparent_crc(g_38.f3.f1, "g_38.f3.f1", print_hash_value); + transparent_crc(g_38.f3.f2, "g_38.f3.f2", print_hash_value); + transparent_crc(g_38.f3.f3, "g_38.f3.f3", print_hash_value); + transparent_crc(g_38.f3.f4, "g_38.f3.f4", print_hash_value); + transparent_crc(g_38.f3.f5, "g_38.f3.f5", print_hash_value); + transparent_crc(g_38.f3.f6, "g_38.f3.f6", print_hash_value); + transparent_crc(g_38.f3.f7, "g_38.f3.f7", print_hash_value); + transparent_crc(g_38.f3.f8, "g_38.f3.f8", print_hash_value); + transparent_crc(g_38.f3.f9, "g_38.f3.f9", print_hash_value); + transparent_crc(g_38.f4.f0, "g_38.f4.f0", print_hash_value); + transparent_crc(g_38.f4.f1, "g_38.f4.f1", print_hash_value); + transparent_crc(g_38.f4.f2, "g_38.f4.f2", print_hash_value); + transparent_crc(g_38.f4.f3, "g_38.f4.f3", print_hash_value); + transparent_crc(g_38.f4.f4, "g_38.f4.f4", print_hash_value); + transparent_crc(g_38.f4.f5, "g_38.f4.f5", print_hash_value); + transparent_crc(g_38.f4.f6, "g_38.f4.f6", print_hash_value); + transparent_crc(g_38.f4.f7, "g_38.f4.f7", print_hash_value); + transparent_crc(g_38.f4.f8, "g_38.f4.f8", print_hash_value); + transparent_crc(g_38.f4.f9, "g_38.f4.f9", print_hash_value); + transparent_crc(g_38.f5, "g_38.f5", print_hash_value); + transparent_crc(g_53.f0, "g_53.f0", print_hash_value); + transparent_crc(g_53.f1, "g_53.f1", print_hash_value); + transparent_crc(g_53.f2, "g_53.f2", print_hash_value); + transparent_crc(g_53.f3, "g_53.f3", print_hash_value); + for (i = 0; i < 5; i++) + { + for (j = 0; j < 10; j++) + { + transparent_crc(g_58[i][j], "g_58[i][j]", print_hash_value); + if (print_hash_value) printf("index = [%d][%d]\n", i, j); + + } + } + transparent_crc(g_60, "g_60", print_hash_value); + transparent_crc(g_76, "g_76", print_hash_value); + transparent_crc(g_84, "g_84", print_hash_value); + transparent_crc(g_116, "g_116", print_hash_value); + transparent_crc(g_117, "g_117", print_hash_value); + transparent_crc(g_123.f0, "g_123.f0", print_hash_value); + transparent_crc(g_123.f1, "g_123.f1", print_hash_value); + transparent_crc(g_123.f2, "g_123.f2", print_hash_value); + transparent_crc(g_123.f3, "g_123.f3", print_hash_value); + transparent_crc(g_145, "g_145", print_hash_value); + transparent_crc(g_153, "g_153", print_hash_value); + transparent_crc(g_161, "g_161", print_hash_value); + transparent_crc(g_162, "g_162", print_hash_value); + transparent_crc(g_187, "g_187", print_hash_value); + for (i = 0; i < 3; i++) + { + transparent_crc(g_192[i], "g_192[i]", print_hash_value); + if (print_hash_value) printf("index = [%d]\n", i); + + } + transparent_crc(g_261.f0, "g_261.f0", print_hash_value); + transparent_crc(g_261.f1, "g_261.f1", print_hash_value); + transparent_crc(g_261.f2, "g_261.f2", print_hash_value); + transparent_crc(g_261.f3, "g_261.f3", print_hash_value); + transparent_crc(g_261.f4, "g_261.f4", print_hash_value); + transparent_crc(g_261.f5, "g_261.f5", print_hash_value); + transparent_crc(g_261.f6, "g_261.f6", print_hash_value); + transparent_crc(g_261.f7, "g_261.f7", print_hash_value); + transparent_crc(g_261.f8, "g_261.f8", print_hash_value); + transparent_crc(g_261.f9, "g_261.f9", print_hash_value); + transparent_crc(g_287, "g_287", print_hash_value); + transparent_crc(g_325, "g_325", print_hash_value); + transparent_crc(g_331, "g_331", print_hash_value); + transparent_crc(g_333, "g_333", print_hash_value); + transparent_crc(g_337, "g_337", print_hash_value); + transparent_crc(g_349, "g_349", print_hash_value); + transparent_crc(g_382, "g_382", print_hash_value); + for (i = 0; i < 1; i++) + { + for (j = 0; j < 1; j++) + { + transparent_crc(g_409[i][j], "g_409[i][j]", print_hash_value); + if (print_hash_value) printf("index = [%d][%d]\n", i, j); + + } + } + transparent_crc(g_410, "g_410", print_hash_value); + for (i = 0; i < 3; i++) + { + for (j = 0; j < 2; j++) + { + for (k = 0; k < 4; k++) + { + transparent_crc(g_445[i][j][k], "g_445[i][j][k]", print_hash_value); + if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k); + + } + } + } + transparent_crc(g_455, "g_455", print_hash_value); + for (i = 0; i < 4; i++) + { + for (j = 0; j < 3; j++) + { + transparent_crc(g_483[i][j], "g_483[i][j]", print_hash_value); + if (print_hash_value) printf("index = [%d][%d]\n", i, j); + + } + } + transparent_crc(g_533.f0, "g_533.f0", print_hash_value); + transparent_crc(g_533.f1, "g_533.f1", print_hash_value); + transparent_crc(g_533.f2, "g_533.f2", print_hash_value); + transparent_crc(g_533.f3.f0, "g_533.f3.f0", print_hash_value); + transparent_crc(g_533.f3.f1, "g_533.f3.f1", print_hash_value); + transparent_crc(g_533.f3.f2, "g_533.f3.f2", print_hash_value); + transparent_crc(g_533.f3.f3, "g_533.f3.f3", print_hash_value); + transparent_crc(g_533.f3.f4, "g_533.f3.f4", print_hash_value); + transparent_crc(g_533.f3.f5, "g_533.f3.f5", print_hash_value); + transparent_crc(g_533.f3.f6, "g_533.f3.f6", print_hash_value); + transparent_crc(g_533.f3.f7, "g_533.f3.f7", print_hash_value); + transparent_crc(g_533.f3.f8, "g_533.f3.f8", print_hash_value); + transparent_crc(g_533.f3.f9, "g_533.f3.f9", print_hash_value); + transparent_crc(g_533.f4.f0, "g_533.f4.f0", print_hash_value); + transparent_crc(g_533.f4.f1, "g_533.f4.f1", print_hash_value); + transparent_crc(g_533.f4.f2, "g_533.f4.f2", print_hash_value); + transparent_crc(g_533.f4.f3, "g_533.f4.f3", print_hash_value); + transparent_crc(g_533.f4.f4, "g_533.f4.f4", print_hash_value); + transparent_crc(g_533.f4.f5, "g_533.f4.f5", print_hash_value); + transparent_crc(g_533.f4.f6, "g_533.f4.f6", print_hash_value); + transparent_crc(g_533.f4.f7, "g_533.f4.f7", print_hash_value); + transparent_crc(g_533.f4.f8, "g_533.f4.f8", print_hash_value); + transparent_crc(g_533.f4.f9, "g_533.f4.f9", print_hash_value); + transparent_crc(g_533.f5, "g_533.f5", print_hash_value); + transparent_crc(g_542, "g_542", print_hash_value); + transparent_crc(g_543, "g_543", print_hash_value); + for (i = 0; i < 2; i++) + { + for (j = 0; j < 9; j++) + { + transparent_crc(g_647[i][j].f0, "g_647[i][j].f0", print_hash_value); + transparent_crc(g_647[i][j].f1, "g_647[i][j].f1", print_hash_value); + transparent_crc(g_647[i][j].f2, "g_647[i][j].f2", print_hash_value); + transparent_crc(g_647[i][j].f3.f0, "g_647[i][j].f3.f0", print_hash_value); + transparent_crc(g_647[i][j].f3.f1, "g_647[i][j].f3.f1", print_hash_value); + transparent_crc(g_647[i][j].f3.f2, "g_647[i][j].f3.f2", print_hash_value); + transparent_crc(g_647[i][j].f3.f3, "g_647[i][j].f3.f3", print_hash_value); + transparent_crc(g_647[i][j].f3.f4, "g_647[i][j].f3.f4", print_hash_value); + transparent_crc(g_647[i][j].f3.f5, "g_647[i][j].f3.f5", print_hash_value); + transparent_crc(g_647[i][j].f3.f6, "g_647[i][j].f3.f6", print_hash_value); + transparent_crc(g_647[i][j].f3.f7, "g_647[i][j].f3.f7", print_hash_value); + transparent_crc(g_647[i][j].f3.f8, "g_647[i][j].f3.f8", print_hash_value); + transparent_crc(g_647[i][j].f3.f9, "g_647[i][j].f3.f9", print_hash_value); + transparent_crc(g_647[i][j].f4.f0, "g_647[i][j].f4.f0", print_hash_value); + transparent_crc(g_647[i][j].f4.f1, "g_647[i][j].f4.f1", print_hash_value); + transparent_crc(g_647[i][j].f4.f2, "g_647[i][j].f4.f2", print_hash_value); + transparent_crc(g_647[i][j].f4.f3, "g_647[i][j].f4.f3", print_hash_value); + transparent_crc(g_647[i][j].f4.f4, "g_647[i][j].f4.f4", print_hash_value); + transparent_crc(g_647[i][j].f4.f5, "g_647[i][j].f4.f5", print_hash_value); + transparent_crc(g_647[i][j].f4.f6, "g_647[i][j].f4.f6", print_hash_value); + transparent_crc(g_647[i][j].f4.f7, "g_647[i][j].f4.f7", print_hash_value); + transparent_crc(g_647[i][j].f4.f8, "g_647[i][j].f4.f8", print_hash_value); + transparent_crc(g_647[i][j].f4.f9, "g_647[i][j].f4.f9", print_hash_value); + transparent_crc(g_647[i][j].f5, "g_647[i][j].f5", print_hash_value); + if (print_hash_value) printf("index = [%d][%d]\n", i, j); + + } + } + transparent_crc(g_649.f0, "g_649.f0", print_hash_value); + transparent_crc(g_649.f1, "g_649.f1", print_hash_value); + transparent_crc(g_649.f2, "g_649.f2", print_hash_value); + transparent_crc(g_649.f3.f0, "g_649.f3.f0", print_hash_value); + transparent_crc(g_649.f3.f1, "g_649.f3.f1", print_hash_value); + transparent_crc(g_649.f3.f2, "g_649.f3.f2", print_hash_value); + transparent_crc(g_649.f3.f3, "g_649.f3.f3", print_hash_value); + transparent_crc(g_649.f3.f4, "g_649.f3.f4", print_hash_value); + transparent_crc(g_649.f3.f5, "g_649.f3.f5", print_hash_value); + transparent_crc(g_649.f3.f6, "g_649.f3.f6", print_hash_value); + transparent_crc(g_649.f3.f7, "g_649.f3.f7", print_hash_value); + transparent_crc(g_649.f3.f8, "g_649.f3.f8", print_hash_value); + transparent_crc(g_649.f3.f9, "g_649.f3.f9", print_hash_value); + transparent_crc(g_649.f4.f0, "g_649.f4.f0", print_hash_value); + transparent_crc(g_649.f4.f1, "g_649.f4.f1", print_hash_value); + transparent_crc(g_649.f4.f2, "g_649.f4.f2", print_hash_value); + transparent_crc(g_649.f4.f3, "g_649.f4.f3", print_hash_value); + transparent_crc(g_649.f4.f4, "g_649.f4.f4", print_hash_value); + transparent_crc(g_649.f4.f5, "g_649.f4.f5", print_hash_value); + transparent_crc(g_649.f4.f6, "g_649.f4.f6", print_hash_value); + transparent_crc(g_649.f4.f7, "g_649.f4.f7", print_hash_value); + transparent_crc(g_649.f4.f8, "g_649.f4.f8", print_hash_value); + transparent_crc(g_649.f4.f9, "g_649.f4.f9", print_hash_value); + transparent_crc(g_649.f5, "g_649.f5", print_hash_value); + for (i = 0; i < 1; i++) + { + for (j = 0; j < 3; j++) + { + for (k = 0; k < 6; k++) + { + transparent_crc(g_839[i][j][k], "g_839[i][j][k]", print_hash_value); + if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k); + + } + } + } + transparent_crc(g_902, "g_902", print_hash_value); + for (i = 0; i < 4; i++) + { + transparent_crc(g_916[i], "g_916[i]", print_hash_value); + if (print_hash_value) printf("index = [%d]\n", i); + + } + transparent_crc(g_955.f0, "g_955.f0", print_hash_value); + transparent_crc(g_955.f1, "g_955.f1", print_hash_value); + transparent_crc(g_955.f2, "g_955.f2", print_hash_value); + transparent_crc(g_955.f3, "g_955.f3", print_hash_value); + transparent_crc(g_1003, "g_1003", print_hash_value); + transparent_crc(g_1004, "g_1004", print_hash_value); + transparent_crc(g_1048, "g_1048", print_hash_value); + transparent_crc(g_1075.f0, "g_1075.f0", print_hash_value); + transparent_crc(g_1075.f1, "g_1075.f1", print_hash_value); + transparent_crc(g_1075.f2, "g_1075.f2", print_hash_value); + transparent_crc(g_1075.f3, "g_1075.f3", print_hash_value); + transparent_crc(g_1137, "g_1137", print_hash_value); + transparent_crc(g_1209, "g_1209", print_hash_value); + transparent_crc(g_1211, "g_1211", print_hash_value); + for (i = 0; i < 8; i++) + { + transparent_crc(g_1326[i], "g_1326[i]", print_hash_value); + if (print_hash_value) printf("index = [%d]\n", i); + + } + transparent_crc(g_1518, "g_1518", print_hash_value); + transparent_crc(g_1530, "g_1530", print_hash_value); + transparent_crc(g_1531, "g_1531", print_hash_value); + transparent_crc(g_1540, "g_1540", print_hash_value); + transparent_crc(g_1541, "g_1541", print_hash_value); + transparent_crc(g_1542, "g_1542", print_hash_value); + transparent_crc(g_1543, "g_1543", print_hash_value); + transparent_crc(g_1544, "g_1544", print_hash_value); + transparent_crc(g_1639, "g_1639", print_hash_value); + for (i = 0; i < 1; i++) + { + for (j = 0; j < 6; j++) + { + for (k = 0; k < 9; k++) + { + transparent_crc(g_1737[i][j][k].f0, "g_1737[i][j][k].f0", print_hash_value); + transparent_crc(g_1737[i][j][k].f1, "g_1737[i][j][k].f1", print_hash_value); + transparent_crc(g_1737[i][j][k].f2, "g_1737[i][j][k].f2", print_hash_value); + transparent_crc(g_1737[i][j][k].f3, "g_1737[i][j][k].f3", print_hash_value); + if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k); + + } + } + } + platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value); + return 0; +} + +/************************ statistics ************************* +XXX max struct depth: 2 +breakdown: + depth: 0, occurrence: 492 + depth: 1, occurrence: 24 + depth: 2, occurrence: 12 +XXX total union variables: 30 + +XXX non-zero bitfields defined in structs: 6 +XXX zero bitfields defined in structs: 0 +XXX const bitfields defined in structs: 1 +XXX volatile bitfields defined in structs: 0 +XXX structs with bitfields in the program: 72 +breakdown: + indirect level: 0, occurrence: 36 + indirect level: 1, occurrence: 20 + indirect level: 2, occurrence: 10 + indirect level: 3, occurrence: 6 +XXX full-bitfields structs in the program: 12 +breakdown: + indirect level: 0, occurrence: 12 +XXX times a bitfields struct's address is taken: 65 +XXX times a bitfields struct on LHS: 0 +XXX times a bitfields struct on RHS: 82 +XXX times a single bitfield on LHS: 2 +XXX times a single bitfield on RHS: 63 + +XXX max expression depth: 40 +breakdown: + depth: 1, occurrence: 492 + depth: 2, occurrence: 134 + depth: 3, occurrence: 17 + depth: 4, occurrence: 8 + depth: 5, occurrence: 6 + depth: 6, occurrence: 5 + depth: 7, occurrence: 3 + depth: 8, occurrence: 4 + depth: 9, occurrence: 1 + depth: 10, occurrence: 3 + depth: 11, occurrence: 2 + depth: 12, occurrence: 3 + depth: 13, occurrence: 2 + depth: 14, occurrence: 5 + depth: 15, occurrence: 3 + depth: 16, occurrence: 3 + depth: 17, occurrence: 5 + depth: 18, occurrence: 7 + depth: 19, occurrence: 4 + depth: 20, occurrence: 4 + depth: 21, occurrence: 6 + depth: 22, occurrence: 4 + depth: 24, occurrence: 1 + depth: 26, occurrence: 1 + depth: 28, occurrence: 1 + depth: 29, occurrence: 2 + depth: 33, occurrence: 1 + depth: 38, occurrence: 1 + depth: 40, occurrence: 1 + +XXX total number of pointers: 539 + +XXX times a variable address is taken: 1073 +XXX times a pointer is dereferenced on RHS: 96 +breakdown: + depth: 1, occurrence: 92 + depth: 2, occurrence: 3 + depth: 3, occurrence: 1 +XXX times a pointer is dereferenced on LHS: 267 +breakdown: + depth: 1, occurrence: 261 + depth: 2, occurrence: 6 +XXX times a pointer is compared with null: 19 +XXX times a pointer is compared with address of another variable: 4 +XXX times a pointer is compared with another pointer: 10 +XXX times a pointer is qualified to be dereferenced: 6217 + +XXX max dereference level: 3 +breakdown: + level: 0, occurrence: 0 + level: 1, occurrence: 2752 + level: 2, occurrence: 320 + level: 3, occurrence: 6 +XXX number of pointers point to pointers: 169 +XXX number of pointers point to scalars: 315 +XXX number of pointers point to structs: 37 +XXX percent of pointers has null in alias set: 30.4 +XXX average alias set size: 1.56 + +XXX times a non-volatile is read: 1340 +XXX times a non-volatile is write: 887 +XXX times a volatile is read: 0 +XXX times read thru a pointer: 0 +XXX times a volatile is write: 0 +XXX times written thru a pointer: 0 +XXX times a volatile is available for access: 0 +XXX percentage of non-volatile access: 100 + +XXX forward jumps: 0 +XXX backward jumps: 7 + +XXX stmts: 464 +XXX max block depth: 5 +breakdown: + depth: 0, occurrence: 36 + depth: 1, occurrence: 41 + depth: 2, occurrence: 57 + depth: 3, occurrence: 72 + depth: 4, occurrence: 111 + depth: 5, occurrence: 147 + +XXX percentage a fresh-made variable is used: 18.7 +XXX percentage an existing variable is used: 81.3 +FYI: the random generator makes assumptions about the integer size. See platform.info for more details. +********************* end of statistics **********************/ + diff --git a/tests/fuzz/12.c.txt b/tests/fuzz/12.c.txt new file mode 100644 index 00000000..28ac318b --- /dev/null +++ b/tests/fuzz/12.c.txt @@ -0,0 +1 @@ +checksum = FCD45C53 diff --git a/tests/fuzz/csmith_driver.py b/tests/fuzz/csmith_driver.py index 6c6965df..b60e67f7 100755 --- a/tests/fuzz/csmith_driver.py +++ b/tests/fuzz/csmith_driver.py @@ -20,7 +20,7 @@ CSMITH_CFLAGS = ['-I' + os.path.expanduser('~/Dev/csmith/runtime/')] filename = os.path.join(shared.CANONICAL_TEMP_DIR, 'fuzzcode') -shared.DEFAULT_TIMEOUT = 1 +shared.DEFAULT_TIMEOUT = 5 tried = 0 @@ -48,11 +48,11 @@ while 1: shared.execute([shared.CLANG_CC, filename + '.c', '-o', filename + '3'] + CSMITH_CFLAGS, stderr=PIPE) print '3) Run natively' try: - correct1 = shared.timeout_run(Popen([filename + '1'], stdout=PIPE, stderr=PIPE), 3) + correct1 = shared.jsrun.timeout_run(Popen([filename + '1'], stdout=PIPE, stderr=PIPE), 3) if 'Segmentation fault' in correct1 or len(correct1) < 10: raise Exception('segfault') - correct2 = shared.timeout_run(Popen([filename + '2'], stdout=PIPE, stderr=PIPE), 3) + correct2 = shared.jsrun.timeout_run(Popen([filename + '2'], stdout=PIPE, stderr=PIPE), 3) if 'Segmentation fault' in correct2 or len(correct2) < 10: raise Exception('segfault') - correct3 = shared.timeout_run(Popen([filename + '3'], stdout=PIPE, stderr=PIPE), 3) + correct3 = shared.jsrun.timeout_run(Popen([filename + '3'], stdout=PIPE, stderr=PIPE), 3) if 'Segmentation fault' in correct3 or len(correct3) < 10: raise Exception('segfault') if correct1 != correct3: raise Exception('clang opts change result') except Exception, e: @@ -114,7 +114,13 @@ while 1: break # asm.js testing - assert 'warning: Successfully compiled asm.js code' in js2, 'must validate' + if 'warning: Successfully compiled asm.js code' not in js2: + print "ODIN VALIDATION BUG" + notes['embug'] += 1 + fails += 1 + shutil.copyfile('fuzzcode.c', 'newfail%d.c' % fails) + continue + js2 = js2.replace('\nwarning: Successfully compiled asm.js code\n', '') assert js2 == correct1 or js2 == correct2, ''.join([a.rstrip()+'\n' for a in difflib.unified_diff(correct1.split('\n'), js2.split('\n'), fromfile='expected', tofile='actual')]) + 'ODIN FAIL' diff --git a/tests/hello_world_gles_full.c b/tests/hello_world_gles_full.c new file mode 100644 index 00000000..cca66506 --- /dev/null +++ b/tests/hello_world_gles_full.c @@ -0,0 +1,742 @@ +/* + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Ported to GLES2. + * Kristian Høgsberg <krh@bitplanet.net> + * May 3, 2010 + * + * Improve GLES2 port: + * * Refactor gear drawing. + * * Use correct normals for surfaces. + * * Improve shader. + * * Use perspective projection transformation. + * * Add FPS count. + * * Add comments. + * Alexandros Frantzis <alexandros.frantzis@linaro.org> + * Jul 13, 2010 + */ + +#define GL_GLEXT_PROTOTYPES +#define EGL_EGLEXT_PROTOTYPES + +#define _GNU_SOURCE + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/time.h> +#include <unistd.h> +#ifdef __APPLE__ +#include <OpenGL/gl.h> +#include <Glut/glut.h> +#else +#include <GL/gl.h> +#include <GL/glut.h> +#endif + +#define STRIPS_PER_TOOTH 7 +#define VERTICES_PER_TOOTH 34 +#define GEAR_VERTEX_STRIDE 6 + +#ifndef HAVE_BUILTIN_SINCOS +#define sincos _sincos +static void +sincos (double a, double *s, double *c) +{ + *s = sin (a); + *c = cos (a); +} +#endif + +/** + * Struct describing the vertices in triangle strip + */ +struct vertex_strip { + /** The first vertex in the strip */ + GLint first; + /** The number of consecutive vertices in the strip after the first */ + GLint count; +}; + +/* Each vertex consist of GEAR_VERTEX_STRIDE GLfloat attributes */ +typedef GLfloat GearVertex[GEAR_VERTEX_STRIDE]; + +/** + * Struct representing a gear. + */ +struct gear { + /** The array of vertices comprising the gear */ + GearVertex *vertices; + /** The number of vertices comprising the gear */ + int nvertices; + /** The array of triangle strips comprising the gear */ + struct vertex_strip *strips; + /** The number of triangle strips comprising the gear */ + int nstrips; + /** The Vertex Buffer Object holding the vertices in the graphics card */ + GLuint vbo; +}; + +/** The view rotation [x, y, z] */ +static GLfloat view_rot[3] = { 20.0, 30.0, 0.0 }; +/** The gears */ +static struct gear *gear1, *gear2, *gear3; +/** The current gear rotation angle */ +static GLfloat angle = 0.0; +/** The location of the shader uniforms */ +static GLuint ModelViewProjectionMatrix_location, + NormalMatrix_location, + LightSourcePosition_location, + MaterialColor_location; +/** The projection matrix */ +static GLfloat ProjectionMatrix[16]; +/** The direction of the directional light for the scene */ +static const GLfloat LightSourcePosition[4] = { 5.0, 5.0, 10.0, 1.0}; + +/** + * Fills a gear vertex. + * + * @param v the vertex to fill + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coortinate + * @param n pointer to the normal table + * + * @return the operation error code + */ +static GearVertex * +vert(GearVertex *v, GLfloat x, GLfloat y, GLfloat z, GLfloat n[3]) +{ + v[0][0] = x; + v[0][1] = y; + v[0][2] = z; + v[0][3] = n[0]; + v[0][4] = n[1]; + v[0][5] = n[2]; + + return v + 1; +} + +/** + * Create a gear wheel. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + * + * @return pointer to the constructed struct gear + */ +static struct gear * +create_gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth) +{ + GLfloat r0, r1, r2; + GLfloat da; + GearVertex *v; + struct gear *gear; + double s[5], c[5]; + GLfloat normal[3]; + int cur_strip = 0; + int i; + + /* Allocate memory for the gear */ + gear = malloc(sizeof *gear); + if (gear == NULL) + return NULL; + + /* Calculate the radii used in the gear */ + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + /* Allocate memory for the triangle strip information */ + gear->nstrips = STRIPS_PER_TOOTH * teeth; + gear->strips = calloc(gear->nstrips, sizeof (*gear->strips)); + + /* Allocate memory for the vertices */ + gear->vertices = calloc(VERTICES_PER_TOOTH * teeth, sizeof(*gear->vertices)); + v = gear->vertices; + + for (i = 0; i < teeth; i++) { + /* Calculate needed sin/cos for varius angles */ + sincos(i * 2.0 * M_PI / teeth, &s[0], &c[0]); + sincos(i * 2.0 * M_PI / teeth + da, &s[1], &c[1]); + sincos(i * 2.0 * M_PI / teeth + da * 2, &s[2], &c[2]); + sincos(i * 2.0 * M_PI / teeth + da * 3, &s[3], &c[3]); + sincos(i * 2.0 * M_PI / teeth + da * 4, &s[4], &c[4]); + + /* A set of macros for making the creation of the gears easier */ +#define GEAR_POINT(r, da) { (r) * c[(da)], (r) * s[(da)] } +#define SET_NORMAL(x, y, z) do { \ + normal[0] = (x); normal[1] = (y); normal[2] = (z); \ +} while(0) + +#define GEAR_VERT(v, point, sign) vert((v), p[(point)].x, p[(point)].y, (sign) * width * 0.5, normal) + +#define START_STRIP do { \ + gear->strips[cur_strip].first = v - gear->vertices; \ +} while(0); + +#define END_STRIP do { \ + int _tmp = (v - gear->vertices); \ + gear->strips[cur_strip].count = _tmp - gear->strips[cur_strip].first; \ + cur_strip++; \ +} while (0) + +#define QUAD_WITH_NORMAL(p1, p2) do { \ + SET_NORMAL((p[(p1)].y - p[(p2)].y), -(p[(p1)].x - p[(p2)].x), 0); \ + v = GEAR_VERT(v, (p1), -1); \ + v = GEAR_VERT(v, (p1), 1); \ + v = GEAR_VERT(v, (p2), -1); \ + v = GEAR_VERT(v, (p2), 1); \ +} while(0) + + struct point { + GLfloat x; + GLfloat y; + }; + + /* Create the 7 points (only x,y coords) used to draw a tooth */ + struct point p[7] = { + GEAR_POINT(r2, 1), // 0 + GEAR_POINT(r2, 2), // 1 + GEAR_POINT(r1, 0), // 2 + GEAR_POINT(r1, 3), // 3 + GEAR_POINT(r0, 0), // 4 + GEAR_POINT(r1, 4), // 5 + GEAR_POINT(r0, 4), // 6 + }; + + /* Front face */ + START_STRIP; + SET_NORMAL(0, 0, 1.0); + v = GEAR_VERT(v, 0, +1); + v = GEAR_VERT(v, 1, +1); + v = GEAR_VERT(v, 2, +1); + v = GEAR_VERT(v, 3, +1); + v = GEAR_VERT(v, 4, +1); + v = GEAR_VERT(v, 5, +1); + v = GEAR_VERT(v, 6, +1); + END_STRIP; + + /* Inner face */ + START_STRIP; + QUAD_WITH_NORMAL(4, 6); + END_STRIP; + + /* Back face */ + START_STRIP; + SET_NORMAL(0, 0, -1.0); + v = GEAR_VERT(v, 6, -1); + v = GEAR_VERT(v, 5, -1); + v = GEAR_VERT(v, 4, -1); + v = GEAR_VERT(v, 3, -1); + v = GEAR_VERT(v, 2, -1); + v = GEAR_VERT(v, 1, -1); + v = GEAR_VERT(v, 0, -1); + END_STRIP; + + /* Outer face */ + START_STRIP; + QUAD_WITH_NORMAL(0, 2); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(1, 0); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(3, 1); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(5, 3); + END_STRIP; + } + + gear->nvertices = (v - gear->vertices); + + /* Store the vertices in a vertex buffer object (VBO) */ + glGenBuffers(1, &gear->vbo); + glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + glBufferData(GL_ARRAY_BUFFER, gear->nvertices * sizeof(GearVertex), + gear->vertices, GL_STATIC_DRAW); + + return gear; +} + +/** + * Multiplies two 4x4 matrices. + * + * The result is stored in matrix m. + * + * @param m the first matrix to multiply + * @param n the second matrix to multiply + */ +static void +multiply(GLfloat *m, const GLfloat *n) +{ + GLfloat tmp[16]; + const GLfloat *row, *column; + div_t d; + int i, j; + + for (i = 0; i < 16; i++) { + tmp[i] = 0; + d = div(i, 4); + row = n + d.quot * 4; + column = m + d.rem; + for (j = 0; j < 4; j++) + tmp[i] += row[j] * column[j * 4]; + } + memcpy(m, &tmp, sizeof tmp); +} + +/** + * Rotates a 4x4 matrix. + * + * @param[in,out] m the matrix to rotate + * @param angle the angle to rotate + * @param x the x component of the direction to rotate to + * @param y the y component of the direction to rotate to + * @param z the z component of the direction to rotate to + */ +static void +rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + double s, c; + + sincos(angle, &s, &c); + GLfloat r[16] = { + x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0, + x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0, + x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0, + 0, 0, 0, 1 + }; + + multiply(m, r); +} + + +/** + * Translates a 4x4 matrix. + * + * @param[in,out] m the matrix to translate + * @param x the x component of the direction to translate to + * @param y the y component of the direction to translate to + * @param z the z component of the direction to translate to + */ +static void +translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 }; + + multiply(m, t); +} + +/** + * Creates an identity 4x4 matrix. + * + * @param m the matrix make an identity matrix + */ +static void +identity(GLfloat *m) +{ + GLfloat t[16] = { + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + }; + + memcpy(m, t, sizeof(t)); +} + +/** + * Transposes a 4x4 matrix. + * + * @param m the matrix to transpose + */ +static void +transpose(GLfloat *m) +{ + GLfloat t[16] = { + m[0], m[4], m[8], m[12], + m[1], m[5], m[9], m[13], + m[2], m[6], m[10], m[14], + m[3], m[7], m[11], m[15]}; + + memcpy(m, t, sizeof(t)); +} + +/** + * Inverts a 4x4 matrix. + * + * This function can currently handle only pure translation-rotation matrices. + * Read http://www.gamedev.net/community/forums/topic.asp?topic_id=425118 + * for an explanation. + */ +static void +invert(GLfloat *m) +{ + GLfloat t[16]; + identity(t); + + // Extract and invert the translation part 't'. The inverse of a + // translation matrix can be calculated by negating the translation + // coordinates. + t[12] = -m[12]; t[13] = -m[13]; t[14] = -m[14]; + + // Invert the rotation part 'r'. The inverse of a rotation matrix is + // equal to its transpose. + m[12] = m[13] = m[14] = 0; + transpose(m); + + // inv(m) = inv(r) * inv(t) + multiply(m, t); +} + +/** + * Calculate a perspective projection transformation. + * + * @param m the matrix to save the transformation in + * @param fovy the field of view in the y direction + * @param aspect the view aspect ratio + * @param zNear the near clipping plane + * @param zFar the far clipping plane + */ +void perspective(GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) +{ + GLfloat tmp[16]; + identity(tmp); + + double sine, cosine, cotangent, deltaZ; + GLfloat radians = fovy / 2 * M_PI / 180; + + deltaZ = zFar - zNear; + sincos(radians, &sine, &cosine); + + if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) + return; + + cotangent = cosine / sine; + + tmp[0] = cotangent / aspect; + tmp[5] = cotangent; + tmp[10] = -(zFar + zNear) / deltaZ; + tmp[11] = -1; + tmp[14] = -2 * zNear * zFar / deltaZ; + tmp[15] = 0; + + memcpy(m, tmp, sizeof(tmp)); +} + +/** + * Draws a gear. + * + * @param gear the gear to draw + * @param transform the current transformation matrix + * @param x the x position to draw the gear at + * @param y the y position to draw the gear at + * @param angle the rotation angle of the gear + * @param color the color of the gear + */ +static void +draw_gear(struct gear *gear, GLfloat *transform, + GLfloat x, GLfloat y, GLfloat angle, const GLfloat color[4]) +{ + GLfloat model_view[16]; + GLfloat normal_matrix[16]; + GLfloat model_view_projection[16]; + + /* Translate and rotate the gear */ + memcpy(model_view, transform, sizeof (model_view)); + translate(model_view, x, y, 0); + rotate(model_view, 2 * M_PI * angle / 360.0, 0, 0, 1); + + /* Create and set the ModelViewProjectionMatrix */ + memcpy(model_view_projection, ProjectionMatrix, sizeof(model_view_projection)); + multiply(model_view_projection, model_view); + + glUniformMatrix4fv(ModelViewProjectionMatrix_location, 1, GL_FALSE, + model_view_projection); + + /* + * Create and set the NormalMatrix. It's the inverse transpose of the + * ModelView matrix. + */ + memcpy(normal_matrix, model_view, sizeof (normal_matrix)); + invert(normal_matrix); + transpose(normal_matrix); + glUniformMatrix4fv(NormalMatrix_location, 1, GL_FALSE, normal_matrix); + + /* Set the gear color */ + glUniform4fv(MaterialColor_location, 1, color); + + /* Set the vertex buffer object to use */ + glBindBuffer(GL_ARRAY_BUFFER, 0); + + /* Set up the position of the attributes in the vertex buffer object */ + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), *gear->vertices); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), ((float*)*gear->vertices) + 3*4); + /* Enable the attributes */ + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + /* Draw the triangle strips that comprise the gear */ + int n; + for (n = 0; n < gear->nstrips; n++) + glDrawArrays(GL_TRIANGLE_STRIP, gear->strips[n].first, gear->strips[n].count); + + /* Disable the attributes */ + glDisableVertexAttribArray(1); + glDisableVertexAttribArray(0); +} + +/** + * Draws the gears. + */ +static void +gears_draw(void) +{ + const static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; + const static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; + const static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; + GLfloat transform[16]; + identity(transform); + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + /* Translate and rotate the view */ + translate(transform, 0, 0, -20); + rotate(transform, 2 * M_PI * view_rot[0] / 360.0, 1, 0, 0); + rotate(transform, 2 * M_PI * view_rot[1] / 360.0, 0, 1, 0); + rotate(transform, 2 * M_PI * view_rot[2] / 360.0, 0, 0, 1); + + /* Draw the gears */ + draw_gear(gear1, transform, -3.0, -2.0, angle, red); + draw_gear(gear2, transform, 3.1, -2.0, -2 * angle - 9.0, green); + draw_gear(gear3, transform, -3.1, 4.2, -2 * angle - 25.0, blue); + + glutSwapBuffers(); +} + +/** + * Handles a new window size or exposure. + * + * @param width the window width + * @param height the window height + */ +static void +gears_reshape(int width, int height) +{ + /* Update the projection matrix */ + perspective(ProjectionMatrix, 60.0, width / (float)height, 1.0, 1024.0); + + /* Set the viewport */ + glViewport(0, 0, (GLint) width, (GLint) height); +} + +/** + * Handles special glut events. + * + * @param special the event to handle. + */ +static void +gears_special(int special, int crap, int morecrap) +{ + switch (special) { + case GLUT_KEY_LEFT: + view_rot[1] += 5.0; + break; + case GLUT_KEY_RIGHT: + view_rot[1] -= 5.0; + break; + case GLUT_KEY_UP: + view_rot[0] += 5.0; + break; + case GLUT_KEY_DOWN: + view_rot[0] -= 5.0; + break; + case GLUT_KEY_F11: + glutFullScreen(); + break; + } +} + +static void +gears_idle(void) +{ + static int frames = 0; + static double tRot0 = -1.0, tRate0 = -1.0; + double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; + + if (tRot0 < 0.0) + tRot0 = t; + dt = t - tRot0; + tRot0 = t; + + /* advance rotation for next frame */ + angle += 70.0 * dt; /* 70 degrees per second */ + if (angle > 3600.0) + angle -= 3600.0; + + glutPostRedisplay(); + frames++; + + if (tRate0 < 0.0) + tRate0 = t; + if (t - tRate0 >= 5.0) { + GLfloat seconds = t - tRate0; + GLfloat fps = frames / seconds; + printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, + fps); + tRate0 = t; + frames = 0; + } +} + +static const char vertex_shader[] = +"attribute vec3 position;\n" +"attribute vec3 normal;\n" +"\n" +"uniform mat4 ModelViewProjectionMatrix;\n" +"uniform mat4 NormalMatrix;\n" +"uniform vec4 LightSourcePosition;\n" +"uniform vec4 MaterialColor;\n" +"\n" +"varying vec4 Color;\n" +"\n" +"void main(void)\n" +"{\n" +" // Transform the normal to eye coordinates\n" +" vec3 N = normalize(vec3(NormalMatrix * vec4(normal, 1.0)));\n" +"\n" +" // The LightSourcePosition is actually its direction for directional light\n" +" vec3 L = normalize(LightSourcePosition.xyz);\n" +"\n" +" // Multiply the diffuse value by the vertex color (which is fixed in this case)\n" +" // to get the actual color that we will use to draw this vertex with\n" +" float diffuse = max(dot(N, L), 0.0);\n" +" Color = diffuse * MaterialColor;\n" +"\n" +" // Transform the position to clip coordinates\n" +" gl_Position = ModelViewProjectionMatrix * vec4(position, 1.0);\n" +"}"; + +static const char fragment_shader[] = +"#ifdef GL_ES\n" +"precision mediump float;\n" +"#endif\n" +"varying vec4 Color;\n" +"\n" +"void main(void)\n" +"{\n" +" gl_FragColor = Color;\n" +"}"; + +static void +gears_init(void) +{ + GLuint v, f, program; + const char *p; + char msg[512]; + + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + + /* Compile the vertex shader */ + p = vertex_shader; + v = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(v, 1, &p, NULL); + glCompileShader(v); + glGetShaderInfoLog(v, sizeof msg, NULL, msg); + printf("vertex shader info: %s\n", msg); + + /* Compile the fragment shader */ + p = fragment_shader; + f = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(f, 1, &p, NULL); + glCompileShader(f); + glGetShaderInfoLog(f, sizeof msg, NULL, msg); + printf("fragment shader info: %s\n", msg); + + /* Create and link the shader program */ + program = glCreateProgram(); + glAttachShader(program, v); + glAttachShader(program, f); + glBindAttribLocation(program, 0, "position"); + glBindAttribLocation(program, 1, "normal"); + + glLinkProgram(program); + glGetProgramInfoLog(program, sizeof msg, NULL, msg); + printf("info: %s\n", msg); + + /* Enable the shaders */ + glUseProgram(program); + + /* Get the locations of the uniforms so we can access them */ + ModelViewProjectionMatrix_location = glGetUniformLocation(program, "ModelViewProjectionMatrix"); + NormalMatrix_location = glGetUniformLocation(program, "NormalMatrix"); + LightSourcePosition_location = glGetUniformLocation(program, "LightSourcePosition"); + MaterialColor_location = glGetUniformLocation(program, "MaterialColor"); + + /* Set the LightSourcePosition uniform which is constant throught the program */ + glUniform4fv(LightSourcePosition_location, 1, LightSourcePosition); + + /* make the gears */ + gear1 = create_gear(1.0, 4.0, 1.0, 20, 0.7); + gear2 = create_gear(0.5, 2.0, 2.0, 10, 0.7); + gear3 = create_gear(1.3, 2.0, 0.5, 10, 0.7); +} + +int +main(int argc, char *argv[]) +{ + /* Initialize the window */ + glutInit(&argc, argv); + glutInitWindowSize(300, 300); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); + + glutCreateWindow("es2gears"); + + /* Set up glut callback functions */ + glutIdleFunc (gears_idle); + glutReshapeFunc(gears_reshape); + glutDisplayFunc(gears_draw); + glutSpecialFunc(gears_special); + + /* Initialize the gears */ + gears_init(); + + glutMainLoop(); + + return 0; +} diff --git a/tests/hello_world_gles_full_944.c b/tests/hello_world_gles_full_944.c new file mode 100644 index 00000000..51766475 --- /dev/null +++ b/tests/hello_world_gles_full_944.c @@ -0,0 +1,751 @@ +/* + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Ported to GLES2. + * Kristian Høgsberg <krh@bitplanet.net> + * May 3, 2010 + * + * Improve GLES2 port: + * * Refactor gear drawing. + * * Use correct normals for surfaces. + * * Improve shader. + * * Use perspective projection transformation. + * * Add FPS count. + * * Add comments. + * Alexandros Frantzis <alexandros.frantzis@linaro.org> + * Jul 13, 2010 + */ + +#define GL_GLEXT_PROTOTYPES +#define EGL_EGLEXT_PROTOTYPES + +#define _GNU_SOURCE + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/time.h> +#include <unistd.h> +#ifdef __APPLE__ +#include <OpenGL/gl.h> +#include <Glut/glut.h> +#else +#include <GL/gl.h> +#include <GL/glut.h> +#endif + +#define STRIPS_PER_TOOTH 7 +#define VERTICES_PER_TOOTH 34 +#define GEAR_VERTEX_STRIDE 6 + +#ifndef HAVE_BUILTIN_SINCOS +#define sincos _sincos +static void +sincos (double a, double *s, double *c) +{ + *s = sin (a); + *c = cos (a); +} +#endif + +/** + * Struct describing the vertices in triangle strip + */ +struct vertex_strip { + /** The first vertex in the strip */ + GLint first; + /** The number of consecutive vertices in the strip after the first */ + GLint count; +}; + +/* Each vertex consist of GEAR_VERTEX_STRIDE GLfloat attributes */ +typedef GLfloat GearVertex[GEAR_VERTEX_STRIDE]; + +/** + * Struct representing a gear. + */ +struct gear { + /** The array of vertices comprising the gear */ + GearVertex *vertices; + /** The number of vertices comprising the gear */ + int nvertices; + /** The array of triangle strips comprising the gear */ + struct vertex_strip *strips; + /** The number of triangle strips comprising the gear */ + int nstrips; + /** The Vertex Buffer Object holding the vertices in the graphics card */ + GLuint vbo; +}; + +/** The view rotation [x, y, z] */ +static GLfloat view_rot[3] = { 20.0, 30.0, 0.0 }; +/** The gears */ +static struct gear *gear1, *gear2, *gear3; +/** The current gear rotation angle */ +static GLfloat angle = 0.0; +/** The location of the shader uniforms */ +static GLuint ModelViewProjectionMatrix_location, + NormalMatrix_location, + LightSourcePosition_location, + MaterialColor_location; +/** The projection matrix */ +static GLfloat ProjectionMatrix[16]; +/** The direction of the directional light for the scene */ +static const GLfloat LightSourcePosition[4] = { 5.0, 5.0, 10.0, 1.0}; + +/** + * Fills a gear vertex. + * + * @param v the vertex to fill + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coortinate + * @param n pointer to the normal table + * + * @return the operation error code + */ +static GearVertex * +vert(GearVertex *v, GLfloat x, GLfloat y, GLfloat z, GLfloat n[3]) +{ + v[0][0] = x; + v[0][1] = y; + v[0][2] = z; + v[0][3] = n[0]; + v[0][4] = n[1]; + v[0][5] = n[2]; + + return v + 1; +} + +/** + * Create a gear wheel. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + * + * @return pointer to the constructed struct gear + */ +static struct gear * +create_gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth) +{ + GLfloat r0, r1, r2; + GLfloat da; + GearVertex *v; + struct gear *gear; + double s[5], c[5]; + GLfloat normal[3]; + int cur_strip = 0; + int i; + + /* Allocate memory for the gear */ + gear = malloc(sizeof *gear); + if (gear == NULL) + return NULL; + + /* Calculate the radii used in the gear */ + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + /* Allocate memory for the triangle strip information */ + gear->nstrips = STRIPS_PER_TOOTH * teeth; + gear->strips = calloc(gear->nstrips, sizeof (*gear->strips)); + + /* Allocate memory for the vertices */ + gear->vertices = calloc(VERTICES_PER_TOOTH * teeth, sizeof(*gear->vertices)); + v = gear->vertices; + + for (i = 0; i < teeth; i++) { + /* Calculate needed sin/cos for varius angles */ + sincos(i * 2.0 * M_PI / teeth, &s[0], &c[0]); + sincos(i * 2.0 * M_PI / teeth + da, &s[1], &c[1]); + sincos(i * 2.0 * M_PI / teeth + da * 2, &s[2], &c[2]); + sincos(i * 2.0 * M_PI / teeth + da * 3, &s[3], &c[3]); + sincos(i * 2.0 * M_PI / teeth + da * 4, &s[4], &c[4]); + + /* A set of macros for making the creation of the gears easier */ +#define GEAR_POINT(r, da) { (r) * c[(da)], (r) * s[(da)] } +#define SET_NORMAL(x, y, z) do { \ + normal[0] = (x); normal[1] = (y); normal[2] = (z); \ +} while(0) + +#define GEAR_VERT(v, point, sign) vert((v), p[(point)].x, p[(point)].y, (sign) * width * 0.5, normal) + +#define START_STRIP do { \ + gear->strips[cur_strip].first = v - gear->vertices; \ +} while(0); + +#define END_STRIP do { \ + int _tmp = (v - gear->vertices); \ + gear->strips[cur_strip].count = _tmp - gear->strips[cur_strip].first; \ + cur_strip++; \ +} while (0) + +#define QUAD_WITH_NORMAL(p1, p2) do { \ + SET_NORMAL((p[(p1)].y - p[(p2)].y), -(p[(p1)].x - p[(p2)].x), 0); \ + v = GEAR_VERT(v, (p1), -1); \ + v = GEAR_VERT(v, (p1), 1); \ + v = GEAR_VERT(v, (p2), -1); \ + v = GEAR_VERT(v, (p2), 1); \ +} while(0) + + struct point { + GLfloat x; + GLfloat y; + }; + + /* Create the 7 points (only x,y coords) used to draw a tooth */ + struct point p[7] = { + GEAR_POINT(r2, 1), // 0 + GEAR_POINT(r2, 2), // 1 + GEAR_POINT(r1, 0), // 2 + GEAR_POINT(r1, 3), // 3 + GEAR_POINT(r0, 0), // 4 + GEAR_POINT(r1, 4), // 5 + GEAR_POINT(r0, 4), // 6 + }; + + /* Front face */ + START_STRIP; + SET_NORMAL(0, 0, 1.0); + v = GEAR_VERT(v, 0, +1); + v = GEAR_VERT(v, 1, +1); + v = GEAR_VERT(v, 2, +1); + v = GEAR_VERT(v, 3, +1); + v = GEAR_VERT(v, 4, +1); + v = GEAR_VERT(v, 5, +1); + v = GEAR_VERT(v, 6, +1); + END_STRIP; + + /* Inner face */ + START_STRIP; + QUAD_WITH_NORMAL(4, 6); + END_STRIP; + + /* Back face */ + START_STRIP; + SET_NORMAL(0, 0, -1.0); + v = GEAR_VERT(v, 6, -1); + v = GEAR_VERT(v, 5, -1); + v = GEAR_VERT(v, 4, -1); + v = GEAR_VERT(v, 3, -1); + v = GEAR_VERT(v, 2, -1); + v = GEAR_VERT(v, 1, -1); + v = GEAR_VERT(v, 0, -1); + END_STRIP; + + /* Outer face */ + START_STRIP; + QUAD_WITH_NORMAL(0, 2); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(1, 0); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(3, 1); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(5, 3); + END_STRIP; + } + + gear->nvertices = (v - gear->vertices); + + /* Store the vertices in a vertex buffer object (VBO) */ + glGenBuffers(1, &gear->vbo); + glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + glBufferData(GL_ARRAY_BUFFER, gear->nvertices * sizeof(GearVertex), + gear->vertices, GL_STATIC_DRAW); + + return gear; +} + +/** + * Multiplies two 4x4 matrices. + * + * The result is stored in matrix m. + * + * @param m the first matrix to multiply + * @param n the second matrix to multiply + */ +static void +multiply(GLfloat *m, const GLfloat *n) +{ + GLfloat tmp[16]; + const GLfloat *row, *column; + div_t d; + int i, j; + + for (i = 0; i < 16; i++) { + tmp[i] = 0; + d = div(i, 4); + row = n + d.quot * 4; + column = m + d.rem; + for (j = 0; j < 4; j++) + tmp[i] += row[j] * column[j * 4]; + } + memcpy(m, &tmp, sizeof tmp); +} + +/** + * Rotates a 4x4 matrix. + * + * @param[in,out] m the matrix to rotate + * @param angle the angle to rotate + * @param x the x component of the direction to rotate to + * @param y the y component of the direction to rotate to + * @param z the z component of the direction to rotate to + */ +static void +rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + double s, c; + + sincos(angle, &s, &c); + GLfloat r[16] = { + x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0, + x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0, + x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0, + 0, 0, 0, 1 + }; + + multiply(m, r); +} + + +/** + * Translates a 4x4 matrix. + * + * @param[in,out] m the matrix to translate + * @param x the x component of the direction to translate to + * @param y the y component of the direction to translate to + * @param z the z component of the direction to translate to + */ +static void +translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 }; + + multiply(m, t); +} + +/** + * Creates an identity 4x4 matrix. + * + * @param m the matrix make an identity matrix + */ +static void +identity(GLfloat *m) +{ + GLfloat t[16] = { + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + }; + + memcpy(m, t, sizeof(t)); +} + +/** + * Transposes a 4x4 matrix. + * + * @param m the matrix to transpose + */ +static void +transpose(GLfloat *m) +{ + GLfloat t[16] = { + m[0], m[4], m[8], m[12], + m[1], m[5], m[9], m[13], + m[2], m[6], m[10], m[14], + m[3], m[7], m[11], m[15]}; + + memcpy(m, t, sizeof(t)); +} + +/** + * Inverts a 4x4 matrix. + * + * This function can currently handle only pure translation-rotation matrices. + * Read http://www.gamedev.net/community/forums/topic.asp?topic_id=425118 + * for an explanation. + */ +static void +invert(GLfloat *m) +{ + GLfloat t[16]; + identity(t); + + // Extract and invert the translation part 't'. The inverse of a + // translation matrix can be calculated by negating the translation + // coordinates. + t[12] = -m[12]; t[13] = -m[13]; t[14] = -m[14]; + + // Invert the rotation part 'r'. The inverse of a rotation matrix is + // equal to its transpose. + m[12] = m[13] = m[14] = 0; + transpose(m); + + // inv(m) = inv(r) * inv(t) + multiply(m, t); +} + +/** + * Calculate a perspective projection transformation. + * + * @param m the matrix to save the transformation in + * @param fovy the field of view in the y direction + * @param aspect the view aspect ratio + * @param zNear the near clipping plane + * @param zFar the far clipping plane + */ +void perspective(GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) +{ + GLfloat tmp[16]; + identity(tmp); + + double sine, cosine, cotangent, deltaZ; + GLfloat radians = fovy / 2 * M_PI / 180; + + deltaZ = zFar - zNear; + sincos(radians, &sine, &cosine); + + if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) + return; + + cotangent = cosine / sine; + + tmp[0] = cotangent / aspect; + tmp[5] = cotangent; + tmp[10] = -(zFar + zNear) / deltaZ; + tmp[11] = -1; + tmp[14] = -2 * zNear * zFar / deltaZ; + tmp[15] = 0; + + memcpy(m, tmp, sizeof(tmp)); +} + +/** + * Draws a gear. + * + * @param gear the gear to draw + * @param transform the current transformation matrix + * @param x the x position to draw the gear at + * @param y the y position to draw the gear at + * @param angle the rotation angle of the gear + * @param color the color of the gear + */ +static void +draw_gear(struct gear *gear, GLfloat *transform, + GLfloat x, GLfloat y, GLfloat angle, const GLfloat color[4]) +{ + GLfloat model_view[16]; + GLfloat normal_matrix[16]; + GLfloat model_view_projection[16]; + + /* Translate and rotate the gear */ + memcpy(model_view, transform, sizeof (model_view)); + translate(model_view, x, y, 0); + rotate(model_view, 2 * M_PI * angle / 360.0, 0, 0, 1); + + /* Create and set the ModelViewProjectionMatrix */ + memcpy(model_view_projection, ProjectionMatrix, sizeof(model_view_projection)); + multiply(model_view_projection, model_view); + + glUniformMatrix4fv(ModelViewProjectionMatrix_location, 1, GL_FALSE, + model_view_projection); + + /* + * Create and set the NormalMatrix. It's the inverse transpose of the + * ModelView matrix. + */ + memcpy(normal_matrix, model_view, sizeof (normal_matrix)); + invert(normal_matrix); + transpose(normal_matrix); + glUniformMatrix4fv(NormalMatrix_location, 1, GL_FALSE, normal_matrix); + + /* Set the gear color */ + glUniform4fv(MaterialColor_location, 1, color); + + /* Set the vertex buffer object to use */ + glBindBuffer(GL_ARRAY_BUFFER, 0); + + /* Set up the position of the attributes in the vertex buffer object */ + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), *gear->vertices); + + glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); // second is not clientside + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), (GLfloat *) 0 + 3); + glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, // third is not clientside either, but not enabled + 6 * sizeof(GLfloat), ((float*)*gear->vertices) + 6*4); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, // also never enabled + 6 * sizeof(GLfloat), ((float*)*gear->vertices) + 9*4); + + /* Enable the attributes */ + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + /* Draw the triangle strips that comprise the gear */ + int n; + for (n = 0; n < gear->nstrips; n++) + glDrawArrays(GL_TRIANGLE_STRIP, gear->strips[n].first, gear->strips[n].count); + + /* Disable the attributes */ + glDisableVertexAttribArray(1); + glDisableVertexAttribArray(0); +} + +/** + * Draws the gears. + */ +static void +gears_draw(void) +{ + const static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; + const static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; + const static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; + GLfloat transform[16]; + identity(transform); + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + /* Translate and rotate the view */ + translate(transform, 0, 0, -20); + rotate(transform, 2 * M_PI * view_rot[0] / 360.0, 1, 0, 0); + rotate(transform, 2 * M_PI * view_rot[1] / 360.0, 0, 1, 0); + rotate(transform, 2 * M_PI * view_rot[2] / 360.0, 0, 0, 1); + + /* Draw the gears */ + draw_gear(gear1, transform, -3.0, -2.0, angle, red); + draw_gear(gear2, transform, 3.1, -2.0, -2 * angle - 9.0, green); + draw_gear(gear3, transform, -3.1, 4.2, -2 * angle - 25.0, blue); + + glutSwapBuffers(); +} + +/** + * Handles a new window size or exposure. + * + * @param width the window width + * @param height the window height + */ +static void +gears_reshape(int width, int height) +{ + /* Update the projection matrix */ + perspective(ProjectionMatrix, 60.0, width / (float)height, 1.0, 1024.0); + + /* Set the viewport */ + glViewport(0, 0, (GLint) width, (GLint) height); +} + +/** + * Handles special glut events. + * + * @param special the event to handle. + */ +static void +gears_special(int special, int crap, int morecrap) +{ + switch (special) { + case GLUT_KEY_LEFT: + view_rot[1] += 5.0; + break; + case GLUT_KEY_RIGHT: + view_rot[1] -= 5.0; + break; + case GLUT_KEY_UP: + view_rot[0] += 5.0; + break; + case GLUT_KEY_DOWN: + view_rot[0] -= 5.0; + break; + case GLUT_KEY_F11: + glutFullScreen(); + break; + } +} + +static void +gears_idle(void) +{ + static int frames = 0; + static double tRot0 = -1.0, tRate0 = -1.0; + double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; + + if (tRot0 < 0.0) + tRot0 = t; + dt = t - tRot0; + tRot0 = t; + + /* advance rotation for next frame */ + angle += 70.0 * dt; /* 70 degrees per second */ + if (angle > 3600.0) + angle -= 3600.0; + + glutPostRedisplay(); + frames++; + + if (tRate0 < 0.0) + tRate0 = t; + if (t - tRate0 >= 5.0) { + GLfloat seconds = t - tRate0; + GLfloat fps = frames / seconds; + printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, + fps); + tRate0 = t; + frames = 0; + } +} + +static const char vertex_shader[] = +"attribute vec3 position;\n" +"attribute vec3 normal;\n" +"\n" +"uniform mat4 ModelViewProjectionMatrix;\n" +"uniform mat4 NormalMatrix;\n" +"uniform vec4 LightSourcePosition;\n" +"uniform vec4 MaterialColor;\n" +"\n" +"varying vec4 Color;\n" +"\n" +"void main(void)\n" +"{\n" +" // Transform the normal to eye coordinates\n" +" vec3 N = normalize(vec3(NormalMatrix * vec4(normal, 1.0)));\n" +"\n" +" // The LightSourcePosition is actually its direction for directional light\n" +" vec3 L = normalize(LightSourcePosition.xyz);\n" +"\n" +" // Multiply the diffuse value by the vertex color (which is fixed in this case)\n" +" // to get the actual color that we will use to draw this vertex with\n" +" float diffuse = max(dot(N, L), 0.0);\n" +" Color = diffuse * MaterialColor;\n" +"\n" +" // Transform the position to clip coordinates\n" +" gl_Position = ModelViewProjectionMatrix * vec4(position, 1.0);\n" +"}"; + +static const char fragment_shader[] = +"#ifdef GL_ES\n" +"precision mediump float;\n" +"#endif\n" +"varying vec4 Color;\n" +"\n" +"void main(void)\n" +"{\n" +" gl_FragColor = Color;\n" +"}"; + +static void +gears_init(void) +{ + GLuint v, f, program; + const char *p; + char msg[512]; + + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + + /* Compile the vertex shader */ + p = vertex_shader; + v = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(v, 1, &p, NULL); + glCompileShader(v); + glGetShaderInfoLog(v, sizeof msg, NULL, msg); + printf("vertex shader info: %s\n", msg); + + /* Compile the fragment shader */ + p = fragment_shader; + f = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(f, 1, &p, NULL); + glCompileShader(f); + glGetShaderInfoLog(f, sizeof msg, NULL, msg); + printf("fragment shader info: %s\n", msg); + + /* Create and link the shader program */ + program = glCreateProgram(); + glAttachShader(program, v); + glAttachShader(program, f); + glBindAttribLocation(program, 0, "position"); + glBindAttribLocation(program, 1, "normal"); + + glLinkProgram(program); + glGetProgramInfoLog(program, sizeof msg, NULL, msg); + printf("info: %s\n", msg); + + /* Enable the shaders */ + glUseProgram(program); + + /* Get the locations of the uniforms so we can access them */ + ModelViewProjectionMatrix_location = glGetUniformLocation(program, "ModelViewProjectionMatrix"); + NormalMatrix_location = glGetUniformLocation(program, "NormalMatrix"); + LightSourcePosition_location = glGetUniformLocation(program, "LightSourcePosition"); + MaterialColor_location = glGetUniformLocation(program, "MaterialColor"); + + /* Set the LightSourcePosition uniform which is constant throught the program */ + glUniform4fv(LightSourcePosition_location, 1, LightSourcePosition); + + /* make the gears */ + gear1 = create_gear(1.0, 4.0, 1.0, 20, 0.7); + gear2 = create_gear(0.5, 2.0, 2.0, 10, 0.7); + gear3 = create_gear(1.3, 2.0, 0.5, 10, 0.7); +} + +int +main(int argc, char *argv[]) +{ + /* Initialize the window */ + glutInit(&argc, argv); + glutInitWindowSize(300, 300); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); + + glutCreateWindow("es2gears"); + + /* Set up glut callback functions */ + glutIdleFunc (gears_idle); + glutReshapeFunc(gears_reshape); + glutDisplayFunc(gears_draw); + glutSpecialFunc(gears_special); + + /* Initialize the gears */ + gears_init(); + + glutMainLoop(); + + return 0; +} diff --git a/tests/openal_playback.cpp b/tests/openal_playback.cpp new file mode 100644 index 00000000..13d619e6 --- /dev/null +++ b/tests/openal_playback.cpp @@ -0,0 +1,115 @@ +#include <stdio.h> +#include <stdlib.h> +#include <AL/al.h> +#include <AL/alc.h> +#include <assert.h> +#include <emscripten.h> + +void playSource(void* arg) +{ + ALuint source = reinterpret_cast<ALuint>(arg); + ALint state; + alGetSourcei(source, AL_SOURCE_STATE, &state); + assert(state == AL_PLAYING); + alSourcePause(source); + alGetSourcei(source, AL_SOURCE_STATE, &state); + assert(state == AL_PAUSED); + alSourcePlay(source); + alGetSourcei(source, AL_SOURCE_STATE, &state); + assert(state == AL_PLAYING); + alSourceStop(source); + alGetSourcei(source, AL_SOURCE_STATE, &state); + assert(state == AL_STOPPED); + + int result = 1; + REPORT_RESULT(); +} + +int main() { + ALCdevice* device = alcOpenDevice(NULL); + ALCcontext* context = alcCreateContext(device, NULL); + alcMakeContextCurrent(context); + + ALfloat listenerPos[] = {0.0, 0.0, 0.0}; + ALfloat listenerVel[] = {0.0, 0.0, 0.0}; + ALfloat listenerOri[] = {0.0, 0.0, -1.0, 0.0, 1.0, 0.0}; + + alListenerfv(AL_POSITION, listenerPos); + alListenerfv(AL_VELOCITY, listenerVel); + alListenerfv(AL_ORIENTATION, listenerOri); + + ALuint buffers[1]; + + alGenBuffers(1, buffers); + + FILE* source = fopen("audio.wav", "rb"); + fseek(source, 0, SEEK_END); + int size = ftell(source); + fseek(source, 0, SEEK_SET); + + unsigned char* buffer = (unsigned char*) malloc(size); + fread(buffer, size, 1, source); + + unsigned offset = 12; // ignore the RIFF header + offset += 8; // ignore the fmt header + offset += 2; // ignore the format type + + unsigned channels = buffer[offset + 1] << 8; + channels |= buffer[offset]; + offset += 2; + printf("Channels: %u\n", channels); + + unsigned frequency = buffer[offset + 3] << 24; + frequency |= buffer[offset + 2] << 16; + frequency |= buffer[offset + 1] << 8; + frequency |= buffer[offset]; + offset += 4; + printf("Frequency: %u\n", frequency); + + offset += 6; // ignore block size and bps + + unsigned bits = buffer[offset + 1] << 8; + bits |= buffer[offset]; + offset += 2; + printf("Bits: %u\n", bits); + + ALenum format = 0; + if(bits == 8) + { + if(channels == 1) + format = AL_FORMAT_MONO8; + else if(channels == 2) + format = AL_FORMAT_STEREO8; + } + else if(bits == 16) + { + if(channels == 1) + format = AL_FORMAT_MONO16; + else if(channels == 2) + format = AL_FORMAT_STEREO16; + } + + offset += 8; // ignore the data chunk + + printf("Start offset: %d\n", offset); + + alBufferData(buffers[0], format, &buffer[offset], size - offset, frequency); + + ALuint sources[1]; + alGenSources(1, sources); + + alSourcei(sources[0], AL_BUFFER, buffers[0]); + + ALint state; + alGetSourcei(sources[0], AL_SOURCE_STATE, &state); + assert(state == AL_INITIAL); + + alSourcePlay(sources[0]); + + alGetSourcei(sources[0], AL_SOURCE_STATE, &state); + assert(state == AL_PLAYING); + + emscripten_async_call(playSource, reinterpret_cast<void*>(sources[0]), 700); + + return 0; +} diff --git a/tests/runner.py b/tests/runner.py index e631b025..7f46dbfb 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -445,7 +445,7 @@ if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv) and 'brows if len(sys.argv) == 2 and 'ALL.' in sys.argv[1]: ignore, test = sys.argv[1].split('.') print 'Running all test modes on test "%s"' % test - sys.argv = [sys.argv[0], 'default.'+test, 'o1.'+test, 'o2.'+test, 'asm2.'+test, 's_0_0.'+test, 's_0_1.'+test, 's_0_1_q1.'+test, 's_1_0.'+test, 's_1_1.'+test, 's_1_1_q1.'+test] + sys.argv = [sys.argv[0], 'default.'+test, 'o1.'+test, 'o2.'+test, 'asm2.'+test, 'asm2g.'+test, 's_0_0.'+test, 's_0_1.'+test, 's_1_0.'+test, 's_1_1.'+test] class T(RunnerCore): # Short name, to make it more fun to use manually on the commandline ## Does a complete test - builds, runs, checks output, etc. @@ -829,11 +829,14 @@ if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv) and 'brows int add_low = add; int add_high = add >> 32; printf("*%lld,%lld,%u,%u*\n", mul, add, add_low, add_high); + int64 x = sec + (usec << 25); + x >>= argc*3; + printf("*%llu*\n", x); return 0; } ''' - self.do_run(src, '*1329409676000000,1329412005509675,3663280683,309527*\n') + self.do_run(src, '*1329409676000000,1329412005509675,3663280683,309527*\n*9770671914067409*\n') def test_i64_cmp(self): if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2') @@ -1003,12 +1006,6 @@ m_divisor is 1091269979 ''' self.do_run(src, open(path_from_root('tests', 'i64_precise.txt')).read()) - # Verify that without precision, we do not include the precision code - Settings.PRECISE_I64_MATH = 0 - self.do_run(src, 'unsigned') - code = open(os.path.join(self.get_dir(), 'src.cpp.o.js')).read() - assert 'goog.math.Long' not in code, 'i64 precise math should not have been included if not asked for' - # Verify that even if we ask for precision, if it is not needed it is not included Settings.PRECISE_I64_MATH = 1 src = ''' @@ -1054,6 +1051,19 @@ m_divisor is 1091269979 } ''', 'c = 4ca38a6bd2973f97') + def test_i64_llabs(self): + if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2') + Settings.PRECISE_I64_MATH = 2 + self.do_run(r''' + #include <stdio.h> + #include <stdlib.h> + + int main(int argc, char ** argv) { + printf("%lld,%lld\n", llabs(-576460752303423489), llabs(576460752303423489)); + return 0; + } + ''', '576460752303423489,576460752303423489') + def test_i64_zextneg(self): if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2') @@ -1240,6 +1250,8 @@ m_divisor is 1091269979 extern int64_t llvm_ctlz_i64(int64_t x); extern int32_t llvm_cttz_i32(int32_t x); extern int64_t llvm_cttz_i64(int64_t x); + extern int32_t llvm_ctpop_i32(int32_t x); + extern int64_t llvm_ctpop_i64(int64_t x); extern int llvm_expect_i32(int x, int y); } @@ -1256,6 +1268,7 @@ m_divisor is 1091269979 printf("%d,%d\n", (int)llvm_ctlz_i64(((int64_t)1) << 40), llvm_ctlz_i32(1<<10)); printf("%d,%d\n", (int)llvm_cttz_i64(((int64_t)1) << 40), llvm_cttz_i32(1<<10)); + printf("%d,%d\n", (int)llvm_ctpop_i64((0x3101ULL << 32) | 1), llvm_ctpop_i32(0x3101)); printf("%d\n", llvm_expect_i32(x % 27, 3)); @@ -1272,6 +1285,7 @@ c8,ef c5,de,15,8a 23,21 40,10 +5,4 13 72057594037927936 ''') @@ -1873,13 +1887,34 @@ Succeeded! printf("%s\\n", strdup_val); free(strdup_val); + { + char *one = "one 1 ONE !"; + char *two = "two 2 TWO ?"; + char three[1024]; + memset(three, '.', 1024); + three[50] = 0; + strncpy(three + argc, one + (argc/2), argc+1); + strncpy(three + argc*3, two + (argc/3), argc+2); + printf("waka %s\\n", three); + } + + { + char *one = "string number one top notch"; + char *two = "fa la sa ho fi FI FO FUM WHEN WHERE WHY HOW WHO"; + char three[1000]; + strcpy(three, &one[argc*2]); + strcat(three, &two[argc*3]); + printf("cat |%s|\\n", three); + } + return 0; } ''' for named in (0, 1): print named Settings.NAMED_GLOBALS = named - self.do_run(src, '4:10,177,543,def\n4\nwowie\ntoo\n76\n5\n(null)\n/* a comment */\n// another\ntest\n', ['wowie', 'too', '74']) + self.do_run(src, '''4:10,177,543,def\n4\nwowie\ntoo\n76\n5\n(null)\n/* a comment */\n// another\ntest\nwaka ....e 1 O...wo 2 T................................ +cat |umber one top notchfi FI FO FUM WHEN WHERE WHY HOW WHO|''', ['wowie', 'too', '74']) if self.emcc_args == []: gen = open(self.in_dir('src.cpp.o.js')).read() assert ('var __str1;' in gen) == named @@ -4100,10 +4135,12 @@ The current type of b is: 9 #define CONSTRLEN 32 + char * (*func)(char *, const char *) = NULL; + void conoutfv(const char *fmt) { static char buf[CONSTRLEN]; - strcpy(buf, fmt); + func(buf, fmt); // call by function pointer to make sure we test strcpy here puts(buf); } @@ -4125,6 +4162,7 @@ The current type of b is: 9 }; int main() { + func = &strcpy; conoutfv("*staticccz*"); printf("*%.2f,%.2f,%.2f*\\n", S::getIdentity().x, S::getIdentity().y, S::getIdentity().z); return 0; @@ -4253,6 +4291,143 @@ The current type of b is: 9 ''' self.do_run(src, 'ok.'); + def test_getopt(self): + if self.emcc_args is None: return self.skip('needs emcc for libc') + + src = ''' + #pragma clang diagnostic ignored "-Winvalid-pp-token" + #include <unistd.h> + #include <stdlib.h> + #include <stdio.h> + + int + main(int argc, char *argv[]) + { + int flags, opt; + int nsecs, tfnd; + + nsecs = 0; + tfnd = 0; + flags = 0; + while ((opt = getopt(argc, argv, "nt:")) != -1) { + switch (opt) { + case 'n': + flags = 1; + break; + case 't': + nsecs = atoi(optarg); + tfnd = 1; + break; + default: /* '?' */ + fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\\n", + argv[0]); + exit(EXIT_FAILURE); + } + } + + printf("flags=%d; tfnd=%d; optind=%d\\n", flags, tfnd, optind); + + if (optind >= argc) { + fprintf(stderr, "Expected argument after options\\n"); + exit(EXIT_FAILURE); + } + + printf("name argument = %s\\n", argv[optind]); + + /* Other code omitted */ + + exit(EXIT_SUCCESS); + } + ''' + self.do_run(src, 'flags=1; tfnd=1; optind=4\nname argument = foobar', args=['-t', '12', '-n', 'foobar']) + + def test_getopt_long(self): + if self.emcc_args is None: return self.skip('needs emcc for libc') + + src = ''' + #pragma clang diagnostic ignored "-Winvalid-pp-token" + #pragma clang diagnostic ignored "-Wdeprecated-writable-strings" + #include <stdio.h> /* for printf */ + #include <stdlib.h> /* for exit */ + #include <getopt.h> + + int + main(int argc, char **argv) + { + int c; + int digit_optind = 0; + + while (1) { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = { + {"add", required_argument, 0, 0 }, + {"append", no_argument, 0, 0 }, + {"delete", required_argument, 0, 0 }, + {"verbose", no_argument, 0, 0 }, + {"create", required_argument, 0, 'c'}, + {"file", required_argument, 0, 0 }, + {0, 0, 0, 0 } + }; + + c = getopt_long(argc, argv, "abc:d:012", + long_options, &option_index); + if (c == -1) + break; + + switch (c) { + case 0: + printf("option %s", long_options[option_index].name); + if (optarg) + printf(" with arg %s", optarg); + printf("\\n"); + break; + + case '0': + case '1': + case '2': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf("digits occur in two different argv-elements.\\n"); + digit_optind = this_option_optind; + printf("option %c\\n", c); + break; + + case 'a': + printf("option a\\n"); + break; + + case 'b': + printf("option b\\n"); + break; + + case 'c': + printf("option c with value '%s'\\n", optarg); + break; + + case 'd': + printf("option d with value '%s'\\n", optarg); + break; + + case '?': + break; + + default: + printf("?? getopt returned character code 0%o ??\\n", c); + } + } + + if (optind < argc) { + printf("non-option ARGV-elements: "); + while (optind < argc) + printf("%s ", argv[optind++]); + printf("\\n"); + } + + exit(EXIT_SUCCESS); + } + ''' + self.do_run(src, 'option file with arg foobar\noption b', args=['--file', 'foobar', '-b']) + def test_memmove(self): src = ''' #include <stdio.h> @@ -4875,6 +5050,8 @@ def process(filename): self.do_run(src, re.sub(r'(^|\n)\s+', r'\1', expected)) def test_strtod(self): + if self.emcc_args is None: return self.skip('needs emcc for libc') + src = r''' #include <stdio.h> #include <stdlib.h> @@ -4908,6 +5085,9 @@ def process(filename): printf("%g\n", strtod(str, &endptr)); printf("%d\n", endptr - str); printf("%g\n", strtod("84e+420", &endptr)); + + printf("%.12f\n", strtod("1.2345678900000000e+08", NULL)); + return 0; } ''' @@ -4935,6 +5115,7 @@ def process(filename): 1.234e+57 10 inf + 123456789.000000000000 ''' self.do_run(src, re.sub(r'\n\s+', '\n', expected)) @@ -5214,6 +5395,8 @@ at function.:blag ''') def test_sscanf(self): + if self.emcc_args is None: return self.skip('needs emcc for libc') + src = r''' #include <stdio.h> #include <string.h> @@ -5894,6 +6077,8 @@ def process(filename): self.do_run(src, re.sub('(^|\n)\s+', '\\1', expected), post_build=add_pre_run_and_checks) def test_utf(self): + if self.emcc_args and 'UTF_STRING_SUPPORT=0' in self.emcc_args: return self.skip('need utf support') + self.banned_js_engines = [SPIDERMONKEY_ENGINE] # only node handles utf well Settings.EXPORTED_FUNCTIONS = ['_main', '_malloc'] @@ -6311,6 +6496,90 @@ PORT: 3979 expected = open(path_from_root('tests', 'ctype', 'output.txt'), 'r').read() self.do_run(src, expected) + def test_strcasecmp(self): + src = r''' + #include <stdio.h> + #include <strings.h> + int sign(int x) { + if (x < 0) return -1; + if (x > 0) return 1; + return 0; + } + int main() { + printf("*\n"); + + printf("%d\n", sign(strcasecmp("hello", "hello"))); + printf("%d\n", sign(strcasecmp("hello1", "hello"))); + printf("%d\n", sign(strcasecmp("hello", "hello1"))); + printf("%d\n", sign(strcasecmp("hello1", "hello1"))); + printf("%d\n", sign(strcasecmp("iello", "hello"))); + printf("%d\n", sign(strcasecmp("hello", "iello"))); + printf("%d\n", sign(strcasecmp("A", "hello"))); + printf("%d\n", sign(strcasecmp("Z", "hello"))); + printf("%d\n", sign(strcasecmp("a", "hello"))); + printf("%d\n", sign(strcasecmp("z", "hello"))); + printf("%d\n", sign(strcasecmp("hello", "a"))); + printf("%d\n", sign(strcasecmp("hello", "z"))); + + printf("%d\n", sign(strcasecmp("Hello", "hello"))); + printf("%d\n", sign(strcasecmp("Hello1", "hello"))); + printf("%d\n", sign(strcasecmp("Hello", "hello1"))); + printf("%d\n", sign(strcasecmp("Hello1", "hello1"))); + printf("%d\n", sign(strcasecmp("Iello", "hello"))); + printf("%d\n", sign(strcasecmp("Hello", "iello"))); + printf("%d\n", sign(strcasecmp("A", "hello"))); + printf("%d\n", sign(strcasecmp("Z", "hello"))); + printf("%d\n", sign(strcasecmp("a", "hello"))); + printf("%d\n", sign(strcasecmp("z", "hello"))); + printf("%d\n", sign(strcasecmp("Hello", "a"))); + printf("%d\n", sign(strcasecmp("Hello", "z"))); + + printf("%d\n", sign(strcasecmp("hello", "Hello"))); + printf("%d\n", sign(strcasecmp("hello1", "Hello"))); + printf("%d\n", sign(strcasecmp("hello", "Hello1"))); + printf("%d\n", sign(strcasecmp("hello1", "Hello1"))); + printf("%d\n", sign(strcasecmp("iello", "Hello"))); + printf("%d\n", sign(strcasecmp("hello", "Iello"))); + printf("%d\n", sign(strcasecmp("A", "Hello"))); + printf("%d\n", sign(strcasecmp("Z", "Hello"))); + printf("%d\n", sign(strcasecmp("a", "Hello"))); + printf("%d\n", sign(strcasecmp("z", "Hello"))); + printf("%d\n", sign(strcasecmp("hello", "a"))); + printf("%d\n", sign(strcasecmp("hello", "z"))); + + printf("%d\n", sign(strcasecmp("Hello", "Hello"))); + printf("%d\n", sign(strcasecmp("Hello1", "Hello"))); + printf("%d\n", sign(strcasecmp("Hello", "Hello1"))); + printf("%d\n", sign(strcasecmp("Hello1", "Hello1"))); + printf("%d\n", sign(strcasecmp("Iello", "Hello"))); + printf("%d\n", sign(strcasecmp("Hello", "Iello"))); + printf("%d\n", sign(strcasecmp("A", "Hello"))); + printf("%d\n", sign(strcasecmp("Z", "Hello"))); + printf("%d\n", sign(strcasecmp("a", "Hello"))); + printf("%d\n", sign(strcasecmp("z", "Hello"))); + printf("%d\n", sign(strcasecmp("Hello", "a"))); + printf("%d\n", sign(strcasecmp("Hello", "z"))); + + printf("%d\n", sign(strncasecmp("hello", "hello", 3))); + printf("%d\n", sign(strncasecmp("hello1", "hello", 3))); + printf("%d\n", sign(strncasecmp("hello", "hello1", 3))); + printf("%d\n", sign(strncasecmp("hello1", "hello1", 3))); + printf("%d\n", sign(strncasecmp("iello", "hello", 3))); + printf("%d\n", sign(strncasecmp("hello", "iello", 3))); + printf("%d\n", sign(strncasecmp("A", "hello", 3))); + printf("%d\n", sign(strncasecmp("Z", "hello", 3))); + printf("%d\n", sign(strncasecmp("a", "hello", 3))); + printf("%d\n", sign(strncasecmp("z", "hello", 3))); + printf("%d\n", sign(strncasecmp("hello", "a", 3))); + printf("%d\n", sign(strncasecmp("hello", "z", 3))); + + printf("*\n"); + + return 0; + } + ''' + self.do_run(src, '''*\n0\n1\n-1\n0\n1\n-1\n-1\n1\n-1\n1\n1\n-1\n0\n1\n-1\n0\n1\n-1\n-1\n1\n-1\n1\n1\n-1\n0\n1\n-1\n0\n1\n-1\n-1\n1\n-1\n1\n1\n-1\n0\n1\n-1\n0\n1\n-1\n-1\n1\n-1\n1\n1\n-1\n0\n0\n0\n0\n1\n-1\n-1\n1\n-1\n1\n1\n-1\n*\n''') + def test_atomic(self): src = ''' #include <stdio.h> @@ -6985,6 +7254,9 @@ def process(filename): Settings.DISABLE_EXCEPTION_CATCHING = 1 Settings.FAST_MEMORY = 4*1024*1024 Settings.EXPORTED_FUNCTIONS += ['_sqlite3_open', '_sqlite3_close', '_sqlite3_exec', '_sqlite3_free', '_callback']; + if Settings.ASM_JS == 1 and '-g' in self.emcc_args: + print "disabling inlining" # without registerize (which -g disables), we generate huge amounts of code + Settings.INLINING_LIMIT = 50 self.do_run(r''' #define SQLITE_DISABLE_LFS @@ -7086,6 +7358,8 @@ def process(filename): #, build_ll_hook=self.do_autodebug) def test_openjpeg(self): + if self.emcc_args is None: return self.skip('needs libc for getopt') + if Settings.USE_TYPED_ARRAYS == 2: Settings.CORRECT_SIGNS = 1 else: @@ -7114,7 +7388,6 @@ def process(filename): [os.path.sep.join('codec/CMakeFiles/j2k_to_image.dir/index.c.o'.split('/')), os.path.sep.join('codec/CMakeFiles/j2k_to_image.dir/convert.c.o'.split('/')), os.path.sep.join('codec/CMakeFiles/j2k_to_image.dir/__/common/color.c.o'.split('/')), - os.path.sep.join('codec/CMakeFiles/j2k_to_image.dir/__/common/getopt.c.o'.split('/')), os.path.join('bin', self.get_shared_library_name('libopenjpeg.so.1.4.0'))], configure=['cmake', '.'], #configure_args=['--enable-tiff=no', '--enable-jp3d=no', '--enable-png=no'], @@ -7156,6 +7429,8 @@ def process(filename): return output + self.emcc_args += ['--minify', '0'] # to compare the versions + def do_test(): self.do_run(open(path_from_root('tests', 'openjpeg', 'codec', 'j2k_to_image.c'), 'r').read(), 'Successfully generated', # The real test for valid output is in image_compare @@ -7504,6 +7779,114 @@ def process(filename): self.do_run(src, '*\nnumber,5\nnumber,3.14\nstring,hello world\n12\nundefined\n14.56\nundefined\ncheez\nundefined\narr-ay\nundefined\nmore\nnumber,10\n650\nnumber,21\n*\natr\n10\nbret\n53\n*\nstack is ok.\n', post_build=post) + def test_pgo(self): + if Settings.ASM_JS: return self.skip('PGO does not work in asm mode') + + def run_all(name, src): + print name + def test(expected, args=[], no_build=False): + self.do_run(src, expected, args=args, no_build=no_build) + return open(self.in_dir('src.cpp.o.js')).read() + + # Sanity check that it works and the dead function is emitted + js = test('*9*') + assert 'function _unused(' in js + + # Run with PGO, see that unused is true to its name + Settings.PGO = 1 + test("*9*\n-s DEAD_FUNCTIONS='[\"_unused\"]'") + Settings.PGO = 0 + + # Kill off the dead function, still works and it is not emitted + Settings.DEAD_FUNCTIONS = ['_unused'] + js = test('*9*') + assert 'function _unused(' not in js + Settings.DEAD_FUNCTIONS = [] + + # Run the same code with argc that uses the dead function, see abort + test(('abort', 'is not a function'), args=['a', 'b'], no_build=True) + + # Normal stuff + run_all('normal', r''' + #include <stdio.h> + extern "C" { + int used(int x) { + if (x == 0) return -1; + return used(x/3) + used(x/17) + x%5; + } + int unused(int x) { + if (x == 0) return -1; + return unused(x/4) + unused(x/23) + x%7; + } + } + int main(int argc, char **argv) { + printf("*%d*\n", argc == 3 ? unused(argv[0][0] + 1024) : used(argc + 1555)); + return 0; + } + ''') + + # Call by function pointer + run_all('function pointers', r''' + #include <stdio.h> + extern "C" { + int used(int x) { + if (x == 0) return -1; + return used(x/3) + used(x/17) + x%5; + } + int unused(int x) { + if (x == 0) return -1; + return unused(x/4) + unused(x/23) + x%7; + } + } + typedef int (*ii)(int); + int main(int argc, char **argv) { + ii pointers[256]; + for (int i = 0; i < 256; i++) { + pointers[i] = (i == 3) ? unused : used; + } + printf("*%d*\n", pointers[argc](argc + 1555)); + return 0; + } + ''') + + def test_asm_pgo(self): + if not Settings.ASM_JS: return self.skip('this is a test for PGO for asm (NB: not *in* asm)') + + src = open(path_from_root('tests', 'hello_libcxx.cpp')).read() + output = 'hello, world!' + + self.do_run(src, output) + shutil.move(self.in_dir('src.cpp.o.js'), self.in_dir('normal.js')) + + self.emcc_args = map(lambda x: 'ASM_JS=0' if x == 'ASM_JS=1' else x, self.emcc_args) + Settings.PGO = 1 + self.do_run(src, output) + Settings.PGO = 0 + self.emcc_args = map(lambda x: 'ASM_JS=1' if x == 'ASM_JS=0' else x, self.emcc_args) + + shutil.move(self.in_dir('src.cpp.o.js'), self.in_dir('pgo.js')) + pgo_output = run_js(self.in_dir('pgo.js')).split('\n')[1] + open('pgo_data', 'w').write(pgo_output) + + # with response file + + self.emcc_args += ['@pgo_data'] + self.do_run(src, output) + self.emcc_args.pop() + shutil.move(self.in_dir('src.cpp.o.js'), self.in_dir('pgoed.js')) + + before = len(open('normal.js').read()) + after = len(open('pgoed.js').read()) + assert after < 0.66 * before, [before, after] # expect a big size reduction + + # with response in settings element itself + + open('dead_funcs', 'w').write(pgo_output[pgo_output.find('['):-1]) + self.emcc_args += ['-s', 'DEAD_FUNCTIONS=@' + self.in_dir('dead_funcs')] + self.do_run(src, output) + shutil.move(self.in_dir('src.cpp.o.js'), self.in_dir('pgoed2.js')) + assert open('pgoed.js').read() == open('pgoed2.js').read() + def test_scriptaclass(self): if self.emcc_args is None: return self.skip('requires emcc') if Settings.ASM_JS: return self.skip('asm does not bindings generator yet') @@ -8369,13 +8752,11 @@ TT = %s exec('o2 = make_run("o2", compiler=CLANG, emcc_args=["-O2"])') # asm.js - #exec('asm = make_run("asm", compiler=CLANG, emcc_args=["-O0", "-s", "ASM_JS=1"])') exec('asm2 = make_run("asm2", compiler=CLANG, emcc_args=["-O2", "-s", "ASM_JS=1"])') + exec('asm2g = make_run("asm2g", compiler=CLANG, emcc_args=["-O2", "-s", "ASM_JS=1", "-g", "-s", "ASSERTIONS=1", "-s", "UTF_STRING_SUPPORT=0"])') # Make custom runs with various options for compiler, quantum, embetter, typed_arrays, llvm_opts in [ - (CLANG, 1, 1, 0, 0), - (CLANG, 1, 1, 1, 1), (CLANG, 4, 0, 0, 0), (CLANG, 4, 0, 0, 1), (CLANG, 4, 1, 1, 0), @@ -8510,6 +8891,7 @@ Options that are modified or new in %s include: (['-o', 'something.js', '-O2'], 2, None, 0, 1), (['-o', 'something.js', '-O2', '--closure', '0'], 2, None, 0, 0), (['-o', 'something.js', '-O2', '-g'], 2, None, 0, 0), + (['-o', 'something.js', '-Os'], 2, None, 0, 1), (['-o', 'something.js', '-O3'], 3, None, 1, 1), (['-o', 'something.js', '-O3', '--closure', '0'], 3, None, 0, 0), # and, test compiling to bitcode first @@ -8542,7 +8924,8 @@ Options that are modified or new in %s include: assert 'SAFE_HEAP' not in generated, 'safe heap should not be used by default' assert ': while(' not in generated, 'when relooping we also js-optimize, so there should be no labelled whiles' if closure: - assert 'Module._main=' in generated, 'closure compiler should have been run (and output should be minified)' + if opt_level <= 1: assert 'Module._main =' in generated, 'closure compiler should have been run' + elif opt_level >= 2: assert 'Module._main=' in generated, 'closure compiler should have been run (and output should be minified)' else: # closure has not been run, we can do some additional checks. TODO: figure out how to do these even with closure assert 'Module._main = ' not in generated, 'closure compiler should not have been run' @@ -8551,16 +8934,19 @@ Options that are modified or new in %s include: assert ('assert(STACKTOP < STACK_MAX' in generated) == (opt_level == 0), 'assertions should be in opt == 0' assert 'var $i;' in generated or 'var $i_0' in generated or 'var $storemerge3;' in generated or 'var $storemerge4;' in generated or 'var $i_04;' in generated, 'micro opts should always be on' if opt_level >= 2: - assert re.search('HEAP8\[\$?\w+ \+ \(+\$?\w+ ', generated) or re.search('HEAP8\[HEAP32\[', generated), 'eliminator should create compound expressions, and fewer one-time vars' # also in -O1, but easier to test in -O2 + assert re.search('HEAP8\[\$?\w+ ?\+ ?\(+\$?\w+ ?', generated) or re.search('HEAP8\[HEAP32\[', generated), 'eliminator should create compound expressions, and fewer one-time vars' # also in -O1, but easier to test in -O2 assert ('_puts(' in generated) == (opt_level >= 1), 'with opt >= 1, llvm opts are run and they should optimize printf to puts' - assert 'function _main() {' in generated, 'Should be unminified, including whitespace' + if opt_level <= 1 or '-g' in params: assert 'function _main() {' in generated, 'Should be unminified, including whitespace' + elif opt_level >= 2: assert 'function _main(){' in generated, 'Should be whitespace-minified' # emcc -s RELOOP=1 src.cpp ==> should pass -s to emscripten.py. --typed-arrays is a convenient alias for -s USE_TYPED_ARRAYS for params, test, text in [ - (['-s', 'ASM_JS=1', '-O2'], lambda generated: 'var i1 = 0' in generated, 'registerize is run by default in -O2'), - (['-s', 'ASM_JS=1', '-O2', '-g'], lambda generated: 'var i1 = 0' not in generated, 'registerize is cancelled by -g'), + (['-s', 'ASM_JS=1', '-O2'], lambda generated: 'var b=0' in generated and not 'function _main' in generated, 'registerize/minify is run by default in -O2'), + (['-s', 'ASM_JS=1', '-O2', '--minify', '0'], lambda generated: 'var b = 0' in generated and not 'function _main' in generated, 'minify is cancelled, but not registerize'), + (['-s', 'ASM_JS=1', '-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'), (['-s', 'INLINING_LIMIT=0'], lambda generated: 'function _dump' in generated, 'no inlining without opts'), (['-O3', '-s', 'INLINING_LIMIT=0', '--closure', '0'], lambda generated: 'function _dump' not in generated, 'lto/inlining'), + (['-Os', '--llvm-lto', '1'], lambda generated: 'function _dump' in generated, '-Os disables inlining'), (['-s', 'USE_TYPED_ARRAYS=0'], lambda generated: 'new Int32Array' not in generated, 'disable typed arrays'), (['-s', 'USE_TYPED_ARRAYS=1'], lambda generated: 'IHEAPU = ' in generated, 'typed arrays 1 selected'), ([], lambda generated: 'Module["_dump"]' not in generated, 'dump is not exported by default'), @@ -8716,14 +9102,6 @@ f.close() process.communicate() assert process.returncode is 0, 'User should be able to specify custom -std= on the command line!' - def test_Os(self): - for opt in ['s', '0']: - output = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O' + opt], stdout=PIPE, stderr=PIPE).communicate() - assert len(output[0]) == 0, output[0] - assert ('emcc: warning: -Os is ignored (use -O0, -O1, -O2)' in output[1]) == (opt == 's'), 'warn on -Os when necessary' - assert os.path.exists('a.out.js'), '\n'.join(output) - self.assertContained('hello, world!', run_js('a.out.js')) - def test_catch_undef(self): open(os.path.join(self.get_dir(), 'test.cpp'), 'w').write(r''' #include <vector> @@ -8741,7 +9119,7 @@ f.close() return 0; } ''') - Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'test.cpp'), '-fcatch-undefined-behavior']).communicate() + Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'test.cpp'), '-fsanitize=undefined']).communicate() self.assertContained('hello, world!', run_js(os.path.join(self.get_dir(), 'a.out.js'))) def test_unaligned_memory(self): @@ -8780,6 +9158,32 @@ f.close() Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'test.cpp'), '-s', 'UNALIGNED_MEMORY=1']).communicate() self.assertContained('testString = Hello, World!', run_js(os.path.join(self.get_dir(), 'a.out.js'))) + def test_asm_minify(self): + def test(args): + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_loop_malloc.cpp')] + args).communicate() + self.assertContained('hello, world!', run_js(self.in_dir('a.out.js'))) + return open(self.in_dir('a.out.js')).read() + + src = test([]) + assert 'function _malloc' in src + + src = test(['-O2', '-s', 'ASM_JS=1']) + normal_size = len(src) + print 'normal', normal_size + assert 'function _malloc' not in src + + src = test(['-O2', '-s', 'ASM_JS=1', '--minify', '0']) + unminified_size = len(src) + print 'unminified', unminified_size + assert unminified_size > normal_size + assert 'function _malloc' not in src + + src = test(['-O2', '-s', 'ASM_JS=1', '-g']) + debug_size = len(src) + print 'debug', debug_size + assert debug_size > unminified_size + assert 'function _malloc' in src + def test_l_link(self): # Linking with -lLIBNAME and -L/DIRNAME should work @@ -9462,6 +9866,22 @@ f.close() Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--pre-js', 'pre.js', '--pre-js', 'pre2.js']).communicate() self.assertContained('prepre\npre-run\nhello from main\n', run_js(os.path.join(self.get_dir(), 'a.out.js'))) + def test_save_bc(self): + for save in [0, 1]: + self.clear() + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_loop_malloc.cpp')] + ([] if not save else ['--save-bc', self.in_dir('my_bitcode.bc')])).communicate() + assert 'hello, world!' in run_js(self.in_dir('a.out.js')) + assert os.path.exists(self.in_dir('my_bitcode.bc')) == save + if save: + try_delete('a.out.js') + Building.llvm_dis(self.in_dir('my_bitcode.bc'), self.in_dir('my_ll.ll')) + try: + os.environ['EMCC_LEAVE_INPUTS_RAW'] = '1' + Popen([PYTHON, EMCC, 'my_ll.ll', '-o', 'two.js']).communicate() + assert 'hello, world!' in run_js(self.in_dir('two.js')) + finally: + del os.environ['EMCC_LEAVE_INPUTS_RAW'] + def test_fix_closure(self): input = path_from_root('tests', 'test-fix-closure.js') expected = path_from_root('tests', 'test-fix-closure.out.js') @@ -9492,6 +9912,8 @@ f.close() ['asm', 'eliminate']), (path_from_root('tools', 'test-js-optimizer-asm-regs.js'), open(path_from_root('tools', 'test-js-optimizer-asm-regs-output.js')).read(), ['asm', 'registerize']), + (path_from_root('tools', 'test-js-optimizer-asm-regs-min.js'), open(path_from_root('tools', 'test-js-optimizer-asm-regs-min-output.js')).read(), + ['asm', 'registerize']), (path_from_root('tools', 'test-js-optimizer-asm-pre.js'), open(path_from_root('tools', 'test-js-optimizer-asm-pre-output.js')).read(), ['asm', 'simplifyExpressionsPre']), (path_from_root('tools', 'test-js-optimizer-asm-last.js'), open(path_from_root('tools', 'test-js-optimizer-asm-last-output.js')).read(), @@ -10486,6 +10908,15 @@ elif 'browser' in str(sys.argv): Popen([PYTHON, EMCC, '-O2', '--minify', '0', os.path.join(self.get_dir(), 'sdl_audio.c'), '--preload-file', 'sound.ogg', '--preload-file', 'sound2.wav', '--preload-file', 'bad.ogg', '-o', 'page.html', '-s', 'EXPORTED_FUNCTIONS=["_main", "_play", "_play2"]']).communicate() self.run_browser('page.html', '', '/report_result?1') + def test_sdl_audio_mix(self): + shutil.copyfile(path_from_root('tests', 'sounds', 'pluck.ogg'), os.path.join(self.get_dir(), 'sound.ogg')) + shutil.copyfile(path_from_root('tests', 'sounds', 'the_entertainer.ogg'), os.path.join(self.get_dir(), 'music.ogg')) + open(os.path.join(self.get_dir(), 'sdl_audio_mix.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_audio_mix.c')).read())) + + # use closure to check for a possible bug with closure minifying away newer Audio() attributes + Popen([PYTHON, EMCC, '-O2', '--minify', '0', os.path.join(self.get_dir(), 'sdl_audio_mix.c'), '--preload-file', 'sound.ogg', '--preload-file', 'music.ogg', '-o', 'page.html']).communicate() + self.run_browser('page.html', '', '/report_result?1') + def test_sdl_audio_quickload(self): open(os.path.join(self.get_dir(), 'sdl_audio_quickload.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_audio_quickload.c')).read())) @@ -10555,6 +10986,13 @@ elif 'browser' in str(sys.argv): Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_linear.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate() self.run_browser('something.html', 'You should see an image with fog.', '/report_result?0') + def test_openal_playback(self): + shutil.copyfile(path_from_root('tests', 'sounds', 'audio.wav'), os.path.join(self.get_dir(), 'audio.wav')) + open(os.path.join(self.get_dir(), 'openal_playback.cpp'), 'w').write(self.with_report_result(open(path_from_root('tests', 'openal_playback.cpp')).read())) + + Popen([PYTHON, EMCC, '-O2', os.path.join(self.get_dir(), 'openal_playback.cpp'), '--preload-file', 'audio.wav', '-o', 'page.html']).communicate() + self.run_browser('page.html', '', '/report_result?1') + def test_worker(self): # Test running in a web worker output = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_worker.cpp'), '-o', 'worker.js'], stdout=PIPE, stderr=PIPE).communicate() @@ -10698,14 +11136,19 @@ elif 'browser' in str(sys.argv): self.run_browser('something.html', 'You should see animating gears.', '/report_result?0') def test_glgears_animation(self): - for emulation in [0, 1]: - print emulation - Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles.c'), '-o', 'something.html', - '-DHAVE_BUILTIN_SINCOS', '-s', 'GL_TESTING=1', - '--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')] + - (['-s', 'FORCE_GL_EMULATION=1'] if emulation else [])).communicate() - self.run_browser('something.html', 'You should see animating gears.', '/report_gl_result?true') - assert ('var GLEmulation' in open(self.in_dir('something.html')).read()) == emulation, "emulation code should be added when asked for" + es2_suffix = ['', '_full', '_full_944'] + for full_es2 in [0, 1, 2]: + for emulation in [0, 1]: + if full_es2 and emulation: continue + print full_es2, emulation + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles%s.c' % es2_suffix[full_es2]), '-o', 'something.html', + '-DHAVE_BUILTIN_SINCOS', '-s', 'GL_TESTING=1', + '--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')] + + (['-s', 'FORCE_GL_EMULATION=1'] if emulation else []) + + (['-s', 'FULL_ES2=1'] if full_es2 else []), + ).communicate() + self.run_browser('something.html', 'You should see animating gears.', '/report_gl_result?true') + assert ('var GLEmulation' in open(self.in_dir('something.html')).read()) == emulation, "emulation code should be added when asked for" def test_glgears_bad(self): # Make sure that OpenGL ES is not available if typed arrays are not used @@ -11282,7 +11725,7 @@ elif 'benchmark' in str(sys.argv): try_delete(final_filename) output = Popen([PYTHON, EMCC, filename, #'-O3', '-O2', '-s', 'INLINING_LIMIT=0', '-s', 'DOUBLE_MODE=0', '-s', 'PRECISE_I64_MATH=0',# '-s', 'EXPLICIT_ZEXT=1', - '-s', 'ASM_JS=1', '-s', 'USE_MATH_IMUL=1', + '-s', 'ASM_JS=1', '-s', 'USE_MATH_IMUL=1', '--llvm-lto', '1', '-s', 'TOTAL_MEMORY=128*1024*1024', '-s', 'FAST_MEMORY=10*1024*1024', '-o', final_filename] + shared_args + emcc_args, stdout=PIPE, stderr=self.stderr_redirect).communicate() assert os.path.exists(final_filename), 'Failed to compile file: ' + output[0] @@ -11297,7 +11740,8 @@ elif 'benchmark' in str(sys.argv): start = time.time() js_output = run_js(final_filename, engine=JS_ENGINE, args=args, stderr=PIPE, full_output=True) if i == 0 and 'Successfully compiled asm.js code' in js_output: - print "[%s was asm.js'ified]" % name + if 'asm.js link error' not in js_output: + print "[%s was asm.js'ified]" % name curr = time.time()-start times.append(curr) total_times[tests_done] += curr @@ -11873,66 +12317,69 @@ fi EMCC_CACHE = Cache.dirname - restore() - - Cache.erase() - assert not os.path.exists(EMCC_CACHE) + for compiler in [EMCC, EMXX]: + print compiler - try: - os.environ['EMCC_DEBUG'] ='1' - self.working_dir = os.path.join(TEMP_DIR, 'emscripten_temp') + restore() - # Building a file that doesn't need cached stuff should not trigger cache generation - output = self.do([EMCC, path_from_root('tests', 'hello_world.cpp')]) - assert INCLUDING_MESSAGE.replace('X', 'libc') not in output - assert BUILDING_MESSAGE.replace('X', 'libc') not in output - self.assertContained('hello, world!', run_js('a.out.js')) + Cache.erase() assert not os.path.exists(EMCC_CACHE) - try_delete('a.out.js') - - basebc_name = os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-0-basebc.bc') - dcebc_name1 = os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-1-linktime.bc') - dcebc_name2 = os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-2-linktime.bc') - ll_names = [os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-X-ll.ll').replace('X', str(x)) for x in range(2,5)] - - # Building a file that *does* need dlmalloc *should* trigger cache generation, but only the first time - for filename, libname in [('hello_malloc.cpp', 'libc'), ('hello_libcxx.cpp', 'libcxx')]: - for i in range(3): - print filename, libname, i - self.clear() - dcebc_name = dcebc_name1 if i == 0 else dcebc_name2 - try_delete(basebc_name) # we might need to check this file later - try_delete(dcebc_name) # we might need to check this file later - for ll_name in ll_names: try_delete(ll_name) - output = self.do([EMCC, '-O' + str(i), '-s', 'RELOOP=0', '--llvm-lto', '0', path_from_root('tests', filename)]) - #print output - assert INCLUDING_MESSAGE.replace('X', libname) in output - if libname == 'libc': - assert INCLUDING_MESSAGE.replace('X', 'libcxx') not in output # we don't need libcxx in this code - else: - assert INCLUDING_MESSAGE.replace('X', 'libc') in output # libcxx always forces inclusion of libc - assert (BUILDING_MESSAGE.replace('X', libname) in output) == (i == 0), 'Must only build the first time' - self.assertContained('hello, world!', run_js('a.out.js')) - assert os.path.exists(EMCC_CACHE) - assert os.path.exists(os.path.join(EMCC_CACHE, libname + '.bc')) - if libname == 'libcxx': - print os.stat(os.path.join(EMCC_CACHE, libname + '.bc')).st_size, os.stat(basebc_name).st_size, os.stat(dcebc_name).st_size - assert os.stat(os.path.join(EMCC_CACHE, libname + '.bc')).st_size > 1800000, 'libc++ is big' - assert os.stat(basebc_name).st_size > 1800000, 'libc++ is indeed big' - assert os.stat(dcebc_name).st_size < 750000, 'Dead code elimination must remove most of libc++' - # should only have metadata in -O0, not 1 and 2 - if i > 0: - for ll_name in ll_names: - ll = None - try: - ll = open(ll_name).read() - break - except: - pass - assert ll - assert ll.count('\n!') < 10 # a few lines are left even in -O1 and -O2 - finally: - del os.environ['EMCC_DEBUG'] + + try: + os.environ['EMCC_DEBUG'] ='1' + self.working_dir = os.path.join(TEMP_DIR, 'emscripten_temp') + + # Building a file that doesn't need cached stuff should not trigger cache generation + output = self.do([compiler, path_from_root('tests', 'hello_world.cpp')]) + assert INCLUDING_MESSAGE.replace('X', 'libc') not in output + assert BUILDING_MESSAGE.replace('X', 'libc') not in output + self.assertContained('hello, world!', run_js('a.out.js')) + assert not os.path.exists(EMCC_CACHE) + try_delete('a.out.js') + + basebc_name = os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-0-basebc.bc') + dcebc_name1 = os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-1-linktime.bc') + dcebc_name2 = os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-2-linktime.bc') + ll_names = [os.path.join(TEMP_DIR, 'emscripten_temp', 'emcc-X-ll.ll').replace('X', str(x)) for x in range(2,5)] + + # Building a file that *does* need dlmalloc *should* trigger cache generation, but only the first time + for filename, libname in [('hello_malloc.cpp', 'libc'), ('hello_libcxx.cpp', 'libcxx')]: + for i in range(3): + print filename, libname, i + self.clear() + dcebc_name = dcebc_name1 if i == 0 else dcebc_name2 + try_delete(basebc_name) # we might need to check this file later + try_delete(dcebc_name) # we might need to check this file later + for ll_name in ll_names: try_delete(ll_name) + output = self.do([compiler, '-O' + str(i), '-s', 'RELOOP=0', '--llvm-lto', '0', path_from_root('tests', filename)]) + #print output + assert INCLUDING_MESSAGE.replace('X', libname) in output + if libname == 'libc': + assert INCLUDING_MESSAGE.replace('X', 'libcxx') not in output # we don't need libcxx in this code + else: + assert INCLUDING_MESSAGE.replace('X', 'libc') in output # libcxx always forces inclusion of libc + assert (BUILDING_MESSAGE.replace('X', libname) in output) == (i == 0), 'Must only build the first time' + self.assertContained('hello, world!', run_js('a.out.js')) + assert os.path.exists(EMCC_CACHE) + assert os.path.exists(os.path.join(EMCC_CACHE, libname + '.bc')) + if libname == 'libcxx': + print os.stat(os.path.join(EMCC_CACHE, libname + '.bc')).st_size, os.stat(basebc_name).st_size, os.stat(dcebc_name).st_size + assert os.stat(os.path.join(EMCC_CACHE, libname + '.bc')).st_size > 1800000, 'libc++ is big' + assert os.stat(basebc_name).st_size > 1800000, 'libc++ is indeed big' + assert os.stat(dcebc_name).st_size < 750000, 'Dead code elimination must remove most of libc++' + # should only have metadata in -O0, not 1 and 2 + if i > 0: + for ll_name in ll_names: + ll = None + try: + ll = open(ll_name).read() + break + except: + pass + assert ll + assert ll.count('\n!') < 10 # a few lines are left even in -O1 and -O2 + finally: + del os.environ['EMCC_DEBUG'] # Manual cache clearing assert os.path.exists(EMCC_CACHE) @@ -11961,9 +12408,9 @@ fi assert ('bootstrapping relooper succeeded' in output) == (i == 2), 'only bootstrap on first O2: ' + output assert os.path.exists(RELOOPER) == (i >= 2), 'have relooper on O2: ' + output src = open('a.out.js').read() - main = src.split('function _main() {')[1].split('\n}\n')[0] - assert ('while (1) {' in main) == (i >= 2), 'reloop code on O2: ' + src - assert ('switch' not in main) == (i >= 2), 'reloop code on O2: ' + src + main = src.split('function _main()')[1].split('\n}\n')[0] + assert ('while (1) {' in main or 'while(1){' in main) == (i >= 2), 'reloop code on O2: ' + main + assert ('switch' not in main) == (i >= 2), 'reloop code on O2: ' + main def test_jcache(self): PRE_LOAD_MSG = 'loading pre from jcache' diff --git a/tests/sdl_audio.c b/tests/sdl_audio.c index 938df3c4..ce3bf5a9 100644 --- a/tests/sdl_audio.c +++ b/tests/sdl_audio.c @@ -6,13 +6,14 @@ Mix_Chunk *sound, *sound2; -void play2(); +int play2(); -void play() { +int play() { int channel = Mix_PlayChannel(-1, sound, 1); assert(channel == 0); emscripten_run_script("setTimeout(Module['_play2'], 500)"); + return channel; } void done(int channel) { @@ -22,11 +23,12 @@ void done(int channel) { REPORT_RESULT(); } -void play2() { +int play2() { Mix_ChannelFinished(done); int channel2 = Mix_PlayChannel(-1, sound2, 1); assert(channel2 == 1); + return channel2; } int main(int argc, char **argv) { @@ -40,7 +42,17 @@ int main(int argc, char **argv) { sound2 = Mix_LoadWAV("sound2.wav"); assert(sound); - play(); + int channel = play(); + printf( "Pausing Channel %d", channel ); + Mix_Pause(channel); + int paused = Mix_Paused(channel); + printf( "Channel %d %s", channel, paused ? "is paused" : "is NOT paused" ); + assert(paused); + Mix_Resume(channel); + paused = Mix_Paused(channel); + printf( "Channel %d %s", channel, paused ? "is paused" : "is NOT paused" ); + assert(paused == 0); + if (argc == 12121) play2(); // keep it alive emscripten_run_script("element = document.createElement('input');" diff --git a/tests/sdl_audio_mix.c b/tests/sdl_audio_mix.c new file mode 100644 index 00000000..f72f9c43 --- /dev/null +++ b/tests/sdl_audio_mix.c @@ -0,0 +1,85 @@ +#include <stdio.h> +#include <SDL/SDL.h> +#include <SDL/SDL_mixer.h> +#include <assert.h> +#include <emscripten.h> + +static Mix_Chunk *sound = NULL; +static Mix_Music *music = NULL; + +static int soundChannel = 0; + +void one_iter(); +void one_iter() { + static int frames = 0; + frames++; + + switch( frames ) { + case 1: + soundChannel = Mix_PlayChannel(-1, sound, 0); + printf("channel = %d", soundChannel); + assert(soundChannel != -1 && soundChannel != 0); + break; + case 2: + printf("channel %d is playing = %d", soundChannel, Mix_Playing(soundChannel)); + assert(Mix_Playing(soundChannel)); + break; + case 30: + Mix_Pause(soundChannel); + Mix_PlayMusic(music, 1); + break; + case 31: + assert(Mix_Paused(soundChannel)); + assert(Mix_PlayingMusic()); + break; + case 60: + Mix_Resume(soundChannel); + Mix_PauseMusic(); + break; + case 61: + assert(Mix_Playing(soundChannel)); + assert(Mix_PausedMusic()); + break; + case 90: + Mix_ResumeMusic(); + break; + case 91: + assert(Mix_PlayingMusic()); + break; + case 120: + Mix_HaltChannel(soundChannel); + Mix_HaltMusic(); + int result = 1; + REPORT_RESULT(); + break; + }; +} + + +int main(int argc, char **argv) { + SDL_Init(SDL_INIT_AUDIO); + Mix_Init(MIX_INIT_OGG); + + // This reserves channel 0 for other purposes. + // We are just going to verify that we are not + // allocated channel 0 when we call Mix_PlayChannel(-1, ...) + Mix_ReserveChannels(1); + + int ret = Mix_OpenAudio(0, 0, 0, 0); // we ignore all these.. + assert(ret == 0); + + sound = Mix_LoadWAV("sound.ogg"); + assert(sound); + music = Mix_LoadMUS("music.ogg"); + assert(music); + + emscripten_set_main_loop(one_iter, 30, 0); + + // force a quit + while(Mix_Init(0)) + Mix_Quit(); + Mix_CloseAudio(); + + return 0; +} + diff --git a/tests/sounds/audio.wav b/tests/sounds/audio.wav Binary files differnew file mode 100644 index 00000000..dd1b8057 --- /dev/null +++ b/tests/sounds/audio.wav diff --git a/tests/sounds/pluck.ogg b/tests/sounds/pluck.ogg Binary files differnew file mode 100644 index 00000000..20f7b854 --- /dev/null +++ b/tests/sounds/pluck.ogg diff --git a/tests/sounds/the_entertainer.ogg b/tests/sounds/the_entertainer.ogg Binary files differnew file mode 100644 index 00000000..249e74f7 --- /dev/null +++ b/tests/sounds/the_entertainer.ogg diff --git a/tools/cache.py b/tools/cache.py index e7908fba..13a53fe9 100644 --- a/tools/cache.py +++ b/tools/cache.py @@ -73,7 +73,8 @@ class JCache: try: data = cPickle.loads(zlib.decompress(open(cachename).read())) except Exception, e: - if DEBUG_CACHE: print >> sys.stderr, 'jcache decompress/unpickle error:', e + if self.debug: print >> sys.stderr, 'jcache decompress/unpickle error:', e + return if len(data) != 2: if self.debug: print >> sys.stderr, 'jcache error in get' return @@ -96,7 +97,7 @@ class JCache: f.write(zlib.compress(cPickle.dumps([keys, value]))) f.close() except Exception, e: - if DEBUG_CACHE: print >> sys.stderr, 'jcache compress/pickle error:', e + if self.debug: print >> sys.stderr, 'jcache compress/pickle error:', e return # for i in range(len(keys)): # open(cachename + '.key' + str(i), 'w').write(keys[i]) diff --git a/tools/eliminator/eliminator-test-output.js b/tools/eliminator/eliminator-test-output.js index 32b7ddcf..69539e91 100644 --- a/tools/eliminator/eliminator-test-output.js +++ b/tools/eliminator/eliminator-test-output.js @@ -192,13 +192,6 @@ function strtok_part(b, j, f) { function py() { HEAP[HEAP[HEAP[__PyThreadState_Current] + 12] + 1 + 12] = 99; } -function otherPy() { - var $4 = HEAP[__PyThreadState_Current]; - var $5 = $4 + 12; - var $7 = HEAP[$5] + 1; - var $8 = $4 + 12; - HEAP[$8] = $7; -} var anon = (function(x) { var $4 = HEAP[__PyThreadState_Current]; var $5 = $4 + 12; diff --git a/tools/eliminator/eliminator-test.js b/tools/eliminator/eliminator-test.js index 13ecab59..3edd61ac 100644 --- a/tools/eliminator/eliminator-test.js +++ b/tools/eliminator/eliminator-test.js @@ -230,13 +230,6 @@ function py() { var $8 = $7 + 12; HEAP[$8] = 99; } -function otherPy() { - var $4 = HEAP[__PyThreadState_Current]; - var $5 = $4 + 12; - var $7 = HEAP[$5] + 1; - var $8 = $4 + 12; - HEAP[$8] = $7; -} var anon = function(x) { var $4 = HEAP[__PyThreadState_Current]; var $5 = $4 + 12; diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f2dc516a..48ab5a1f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -140,15 +140,10 @@ var UNDEFINED_NODE = ['unary-prefix', 'void', ['num', 0]]; var TRUE_NODE = ['unary-prefix', '!', ['num', 0]]; var FALSE_NODE = ['unary-prefix', '!', ['num', 1]]; -var GENERATED_FUNCTIONS_MARKER = '// EMSCRIPTEN_GENERATED_FUNCTIONS:'; -var generatedFunctions = null; -function setGeneratedFunctions(metadata) { - var start = metadata.indexOf(GENERATED_FUNCTIONS_MARKER); - generatedFunctions = set(eval(metadata.substr(start + GENERATED_FUNCTIONS_MARKER.length))); -} -function isGenerated(ident) { - return ident in generatedFunctions; -} +var GENERATED_FUNCTIONS_MARKER = '// EMSCRIPTEN_GENERATED_FUNCTIONS'; +var generatedFunctions = false; // whether we have received only generated functions + +var minifierInfo = null; function srcToAst(src) { return uglify.parser.parse(src); @@ -216,7 +211,7 @@ function traverse(node, pre, post, stack) { function traverseGenerated(ast, pre, post, stack) { assert(generatedFunctions); traverse(ast, function(node) { - if (node[0] == 'defun' && isGenerated(node[1])) { + if (node[0] == 'defun') { traverse(node, pre, post, stack); return null; } @@ -225,12 +220,15 @@ function traverseGenerated(ast, pre, post, stack) { function traverseGeneratedFunctions(ast, callback) { assert(generatedFunctions); - traverse(ast, function(node) { - if (node[0] == 'defun' && isGenerated(node[1])) { - callback(node); - return null; + if (ast[0] == 'toplevel') { + var stats = ast[1]; + for (var i = 0; i < stats.length; i++) { + var curr = stats[i]; + if (curr[0] == 'defun') callback(curr); } - }); + } else if (ast[0] == 'defun') { + callback(ast); + } } // Walk the ast in a simple way, with an understanding of which JS variables are defined) @@ -542,9 +540,39 @@ function simplifyExpressionsPre(ast) { }); } + function asmOpts(ast) { + // 1. Add final returns when necessary + // 2. Remove unneeded coercions on function calls that have no targets (eliminator removed it) + traverseGeneratedFunctions(ast, function(fun) { + var returnType = null; + traverse(fun, function(node, type) { + if (type == 'return' && node[1]) { + returnType = detectAsmCoercion(node[1]); + } else if (type == 'stat') { + var inner = node[1]; + if ((inner[0] == 'binary' && inner[1] in ASSOCIATIVE_BINARIES && inner[2][0] == 'call' && inner[3][0] == 'num') || + (inner[0] == 'unary-prefix' && inner[1] == '+' && inner[2][0] == 'call')) { + node[1] = inner[2]; + } + } + }); + // Add a final return if one is missing. + if (returnType !== null) { + var stats = getStatements(fun); + var last = stats[stats.length-1]; + if (last[0] != 'return') { + var returnValue = ['num', 0]; + if (returnType == ASM_DOUBLE) returnValue = ['unary-prefix', '+', returnValue]; + stats.push(['return', returnValue]); + } + } + }); + } + simplifyBitops(ast); joinAdditions(ast); // simplifyZeroComp(ast); TODO: investigate performance + if (asm) asmOpts(ast); } // In typed arrays mode 2, we can have @@ -1307,7 +1335,9 @@ function normalizeAsm(func) { var node = stats[i]; if (node[0] != 'stat' || node[1][0] != 'assign' || node[1][2][0] != 'name') break; node = node[1]; - data.params[node[2][1]] = detectAsmCoercion(node[3]); + var name = node[2][1]; + if (func[2] && func[2].indexOf(name) < 0) break; // not an assign into a parameter, but a global + data.params[name] = detectAsmCoercion(node[3]); stats[i] = emptyNode(); i++; } @@ -1400,7 +1430,10 @@ function denormalizeAsm(func, data) { //printErr('denormalized \n\n' + astToSrc(func) + '\n\n'); } -// Very simple 'registerization', coalescing of variables into a smaller number. +// Very simple 'registerization', coalescing of variables into a smaller number, +// as part of minification. Globals-level minification began in a previous pass, +// we receive minifierInfo which tells us how to rename globals. (Only in asm.js.) +// // We do not optimize when there are switches, so this pass only makes sense with // relooping. // TODO: Consider how this fits in with the rest of the optimization toolchain. Do @@ -1427,7 +1460,6 @@ function registerize(ast) { // We also mark local variables - i.e., having a var definition var localVars = {}; var hasSwitch = false; // we cannot optimize variables if there is a switch - var returnType = null; // for asm traverse(fun, function(node, type) { if (type == 'var') { node[1].forEach(function(defined) { localVars[defined[0]] = 1 }); @@ -1439,11 +1471,74 @@ function registerize(ast) { } } else if (type == 'switch') { hasSwitch = true; - } else if (asm && type == 'return' && node[1]) { - returnType = detectAsmCoercion(node[1]); } }); vacuum(fun); + if (minifierInfo) { + assert(asm); + var usedGlobals = {}; + var nextLocal = 0; + // Minify globals using the mapping we were given + traverse(fun, function(node, type) { + if (type == 'name') { + var name = node[1]; + var minified = minifierInfo.globals[name]; + if (minified) { + assert(!localVars[name], name); // locals must not shadow globals, or else we don't know which is which + if (localVars[minified]) { + // trying to minify a global into a name used locally. rename all the locals + var newName = '$_newLocal_' + (nextLocal++); + assert(!localVars[newName]); + if (params[minified]) { + params[newName] = 1; + delete params[minified]; + } + localVars[newName] = 1; + delete localVars[minified]; + asmData.vars[newName] = asmData.vars[minified]; + delete asmData.vars[minified]; + asmData.params[newName] = asmData.params[minified]; + delete asmData.params[minified]; + traverse(fun, function(node, type) { + if (type == 'name' && node[1] == minified) { + node[1] = newName; + } + }); + if (fun[2]) { + for (var i = 0; i < fun[2].length; i++) { + if (fun[2][i] == minified) fun[2][i] = newName; + } + } + } + node[1] = minified; + usedGlobals[minified] = 1; + } + } + }); + assert(fun[1] in minifierInfo.globals, fun[1]); + fun[1] = minifierInfo.globals[fun[1]]; + assert(fun[1]); + var nextRegName = 0; + } + var regTypes = {}; + function getNewRegName(num, name) { + if (!asm) return 'r' + num; + var type = asmData.vars[name]; + if (!minifierInfo) { + var ret = (type ? 'd' : 'i') + num; + regTypes[ret] = type; + return ret; + } + // find the next free minified name that is not used by a global that shows up in this function + while (nextRegName < minifierInfo.names.length) { + var ret = minifierInfo.names[nextRegName++]; + if (!usedGlobals[ret]) { + regTypes[ret] = type; + return ret; + } + } + assert('ran out of names'); + } // Find the # of uses of each variable. // While doing so, check if all a variable's uses are dominated in a simple // way by a simple assign, if so, then we can assign its register to it @@ -1528,7 +1623,7 @@ function registerize(ast) { saved++; } else { reg = nextReg++; - fullNames[reg] = (asm ? (asmData.vars[name] ? 'd' : 'i') : 'r') + reg; // TODO: even smaller names + fullNames[reg] = getNewRegName(reg, name); if (params[name]) paramRegs[reg] = 1; } varRegs[name] = reg; @@ -1572,7 +1667,7 @@ function registerize(ast) { if (loopRegs[loops]) { if (asm) { loopRegs[loops].forEach(function(loopReg) { - freeRegsClasses[fullNames[loopReg][0] == 'i' ? ASM_INT : ASM_DOUBLE].push(loopReg); + freeRegsClasses[regTypes[fullNames[loopReg]]].push(loopReg); }); } else { freeRegsClasses = freeRegsClasses.concat(loopRegs[loops]); @@ -1608,7 +1703,7 @@ function registerize(ast) { }; for (var i = 1; i < nextReg; i++) { var reg = fullNames[i]; - var type = reg[0] == 'i' ? ASM_INT : ASM_DOUBLE + var type = regTypes[reg]; if (!paramRegs[i]) { finalAsmData.vars[reg] = type; } else { @@ -1617,17 +1712,6 @@ function registerize(ast) { } } denormalizeAsm(fun, finalAsmData); - // Add a final return if one is missing. This is not strictly a register operation, but - // this pass traverses the entire AST anyhow so adding it here is efficient. - if (returnType !== null) { - var stats = getStatements(fun); - var last = stats[stats.length-1]; - if (last[0] != 'return') { - var returnValue = ['num', 0]; - if (returnType == ASM_DOUBLE) returnValue = ['unary-prefix', '+', returnValue]; - stats.push(['return', returnValue]); - } - } } }); } @@ -2162,6 +2246,43 @@ function eliminateMemSafe(ast) { eliminate(ast, true); } +function minifyGlobals(ast) { + var minified = {}; + var next = 0; + var first = true; // do not minify initial 'var asm =' + // find the globals + traverse(ast, function(node, type) { + if (type == 'var') { + if (first) { + first = false; + return; + } + var vars = node[1]; + for (var i = 0; i < vars.length; i++) { + var name = vars[i][0]; + assert(next < minifierInfo.names.length); + vars[i][0] = minified[name] = minifierInfo.names[next++]; + } + } + }); + // add all globals in function chunks, i.e. not here but passed to us + for (var i = 0; i < minifierInfo.globals.length; i++) { + name = minifierInfo.globals[i]; + assert(next < minifierInfo.names.length); + minified[name] = minifierInfo.names[next++]; + } + // apply minification + traverse(ast, function(node, type) { + if (type == 'name') { + var name = node[1]; + if (name in minified) { + node[1] = minified[name]; + } + } + }); + suffix = '// MINIFY_INFO:' + JSON.stringify(minified); +} + // Change +5 to DOT$ZERO(5). We then textually change 5 to 5.0 (uglify's ast cannot differentiate between 5 and 5.0 directly) function prepDotZero(ast) { traverse(ast, function(node, type) { @@ -2207,6 +2328,7 @@ var passes = { registerize: registerize, eliminate: eliminate, eliminateMemSafe: eliminateMemSafe, + minifyGlobals: minifyGlobals, compress: function() { compress = true }, noPrintMetadata: function() { printMetadata = false }, asm: function() { asm = true }, @@ -2215,12 +2337,15 @@ var passes = { // Main +var suffix = ''; + var src = read(arguments_[0]); var ast = srcToAst(src); //printErr(JSON.stringify(ast)); throw 1; -var metadata = src.split('\n').filter(function(line) { return line.indexOf(GENERATED_FUNCTIONS_MARKER) >= 0 })[0]; -//assert(metadata, 'Must have EMSCRIPTEN_GENERATED_FUNCTIONS metadata'); -if (metadata) setGeneratedFunctions(metadata); +generatedFunctions = src.indexOf(GENERATED_FUNCTIONS_MARKER) >= 0; +var minifierInfoStart = src.indexOf('// MINIFY_INFO:') +if (minifierInfoStart > 0) minifierInfo = JSON.parse(src.substr(minifierInfoStart + 15)); +//printErr(JSON.stringify(minifierInfo)); arguments_.slice(1).forEach(function(arg) { passes[arg](ast); @@ -2240,4 +2365,5 @@ do { } while (js != old); print(js); print('\n'); +print(suffix); diff --git a/tools/js_optimizer.py b/tools/js_optimizer.py index 2fd2211b..1f1c1354 100644 --- a/tools/js_optimizer.py +++ b/tools/js_optimizer.py @@ -1,5 +1,5 @@ -import os, sys, subprocess, multiprocessing, re +import os, sys, subprocess, multiprocessing, re, string, json import shared configuration = shared.configuration @@ -19,6 +19,78 @@ WINDOWS = sys.platform.startswith('win') DEBUG = os.environ.get('EMCC_DEBUG') +func_sig = re.compile('( *)function ([_\w$]+)\(') + +class Minifier: + ''' + asm.js minification support. We calculate possible names and minification of + globals here, then pass that into the parallel js-optimizer.js runners which + during registerize perform minification of locals. + ''' + + def __init__(self, js, js_engine): + self.js = js + self.js_engine = js_engine + + # Create list of valid short names + + MAX_NAMES = 60000 + INVALID_2 = set(['do', 'if', 'in']) + INVALID_3 = set(['for', 'new', 'try', 'var', 'env']) + + self.names = [] + init_possibles = string.ascii_letters + '_$' + later_possibles = init_possibles + string.digits + for a in init_possibles: + if len(self.names) >= MAX_NAMES: break + self.names.append(a) + for a in init_possibles: + for b in later_possibles: + if len(self.names) >= MAX_NAMES: break + curr = a + b + if curr not in INVALID_2: self.names.append(curr) + for a in init_possibles: + for b in later_possibles: + for c in later_possibles: + if len(self.names) >= MAX_NAMES: break + curr = a + b + c + if curr not in INVALID_3: self.names.append(curr) + #print >> sys.stderr, self.names + + def minify_shell(self, shell, compress): + #print >> sys.stderr, "MINIFY SHELL 1111111111", shell, "\n222222222222222" + # Run through js-optimizer.js to find and minify the global symbols + # We send it the globals, which it parses at the proper time. JS decides how + # to minify all global names, we receive a dictionary back, which is then + # used by the function processors + + shell = shell.replace('0.0', '13371337') # avoid uglify doing 0.0 => 0 + + # Find all globals in the JS functions code + self.globs = [m.group(2) for m in func_sig.finditer(self.js)] + + temp_file = temp_files.get('.minifyglobals.js').name + f = open(temp_file, 'w') + f.write(shell) + f.write('\n') + self + f.write('// MINIFY_INFO:' + self.serialize()) + f.close() + + output = subprocess.Popen(self.js_engine + [JS_OPTIMIZER, temp_file, 'minifyGlobals', 'noPrintMetadata'] + (['compress'] if compress else []), stdout=subprocess.PIPE).communicate()[0] + assert len(output) > 0 and not output.startswith('Assertion failed'), 'Error in js optimizer: ' + output + #print >> sys.stderr, "minified SHELL 3333333333333333", output, "\n44444444444444444444" + code, metadata = output.split('// MINIFY_INFO:') + self.globs = json.loads(metadata) + return code.replace('13371337', '0.0') + + + def serialize(self): + return json.dumps({ + 'names': self.names, + 'globals': self.globs + }) + def run_on_chunk(command): filename = command[2] # XXX hackish #print >> sys.stderr, 'running js optimizer command', ' '.join(command), '""""', open(filename).read() @@ -28,6 +100,7 @@ def run_on_chunk(command): f = open(filename, 'w') f.write(output) f.close() + if DEBUG: print >> sys.stderr, '.' return filename def run_on_js(filename, passes, js_engine, jcache): @@ -46,10 +119,25 @@ def run_on_js(filename, passes, js_engine, jcache): suffix_start = js.find(suffix_marker) suffix = '' if suffix_start >= 0: - suffix = js[suffix_start:js.find('\n', suffix_start)] + '\n' + suffix_end = js.find('\n', suffix_start) + suffix = js[suffix_start:suffix_end] + '\n' # if there is metadata, we will run only on the generated functions. If there isn't, we will run on everything. generated = set(eval(suffix[len(suffix_marker)+1:])) + # Find markers + start_funcs_marker = '// EMSCRIPTEN_START_FUNCS\n' + end_funcs_marker = '// EMSCRIPTEN_END_FUNCS\n' + start_funcs = js.find(start_funcs_marker) + end_funcs = js.rfind(end_funcs_marker) + assert (start_funcs >= 0) == (end_funcs >= 0) == (not not suffix) + asm_registerize = 'asm' in passes and 'registerize' in passes + if asm_registerize: + start_asm_marker = '// EMSCRIPTEN_START_ASM\n' + end_asm_marker = '// EMSCRIPTEN_END_ASM\n' + start_asm = js.find(start_asm_marker) + end_asm = js.rfind(end_asm_marker) + assert (start_asm >= 0) == (end_asm >= 0) + if not suffix and jcache: # JCache cannot be used without metadata, since it might reorder stuff, and that's dangerous since only generated can be reordered # This means jcache does not work after closure compiler runs, for example. But you won't get much benefit from jcache with closure @@ -57,29 +145,45 @@ def run_on_js(filename, passes, js_engine, jcache): if DEBUG: print >>sys.stderr, 'js optimizer: no metadata, so disabling jcache' jcache = False - # If we process only generated code, find that and save the rest on the side - func_sig = re.compile('( *)function (_[\w$]+)\(') if suffix: - pos = 0 - gen_start = 0 - gen_end = 0 - while 1: - m = func_sig.search(js, pos) - if not m: break - pos = m.end() - indent = m.group(1) - ident = m.group(2) - if ident in generated: - if not gen_start: - gen_start = m.start() - assert gen_start - gen_end = js.find('\n%s}\n' % indent, m.end()) + (3 + len(indent)) - assert gen_end > gen_start - pre = js[:gen_start] - post = js[gen_end:] + if not asm_registerize: + pre = js[:start_funcs + len(start_funcs_marker)] + post = js[end_funcs + len(end_funcs_marker):] + js = js[start_funcs + len(start_funcs_marker):end_funcs] + if 'asm' not in passes: # can have Module[..] and inlining prevention code, push those to post + class Finals: + buf = [] + def process(line): + if len(line) > 0 and (line.startswith(('Module[', 'if (globalScope)')) or line.endswith('["X"]=1;')): + Finals.buf.append(line) + return False + return True + js = '\n'.join(filter(process, js.split('\n'))) + post = '\n'.join(Finals.buf) + '\n' + post + post = end_funcs_marker + post + else: + # We need to split out the asm shell as well, for minification + pre = js[:start_asm + len(start_asm_marker)] + post = js[end_asm:] + asm_shell = js[start_asm + len(start_asm_marker):start_funcs + len(start_funcs_marker)] + ''' +EMSCRIPTEN_FUNCS(); +''' + js[end_funcs + len(end_funcs_marker):end_asm + len(end_asm_marker)] + js = js[start_funcs + len(start_funcs_marker):end_funcs] + + minifier = Minifier(js, js_engine) + asm_shell_pre, asm_shell_post = minifier.minify_shell(asm_shell, 'compress' in passes).split('EMSCRIPTEN_FUNCS();'); + asm_shell_post = asm_shell_post.replace('});', '})'); + pre += asm_shell_pre + '\n' + start_funcs_marker + post = end_funcs_marker + asm_shell_post + post + + minify_info = minifier.serialize() + #if DEBUG: print >> sys.stderr, 'minify info:', minify_info + # remove suffix if no longer needed if 'last' in passes: - post = post.replace(suffix, '') # no need to write out the metadata - nothing after us needs it - js = js[gen_start:gen_end] + suffix_start = post.find(suffix_marker) + suffix_end = post.find('\n', suffix_start) + post = post[:suffix_start] + post[suffix_end:] + else: pre = '' post = '' @@ -131,7 +235,10 @@ def run_on_js(filename, passes, js_engine, jcache): temp_file = temp_files.get('.jsfunc_%d.js' % i).name f = open(temp_file, 'w') f.write(chunk) - f.write(suffix) + f.write(suffix_marker) + if asm_registerize: + f.write('\n') + f.write('// MINIFY_INFO:' + minify_info) f.close() return temp_file filenames = [write_chunk(chunks[i], i) for i in range(len(chunks))] diff --git a/tools/settings_template_readonly.py b/tools/settings_template_readonly.py index 970a8f8c..7ab89b48 100644 --- a/tools/settings_template_readonly.py +++ b/tools/settings_template_readonly.py @@ -5,17 +5,16 @@ import os # this helps projects using emscripten find it -EMSCRIPTEN_ROOT = os.path.expanduser(os.getenv('EMSCRIPTEN') or '{{{ EMSCRIPTEN_ROOT }}}') -LLVM_ROOT = os.path.expanduser(os.getenv('LLVM') or '{{{ LLVM_ROOT }}}') -PYTHON = os.path.expanduser(os.getenv('PYTHON') or '{{{ PYTHON }}}') +EMSCRIPTEN_ROOT = os.path.expanduser(os.getenv('EMSCRIPTEN') or '{{{ EMSCRIPTEN_ROOT }}}') # directory +LLVM_ROOT = os.path.expanduser(os.getenv('LLVM') or '{{{ LLVM_ROOT }}}') # directory +PYTHON = os.path.expanduser(os.getenv('PYTHON') or '{{{ PYTHON }}}') # executable # See below for notes on which JS engine(s) you need -NODE_JS = os.path.expanduser(os.getenv('NODE') or '{{{ NODE }}}') -SPIDERMONKEY_ENGINE = [ - os.path.expanduser(os.getenv('SPIDERMONKEY') or 'js'), '-m', '-n'] -V8_ENGINE = os.path.expanduser(os.getenv('V8') or 'd8') +NODE_JS = os.path.expanduser(os.getenv('NODE') or '{{{ NODE }}}') # executable +SPIDERMONKEY_ENGINE = [os.path.expanduser(os.getenv('SPIDERMONKEY') or 'js')] # executable +V8_ENGINE = os.path.expanduser(os.getenv('V8') or 'd8') # executable -JAVA = 'java' +JAVA = 'java' # executable TEMP_DIR = '/tmp' # You will need to modify this on Windows diff --git a/tools/shared.py b/tools/shared.py index 09f6aef4..81a8e053 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -181,7 +181,7 @@ def check_node_version(): # we re-check sanity when the settings are changed) # We also re-check sanity and clear the cache when the version changes -EMSCRIPTEN_VERSION = '1.2.6' +EMSCRIPTEN_VERSION = '1.3.0' def check_sanity(force=False): try: @@ -388,11 +388,11 @@ if USE_EMSDK: # Note that -nostdinc++ is not needed, since -nostdinc implies that! EMSDK_OPTS = ['-nostdinc', '-Xclang', '-nobuiltininc', '-Xclang', '-nostdsysteminc', '-Xclang', '-isystem' + path_from_root('system', 'local', 'include'), + '-Xclang', '-isystem' + path_from_root('system', 'include', 'libcxx'), '-Xclang', '-isystem' + path_from_root('system', 'include'), '-Xclang', '-isystem' + path_from_root('system', 'include', 'emscripten'), '-Xclang', '-isystem' + path_from_root('system', 'include', 'bsd'), # posix stuff '-Xclang', '-isystem' + path_from_root('system', 'include', 'libc'), - '-Xclang', '-isystem' + path_from_root('system', 'include', 'libcxx'), '-Xclang', '-isystem' + path_from_root('system', 'lib', 'libcxxabi', 'include'), '-Xclang', '-isystem' + path_from_root('system', 'include', 'gfx'), '-Xclang', '-isystem' + path_from_root('system', 'include', 'net'), @@ -1141,6 +1141,9 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e print >> sys.stderr, 'bootstrapping relooper...' os.chdir(path_from_root('src')) + emcc_debug = os.environ.get('EMCC_DEBUG') + if emcc_debug: del os.environ['EMCC_DEBUG'] + def make(opt_level): raw = relooper + '.raw.js' Building.emcc(os.path.join('relooper', 'Relooper.cpp'), ['-I' + os.path.join('relooper'), '--post-js', @@ -1169,6 +1172,7 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e ok = True finally: os.chdir(curr) + if emcc_debug: os.environ['EMCC_DEBUG'] = emcc_debug if not ok: print >> sys.stderr, 'bootstrapping relooper failed. You may need to manually create relooper.js by compiling it, see src/relooper/emscripten' 1/0 diff --git a/tools/test-js-optimizer-asm-pre-output.js b/tools/test-js-optimizer-asm-pre-output.js index 3437163e..53619c84 100644 --- a/tools/test-js-optimizer-asm-pre-output.js +++ b/tools/test-js-optimizer-asm-pre-output.js @@ -6,6 +6,8 @@ function a() { f(8); HEAP[1024] = 5; HEAP[1024] = 5; + whee(12, 13); + whee(12, 13); } function b($this, $__n) { $this = $this | 0; @@ -51,4 +53,24 @@ function b($this, $__n) { HEAP8[$38 + $40 & 16777215] = 0; return; } +function rett() { + if (f()) { + g(); + return 5; + } + return 0; +} +function ret2t() { + if (f()) { + g(); + return; + } +} +function retf() { + if (f()) { + g(); + return +h(); + } + return +0; +} diff --git a/tools/test-js-optimizer-asm-pre.js b/tools/test-js-optimizer-asm-pre.js index 42eb435a..0fb7050f 100644 --- a/tools/test-js-optimizer-asm-pre.js +++ b/tools/test-js-optimizer-asm-pre.js @@ -6,6 +6,8 @@ function a() { f(347 & 12); HEAP[4096 >> 2] = 5; HEAP[(4096 & 8191) >> 2] = 5; + whee(12, 13) | 0; + +whee(12, 13); } function b($this, $__n) { $this = $this | 0; @@ -51,4 +53,25 @@ function b($this, $__n) { HEAP8[($38 + $40 | 0) & 16777215] = 0; return; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b"] +function rett() { + if (f()) { + g(); + return 5; + } + // missing final return, need to add it +} +function ret2t() { + if (f()) { + g(); + return; + } + // missing final return, but no need +} +function retf() { + if (f()) { + g(); + return +h(); + } + // missing final return, need it as a float +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "rett", "ret2t", "retf"] diff --git a/tools/test-js-optimizer-asm-regs-min-output.js b/tools/test-js-optimizer-asm-regs-min-output.js new file mode 100644 index 00000000..b8088022 --- /dev/null +++ b/tools/test-js-optimizer-asm-regs-min-output.js @@ -0,0 +1,36 @@ +function cl(b) { + b = b | 0; + var c = 0; + c = b * b; + a(c); + i1(b); +} +function cl(b) { + b = b | 0; + var c = 0; + c = b * b; + a(c); + i1(b); +} +function cl(b) { + b = b | 0; + var c = 0; + c = b * b; + a(c); + i1(b); +} +function cl(b) { + b = b | 0; + var c = 0; + c = b * b; + a(c); + i1(b); +} +function cl(b) { + b = b | 0; + var c = 0; + c = b * b; + a(c); + i1(b); +} + diff --git a/tools/test-js-optimizer-asm-regs-min.js b/tools/test-js-optimizer-asm-regs-min.js new file mode 100644 index 00000000..c126946d --- /dev/null +++ b/tools/test-js-optimizer-asm-regs-min.js @@ -0,0 +1,37 @@ +function collideLocal(x) { + x = x | 0; + var a = 0; + a = x*x; + aGlobal(a); // aGlobal needs to be minified into a, but a is used! + bGlobal(x); +} +function collideLocal(x) { + x = x | 0; + var i1 = 0; + i1 = x*x; + aGlobal(i1); + bGlobal(x); // bGlobal needs to be minified into i1, but i1 is used! +} +function collideLocal(a) { + a = a | 0; + var x = 0; + x = a*a; + aGlobal(x); // aGlobal needs to be minified into a, but a is used by a param! + bGlobal(a); +} +function collideLocal(i1) { + i1 = i1 | 0; + var x = 0; + x = i1*i1; + aGlobal(x); + bGlobal(i1); // bGlobal needs to be minified into i1, but i1 is used by a param! +} +function collideLocal(i1) { + i1 = i1 | 0; + var a = 0; + a = i1*i1; + aGlobal(a); // multiple collisions, a and i1 + bGlobal(i1); +} +// EMSCRIPTEN_GENERATED_FUNCTIONS +// MINIFY_INFO: { "names": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "i1", "cl"], "globals": { "aGlobal": "a", "bGlobal": "i1", "collideLocal": "cl" } } diff --git a/tools/test-js-optimizer-asm-regs-output.js b/tools/test-js-optimizer-asm-regs-output.js index 99bccd2e..bb6a502b 100644 --- a/tools/test-js-optimizer-asm-regs-output.js +++ b/tools/test-js-optimizer-asm-regs-output.js @@ -18,24 +18,8 @@ function _doit(i1, i2, i3) { STACKTOP = i1; return 0 | 0; } -function rett() { - if (f()) { - g(); - return 5; - } - return 0; -} -function ret2t() { - if (f()) { - g(); - return; - } -} -function retf() { - if (f()) { - g(); - return +h(); - } - return +0; +function stackRestore(i1) { + i1 = i1 | 0; + STACKTOP = i1; } diff --git a/tools/test-js-optimizer-asm-regs.js b/tools/test-js-optimizer-asm-regs.js index 0afced29..4f7e04d4 100644 --- a/tools/test-js-optimizer-asm-regs.js +++ b/tools/test-js-optimizer-asm-regs.js @@ -20,26 +20,9 @@ function _doit($x, $y$0, $y$1) { STACKTOP = __stackBase__; return 0 | 0; } -function rett() { - if (f()) { - g(); - return 5; - } - // missing final return, need to add it +function stackRestore(top) { + top = top|0; + STACKTOP = top; } -function ret2t() { - if (f()) { - g(); - return; - } - // missing final return, but no need -} -function retf() { - if (f()) { - g(); - return +h(); - } - // missing final return, need it as a float -} -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "rett", "ret2t", "retf"] +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "stackRestore"] diff --git a/tools/test-js-optimizer-output.js b/tools/test-js-optimizer-output.js index 5c06475e..13f927de 100644 --- a/tools/test-js-optimizer-output.js +++ b/tools/test-js-optimizer-output.js @@ -35,12 +35,6 @@ function loopy() { next(); something(); } -function ignoreLoopy() { - b$for_cond$4 : while (1) { - if ($ok) break b$for_cond$4; - var $inc = $ok + 1; - } -} function bits() { print(($s & 65535) + ((($f & 65535) << 16 >> 16) * (($f & 65535) << 16 >> 16) | 0) % 256 & 65535); z(HEAP32[$id + 40 >> 2]); diff --git a/tools/test-js-optimizer.js b/tools/test-js-optimizer.js index 982e3230..bd3be281 100644 --- a/tools/test-js-optimizer.js +++ b/tools/test-js-optimizer.js @@ -37,12 +37,6 @@ function loopy() { something(); } while(0); } -function ignoreLoopy() { - b$for_cond$4: while(1) { - if ($ok) break b$for_cond$4; - var $inc=$ok+1; - } -} function bits() { print((($s & 65535) + ((($f & 65535) << 16 >> 16) * (($f & 65535) << 16 >> 16) | 0 | 0) % 256 | 0) & 65535); z(HEAP32[($id + 40 | 0) >> 2]); |