aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemcc52
-rwxr-xr-xemscripten.py22
-rw-r--r--src/analyzer.js5
-rw-r--r--src/compiler.js1
-rw-r--r--src/intertyper.js23
-rw-r--r--src/jsifier.js18
-rw-r--r--src/library_gl.js12
-rw-r--r--src/modules.js4
-rw-r--r--src/preamble.js17
-rw-r--r--src/runtime.js2
-rw-r--r--src/settings.js8
-rw-r--r--tests/cases/phi24_ta2.ll1876
-rw-r--r--tests/cases/phi24_ta2.txt1
-rw-r--r--tests/fuzz/12.c2567
-rw-r--r--tests/fuzz/12.c.txt1
-rwxr-xr-xtests/fuzz/csmith_driver.py10
-rwxr-xr-xtests/runner.py281
-rw-r--r--tools/js-optimizer.js183
-rw-r--r--tools/js_optimizer.py153
-rw-r--r--tools/shared.py2
-rw-r--r--tools/test-js-optimizer-asm-pre-output.js22
-rw-r--r--tools/test-js-optimizer-asm-pre.js25
-rw-r--r--tools/test-js-optimizer-asm-regs-min-output.js36
-rw-r--r--tools/test-js-optimizer-asm-regs-min.js37
-rw-r--r--tools/test-js-optimizer-asm-regs-output.js22
-rw-r--r--tools/test-js-optimizer-asm-regs.js25
26 files changed, 5201 insertions, 204 deletions
diff --git a/emcc b/emcc
index fa62acb1..d06bb21c 100755
--- a/emcc
+++ b/emcc
@@ -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)
@@ -332,13 +332,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 +449,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 +701,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:
@@ -823,6 +830,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
@@ -974,6 +986,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
@@ -983,7 +996,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
@@ -1084,10 +1097,14 @@ try:
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')
@@ -1235,6 +1252,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')
@@ -1347,14 +1367,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']
@@ -1362,11 +1383,10 @@ try:
flush_js_optimizer_queue()
- if not minify_whitespace:
- # Remove some trivial whitespace
- src = open(final).read()
- src = re.sub(r'\n+[ \n]*\n+', '\n', src)
- open(final, 'w').write(src)
+ # 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':
diff --git a/emscripten.py b/emscripten.py
index b698654b..34a5b20f 100755
--- a/emscripten.py
+++ b/emscripten.py
@@ -33,7 +33,7 @@ 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)):
+def process_funcs((i, funcs, meta, settings_file, compiler, forwarded_file, libraries, compiler_engine, temp_files, DEBUG)):
ll = ''.join(funcs) + '\n' + meta
funcs_file = temp_files.get('.func_%d.ll' % i).name
open(funcs_file, 'w').write(ll)
@@ -44,6 +44,7 @@ def process_funcs((i, funcs, meta, settings_file, compiler, forwarded_file, libr
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,
@@ -213,7 +214,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)
]
@@ -332,9 +333,9 @@ 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']]
@@ -416,6 +417,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);
@@ -432,6 +434,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;
@@ -457,11 +460,12 @@ var asm = (function(global, env, buffer) {
tempRet%d = value;
}
''' % (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() };
@@ -483,6 +487,12 @@ 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)
+ funcs_js = '''
+// EMSCRIPTEN_START_FUNCS
+''' + funcs_js + '''
+// EMSCRIPTEN_END_FUNCS
+'''
+
outfile.write(blockaddrsize(indexize(funcs_js)))
funcs_js = None
diff --git a/src/analyzer.js b/src/analyzer.js
index 209e3140..926ac9d3 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -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) {
diff --git a/src/compiler.js b/src/compiler.js
index 3047daf1..447d34b7 100644
--- a/src/compiler.js
+++ b/src/compiler.js
@@ -163,6 +163,7 @@ if (SAFE_HEAP >= 2) {
EXPORTED_FUNCTIONS = set(EXPORTED_FUNCTIONS);
EXPORTED_GLOBALS = set(EXPORTED_GLOBALS);
EXCEPTION_CATCHING_WHITELIST = set(EXCEPTION_CATCHING_WHITELIST);
+DEAD_FUNCTIONS = set(DEAD_FUNCTIONS);
RUNTIME_DEBUG = LIBRARY_DEBUG || GL_DEBUG;
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..1662d249 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -600,6 +600,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) {
@@ -1587,11 +1591,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_gl.js b/src/library_gl.js
index c6007809..b978e931 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -291,9 +291,9 @@ var LibraryGL = {
} 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 + size),
- 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);
}
},
@@ -2939,9 +2939,9 @@ var LibraryGL = {
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 + size),
- 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;
}
diff --git a/src/modules.js b/src/modules.js
index 797d4d83..65b8d437 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -291,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 = {};
@@ -315,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 = '';
diff --git a/src/preamble.js b/src/preamble.js
index 9bc68d8f..7538b19c 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -848,5 +848,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/runtime.js b/src/runtime.js
index dc604a8d..8352ade1 100644
--- a/src/runtime.js
+++ b/src/runtime.js
@@ -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;
}
diff --git a/src/settings.js b/src/settings.js
index 440d5094..101c403c 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -332,6 +332,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/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", a