Author: Manuel Jacob
Branch: llvm-translation-backend
Changeset: r66471:1f9f676d7e56
Date: 2012-04-01 20:03 +0200
http://bitbucket.org/pypy/pypy/changeset/1f9f676d7e56/
Log: Remove unnecessary same_as operations and phi nodes.
diff --git a/pypy/translator/llvm/genllvm.py b/pypy/translator/llvm/genllvm.py
--- a/pypy/translator/llvm/genllvm.py
+++ b/pypy/translator/llvm/genllvm.py
@@ -709,10 +709,12 @@
return '<{} {}>'.format(self.type_.repr_type(), self.name)
-def get_repr(cov):
+def get_repr(cov, var_aliases={}):
if isinstance(cov, Constant):
return ConstantRepr(database.get_type(cov.concretetype), cov.value)
elif isinstance(cov, Variable):
+ if cov in var_aliases:
+ return var_aliases[cov]
return VariableRepr(database.get_type(cov.concretetype), '%'+cov.name)
return ConstantRepr(database.get_type(lltype.typeOf(cov)), cov)
@@ -747,6 +749,7 @@
def __init__(self):
self.lines = []
self.tmp_counter = count()
+ self.var_aliases = {}
def w(self, line, indent=' '):
self.lines.append('{}{}\n'.format(indent, line))
@@ -763,9 +766,17 @@
self.block_to_name = {}
for i, block in enumerate(graph.iterblocks()):
self.block_to_name[block] = 'block{}'.format(i)
+ for i, arg in enumerate(block.inputargs):
+ if len(self.entrymap[block]) == 1:
+ self.var_aliases[arg] = get_repr(
+ self.entrymap[block][0].args[i], self.var_aliases)
+ self.var_aliases.update(
+ (op.result, get_repr(op.args[0], self.var_aliases))
+ for op in block.operations if op.opname == 'same_as')
+
for block in graph.iterblocks():
self.w(self.block_to_name[block] + ':', ' ')
- if block is not graph.startblock:
+ if block is not graph.startblock and len(self.entrymap[block]) > 1:
self.write_phi_nodes(block)
self.write_operations(block)
self.write_branches(block)
@@ -776,7 +787,8 @@
if arg.concretetype == lltype.Void:
continue
s = ', '.join('[{}, %{}]'.format(
- get_repr(l.args[i]).V, self.block_to_name[l.prevblock])
+ get_repr(l.args[i], self.var_aliases).V,
+ self.block_to_name[l.prevblock])
for l in self.entrymap[block] if l.prevblock is not None)
self.w('{arg.V} = phi {arg.T} {s}'.format(arg=get_repr(arg), s=s))
@@ -784,14 +796,16 @@
for op in block.operations:
self.w('; {}'.format(op))
opname = op.opname
- opres = get_repr(op.result)
- opargs = map(get_repr, op.args)
+ opres = get_repr(op.result, self.var_aliases)
+ opargs = [get_repr(arg, self.var_aliases) for arg in op.args]
if opname in OPS:
simple_op = OPS[opname]
self.w('{opres.V} = {simple_op} {opargs[0].TV}, {opargs[1].V}'
.format(**locals()))
+ elif opname == 'same_as':
+ pass
elif opname.startswith('cast_') or opname.startswith('truncate_'):
- self._cast(get_repr(op.result), get_repr(op.args[0]))
+ self._cast(opres, opargs[0])
else:
func = getattr(self, 'op_' + opname, None)
if func is not None:
@@ -799,6 +813,31 @@
else:
raise NotImplementedError(op)
+ def write_branches(self, block):
+ if len(block.exits) == 0:
+ self.write_returnblock(block)
+ elif len(block.exits) == 1:
+ self.w('br label %' + self.block_to_name[block.exits[0].target])
+ elif len(block.exits) == 2:
+ assert block.exitswitch.concretetype is lltype.Bool
+ for link in block.exits:
+ if link.llexitcase:
+ true = self.block_to_name[link.target]
+ else:
+ false = self.block_to_name[link.target]
+ self.w('br i1 {}, label %{}, label %{}'.format(
+ get_repr(block.exitswitch, self.var_aliases).V, true,
+ false))
+ else:
+ raise NotImplementedError
+
+ def write_returnblock(self, block):
+ ret = block.inputargs[0]
+ if ret.concretetype is lltype.Void:
+ self.w('ret void')
+ else:
+ self.w('ret {ret.TV}'.format(ret=get_repr(ret, self.var_aliases)))
+
def _tmp(self, type_=None):
return VariableRepr(type_, '%tmp{}'.format(next(self.tmp_counter)))
@@ -856,7 +895,6 @@
else:
op = fr.type_.get_cast_op(to.type_)
self.w('{to.V} = {op} {fr.TV} to {to.T}'.format(**locals()))
- op_same_as = _cast
op_force_cast = _cast
op_raw_malloc_usage = _cast
@@ -1067,30 +1105,6 @@
self.w('{result.V} = ptrtoint i8* {t.V} to {result.T}'
.format(**locals()))
- def write_branches(self, block):
- if len(block.exits) == 0:
- self.write_returnblock(block)
- elif len(block.exits) == 1:
- self.w('br label %' + self.block_to_name[block.exits[0].target])
- elif len(block.exits) == 2:
- assert block.exitswitch.concretetype is lltype.Bool
- for link in block.exits:
- if link.llexitcase:
- true = self.block_to_name[link.target]
- else:
- false = self.block_to_name[link.target]
- self.w('br i1 {}, label %{}, label %{}'.format(
- get_repr(block.exitswitch).V, true, false))
- else:
- raise NotImplementedError
-
- def write_returnblock(self, block):
- ret = block.inputargs[0]
- if ret.concretetype is lltype.Void:
- self.w('ret void')
- else:
- self.w('ret {ret.TV}'.format(ret=get_repr(ret)))
-
class GCPolicy(object):
def __init__(self, genllvm):
@@ -1297,8 +1311,9 @@
def compile_module(self):
eci = ExternalCompilationInfo().merge(*self.ecis)
eci = eci.convert_sources_to_files()
- cmdexec('clang -O2 -shared -fPIC {0} {1} {2}.ll -o {2}.so'.format(
- ' '.join('-I{}'.format(ic) for ic in eci.include_dirs),
- ' '.join(eci.separate_module_files), self.base_path))
+ cmdexec('clang -O2 -shared -fPIC {0}{1}{2}.ll -o {2}.so'.format(
+ ''.join('-I{} '.format(ic) for ic in eci.include_dirs),
+ ''.join(smf + ' ' for smf in eci.separate_module_files),
+ self.base_path))
self.wrapper.load_cdll('{0}.so'.format(self.base_path))
return self.wrapper
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit