diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-11-17 14:44:42 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-11-17 14:44:42 -0800 |
commit | 89b2bf7c1931c70d982a837d08bdf6f13c2aa683 (patch) | |
tree | d9a940aba4eff1cc4c089190ab86373db03b28e2 | |
parent | 28cfd3f3b8fb2455222813215933fa03bcdfa1bd (diff) |
refactor llvm opts code
-rw-r--r-- | tests/runner.py | 15 | ||||
-rw-r--r-- | tools/shared.py | 177 |
2 files changed, 96 insertions, 96 deletions
diff --git a/tests/runner.py b/tests/runner.py index 14e1d42f..6dade2aa 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -62,11 +62,6 @@ class RunnerCore(unittest.TestCase): def get_stdout_path(self): return os.path.join(self.get_dir(), 'stdout') - def pick_llvm_opts(self, optimization_level, safe=True): - global LLVM_OPT_OPTS - - LLVM_OPT_OPTS = pick_llvm_opts(optimization_level, safe) - def prep_ll_run(self, filename, ll_file, force_recompile=False, build_ll_hook=None): if ll_file.endswith(('.bc', '.o')): if ll_file != filename + '.o': @@ -160,10 +155,10 @@ class RunnerCore(unittest.TestCase): return Popen([EXEC_LLVM] + args, stdout=PIPE, stderr=STDOUT).communicate()[0] def build_native(self, filename): - Popen([CLANG, '-O2', filename, '-o', filename+'.native'], stdout=PIPE, stderr=STDOUT).communicate()[0] + Popen([CLANG, '-O2', filename, '-o', filename+'.native'], stdout=PIPE).communicate()[0] def run_native(self, filename, args): - Popen([filename+'.native'] + args, stdout=PIPE, stderr=STDOUT).communicate()[0] + Popen([filename+'.native'] + args, stdout=PIPE).communicate()[0] def assertIdentical(self, x, y): if x != y: @@ -4401,8 +4396,7 @@ class %s(T): if Settings.QUANTUM_SIZE == 1 or Settings.USE_TYPED_ARRAYS == 2: Settings.RELOOP = 0 # XXX Would be better to use this, but it isn't really what we test in these cases, and is very slow - if Building.LLVM_OPTS: - self.pick_llvm_opts(3, safe=Building.LLVM_OPTS != 2) + Building.pick_llvm_opts(3, safe=Building.LLVM_OPTS != 2) Building.COMPILER_TEST_OPTS = ['-g'] @@ -4500,8 +4494,7 @@ else: Settings.FAST_MEMORY = 10*1024*1024 Building.LLVM_OPTS = 1 if Settings.USE_TYPED_ARRAYS != 2 else 2 - if Building.LLVM_OPTS: - self.pick_llvm_opts(2, safe=Building.LLVM_OPTS != 2) + Building.pick_llvm_opts(2, safe=Building.LLVM_OPTS != 2) super(benchmark, self).setUp() diff --git a/tools/shared.py b/tools/shared.py index 8b4dcef5..c1bd21d1 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -102,90 +102,6 @@ def limit_size(string, MAX=80*20): if len(string) < MAX: return string return string[0:MAX/2] + '\n[..]\n' + string[-MAX/2:] -def pick_llvm_opts(optimization_level, safe=True): - ''' - It may be safe to use nonportable optimizations (like -OX) if we remove the platform info from the .ll - (which we do in do_ll_opts) - but even there we have issues (even in TA2) with instruction combining - into i64s. In any case, the handpicked ones here should be safe and portable. They are also tuned for - things that look useful. - ''' - opts = [] - if optimization_level > 0: - if not safe: - opts.append('-O%d' % optimization_level) - else: - allow_nonportable = not safe - optimize_size = True - use_aa = not safe - - # PassManagerBuilder::populateModulePassManager - if allow_nonportable and use_aa: # ammo.js results indicate this can be nonportable - 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') - if not optimize_size: opts.append('-inline') # The condition here is a difference with LLVM's createStandardAliasAnalysisPasses - 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') - if Settings.QUANTUM_SIZE == 4: opts.append('-indvars') # XXX this infinite-loops raytrace on q1 (loop in |new node_t[count]| has 68 hardcoded ¬ fixed) - if allow_nonportable: opts.append('-loop-idiom') # ? - opts.append('-loop-deletion') - opts.append('-loop-unroll') - - ##### not in llvm-3.0. but have | #addExtensionsToPM(EP_LoopOptimizerEnd, MPM);| 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') - #addExtensionsToPM(EP_ScalarOptimizerLate, MPM); - - opts.append('-adce') - opts.append('-simplifycfg') - if allow_nonportable: opts.append('-instcombine') - - opts.append('-strip-dead-prototypes') - - if optimization_level > 2: opts.append('-globaldce') - - if optimization_level > 1: opts.append('-constmerge') - - return opts - def read_pgo_data(filename): ''' Reads the output of PGO and generates proper information for CORRECT_* == 2 's *_LINES options @@ -312,8 +228,14 @@ class Building: def llvm_opts(filename): if Building.LLVM_OPTS: shutil.move(filename + '.o', filename + '.o.pre') - output = Popen([LLVM_OPT, filename + '.o.pre'] + LLVM_OPT_OPTS + ['-o=' + filename + '.o'], stdout=PIPE).communicate()[0] + output = Popen([LLVM_OPT, filename + '.o.pre'] + Building.LLVM_OPT_OPTS + ['-o=' + filename + '.o'], stdout=PIPE).communicate()[0] assert os.path.exists(filename + '.o'), 'Failed to run llvm optimizations: ' + output + if Building.LLVM_OPTS == 2: + print 'Unsafe LD!' + shutil.move(filename + '.o', filename + '.o.pre') + output = Popen([LLVM_LD, filename + '.o.pre', '-o=' + filename + '.tmp'], stdout=PIPE).communicate()[0] + assert os.path.exists(filename + '.tmp.bc'), 'Failed to run llvm optimizations: ' + output + shutil.move(filename + '.tmp.bc', filename + '.o') @staticmethod def llvm_dis(filename): @@ -361,3 +283,88 @@ class Building: if output_processor is not None: output_processor(open(filename + '.o.js').read()) + @staticmethod + def pick_llvm_opts(optimization_level, safe=True): + ''' + It may be safe to use nonportable optimizations (like -OX) if we remove the platform info from the .ll + (which we do in do_ll_opts) - but even there we have issues (even in TA2) with instruction combining + into i64s. In any case, the handpicked ones here should be safe and portable. They are also tuned for + things that look useful. + ''' + opts = [] + if optimization_level > 0: + if not safe: + opts.append('-O%d' % optimization_level) + else: + allow_nonportable = not safe + optimize_size = True + use_aa = not safe + + # PassManagerBuilder::populateModulePassManager + if allow_nonportable and use_aa: # ammo.js results indicate this can be nonportable + 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') + if not optimize_size: opts.append('-inline') # The condition here is a difference with LLVM's createStandardAliasAnalysisPasses + 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') + if Settings.QUANTUM_SIZE == 4: opts.append('-indvars') # XXX this infinite-loops raytrace on q1 (loop in |new node_t[count]| has 68 hardcoded ¬ fixed) + if allow_nonportable: opts.append('-loop-idiom') # ? + opts.append('-loop-deletion') + opts.append('-loop-unroll') + + ##### not in llvm-3.0. but have | #addExtensionsToPM(EP_LoopOptimizerEnd, MPM);| 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') + #addExtensionsToPM(EP_ScalarOptimizerLate, MPM); + + opts.append('-adce') + opts.append('-simplifycfg') + if allow_nonportable: opts.append('-instcombine') + + opts.append('-strip-dead-prototypes') + + if optimization_level > 2: opts.append('-globaldce') + + if optimization_level > 1: opts.append('-constmerge') + + Building.LLVM_OPT_OPTS = opts + |