aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-07-08 07:04:38 +0300
committermax99x <max99x@gmail.com>2011-07-08 07:04:38 +0300
commitf0bb1542292fcc78205d7b1660570b96a8052f2b (patch)
treeab048e908bed970519de52561f4cc6c9ff43ffde
parent7dcdb044d329babc697363eb1652d8e65f17c699 (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-xemscripten.py17
-rw-r--r--tests/runner.py68
-rw-r--r--tools/shared.py74
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