diff options
author | max99x <max99x@gmail.com> | 2011-07-08 07:04:38 +0300 |
---|---|---|
committer | max99x <max99x@gmail.com> | 2011-07-08 07:04:38 +0300 |
commit | f0bb1542292fcc78205d7b1660570b96a8052f2b (patch) | |
tree | ab048e908bed970519de52561f4cc6c9ff43ffde | |
parent | 7dcdb044d329babc697363eb1652d8e65f17c699 (diff) |
* Moved pick_llvm_opts() to tools/shared.py.
* Using pick_llvm_opts() instead of hardcoding -O3 in emscripten.py.
* Reassembling only when needed in emscripten.py.
-rwxr-xr-x | emscripten.py | 17 | ||||
-rw-r--r-- | tests/runner.py | 68 | ||||
-rw-r--r-- | tools/shared.py | 74 |
3 files changed, 84 insertions, 75 deletions
diff --git a/emscripten.py b/emscripten.py index 903eb78a..a5ce0e09 100755 --- a/emscripten.py +++ b/emscripten.py @@ -73,7 +73,8 @@ def optimize(filepath): The path to the optimized file. """ out = get_temp_file('.bc') - ret = subprocess.call([shared.LLVM_OPT, '-O3', '-o=-', filepath], stdout=out) + opts = shared.pick_llvm_opts(3, True) + ret = subprocess.call([shared.LLVM_OPT, '-o=-', filepath] + opts, stdout=out) out.close() if ret != 0: raise RuntimeError('Could not optimize %s.' % filepath) return out.name @@ -108,6 +109,11 @@ def compile_malloc(): return out.name +def has_annotations(filepath): + """Tests whether an assembly file contains annotations.""" + return filepath.endswith('.ll') and '[#uses=' in open(filepath).read() + + def emscript(infile, settings, outfile): """Runs the emscripten LLVM-to-JS compiler. @@ -129,9 +135,10 @@ def emscript(infile, settings, outfile): def main(args): # Construct a final linked and disassembled file. - args.infile = assemble(args.infile) - if args.dlmalloc: args.infile = link(args.infile, compile_malloc()) - if args.optimize: args.infile = optimize(args.infile) + if args.dlmalloc or args.optimize or not has_annotations(args.infile): + args.infile = assemble(args.infile) + if args.dlmalloc: args.infile = link(args.infile, compile_malloc()) + if args.optimize: args.infile = optimize(args.infile) args.infile = disassemble(args.infile) # Prepare settings for serialization to JSON. @@ -165,7 +172,7 @@ if __name__ == '__main__': parser.add_argument('-O', '--optimize', default=False, action='store_true', - help='Run LLVM -O3 optimizations on the input.') + help='Run LLVM optimizations on the input.') parser.add_argument('-m', '--dlmalloc', default=False, action='store_true', diff --git a/tests/runner.py b/tests/runner.py index c1ce67ff..225e6671 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -62,73 +62,7 @@ class RunnerCore(unittest.TestCase): # Similar to LLVM::createStandardModulePasses() def pick_llvm_opts(self, optimization_level, optimize_size, allow_nonportable=False): global LLVM_OPT_OPTS - LLVM_OPT_OPTS = [] - - if optimization_level == 0: return - - if allow_nonportable: - LLVM_OPT_OPTS.append('-O3') - return - - # createStandardAliasAnalysisPasses - #LLVM_OPT_OPTS.append('-tbaa') - #LLVM_OPT_OPTS.append('-basicaa') # makes fannkuch slow but primes fast - - LLVM_OPT_OPTS.append('-globalopt') - LLVM_OPT_OPTS.append('-ipsccp') - LLVM_OPT_OPTS.append('-deadargelim') - if allow_nonportable: LLVM_OPT_OPTS.append('-instcombine') - LLVM_OPT_OPTS.append('-simplifycfg') - - LLVM_OPT_OPTS.append('-prune-eh') - LLVM_OPT_OPTS.append('-inline') - LLVM_OPT_OPTS.append('-functionattrs') - if optimization_level > 2: - LLVM_OPT_OPTS.append('-argpromotion') - - if allow_nonportable: LLVM_OPT_OPTS.append('-scalarrepl') # XXX Danger: Can turn a memcpy into something that violates the load-store - # # consistency hypothesis. See hashnum() in lua. - # # Note: this opt is of great importance for raytrace... - if allow_nonportable: LLVM_OPT_OPTS.append('-early-cse') # ? - LLVM_OPT_OPTS.append('-simplify-libcalls') - LLVM_OPT_OPTS.append('-jump-threading') - if allow_nonportable: LLVM_OPT_OPTS.append('-correlated-propagation') # ? - LLVM_OPT_OPTS.append('-simplifycfg') - if allow_nonportable: LLVM_OPT_OPTS.append('-instcombine') - - LLVM_OPT_OPTS.append('-tailcallelim') - LLVM_OPT_OPTS.append('-simplifycfg') - LLVM_OPT_OPTS.append('-reassociate') - LLVM_OPT_OPTS.append('-loop-rotate') - LLVM_OPT_OPTS.append('-licm') - LLVM_OPT_OPTS.append('-loop-unswitch') # XXX should depend on optimize_size - if allow_nonportable: LLVM_OPT_OPTS.append('-instcombine') - LLVM_OPT_OPTS.append('-indvars') - if allow_nonportable: LLVM_OPT_OPTS.append('-loop-idiom') # ? - LLVM_OPT_OPTS.append('-loop-deletion') - LLVM_OPT_OPTS.append('-loop-unroll') - if allow_nonportable: LLVM_OPT_OPTS.append('-instcombine') - if optimization_level > 1: - if allow_nonportable: LLVM_OPT_OPTS.append('-gvn') # XXX Danger: Messes up Lua output for unknown reasons - # Note: this opt is of minor importance for raytrace... - LLVM_OPT_OPTS.append('-memcpyopt') # Danger? - LLVM_OPT_OPTS.append('-sccp') - - if allow_nonportable: LLVM_OPT_OPTS.append('-instcombine') - LLVM_OPT_OPTS.append('-jump-threading') - LLVM_OPT_OPTS.append('-correlated-propagation') - LLVM_OPT_OPTS.append('-dse') - LLVM_OPT_OPTS.append('-adce') - LLVM_OPT_OPTS.append('-simplifycfg') - - LLVM_OPT_OPTS.append('-strip-dead-prototypes') - LLVM_OPT_OPTS.append('-deadtypeelim') - - if optimization_level > 2: - LLVM_OPT_OPTS.append('-globaldce') - - if optimization_level > 1: - LLVM_OPT_OPTS.append('-constmerge') + LLVM_OPT_OPTS = pick_llvm_opts(optimization_level, optimize_size, allow_nonportable) # Emscripten optimizations that we run on the .ll file def do_ll_opts(self, filename): diff --git a/tools/shared.py b/tools/shared.py index ca18d790..8cb602df 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -46,9 +46,7 @@ def to_cc(cxx): return cxx.replace('clang++', 'clang').replace('g++', 'gcc') def line_splitter(data): - ''' - Silly little tool to split JSON arrays over many lines. - ''' + """Silly little tool to split JSON arrays over many lines.""" out = '' counter = 0 @@ -66,3 +64,73 @@ def line_splitter(data): def limit_size(string, MAX=80*20): if len(string) < MAX: return string return string[0:MAX] + '...' + +def pick_llvm_opts(optimization_level, optimize_size, allow_nonportable=False): + opts = [] + if optimization_level > 0: + if allow_nonportable: + opts.append('-O%d' % optimization_level) + else: + # createStandardAliasAnalysisPasses + #opts.append('-tbaa') + #opts.append('-basicaa') # makes fannkuch slow but primes fast + + opts.append('-globalopt') + opts.append('-ipsccp') + opts.append('-deadargelim') + if allow_nonportable: opts.append('-instcombine') + opts.append('-simplifycfg') + + opts.append('-prune-eh') + opts.append('-inline') + opts.append('-functionattrs') + if optimization_level > 2: + opts.append('-argpromotion') + + # XXX Danger: Can turn a memcpy into something that violates the + # load-store consistency hypothesis. See hashnum() in Lua. + # Note: this opt is of great importance for raytrace... + if allow_nonportable: opts.append('-scalarrepl') + + if allow_nonportable: opts.append('-early-cse') # ? + opts.append('-simplify-libcalls') + opts.append('-jump-threading') + if allow_nonportable: opts.append('-correlated-propagation') # ? + opts.append('-simplifycfg') + if allow_nonportable: opts.append('-instcombine') + + opts.append('-tailcallelim') + opts.append('-simplifycfg') + opts.append('-reassociate') + opts.append('-loop-rotate') + opts.append('-licm') + opts.append('-loop-unswitch') # XXX should depend on optimize_size + if allow_nonportable: opts.append('-instcombine') + opts.append('-indvars') + if allow_nonportable: opts.append('-loop-idiom') # ? + opts.append('-loop-deletion') + opts.append('-loop-unroll') + if allow_nonportable: opts.append('-instcombine') + + # XXX Danger: Messes up Lua output for unknown reasons + # Note: this opt is of minor importance for raytrace... + if optimization_level > 1 and allow_nonportable: opts.append('-gvn') + + opts.append('-memcpyopt') # Danger? + opts.append('-sccp') + + if allow_nonportable: opts.append('-instcombine') + opts.append('-jump-threading') + opts.append('-correlated-propagation') + opts.append('-dse') + opts.append('-adce') + opts.append('-simplifycfg') + + opts.append('-strip-dead-prototypes') + opts.append('-deadtypeelim') + + if optimization_level > 2: opts.append('-globaldce') + + if optimization_level > 1: opts.append('-constmerge') + + return opts |