[pypy-svn] r73967 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Apr 22 14:04:17 CEST 2010
Author: arigo
Date: Thu Apr 22 14:04:16 2010
New Revision: 73967
Modified:
pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
Log:
Turn direct_calls into (for now) residual_call_xxx.
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py Thu Apr 22 14:04:16 2010
@@ -1,4 +1,6 @@
from pypy.rpython.lltypesystem import lltype
+from pypy.jit.metainterp.history import getkind
+from pypy.objspace.flow.model import SpaceOperation
def transform_graph(graph):
@@ -6,6 +8,8 @@
being flattened in a JitCode.
"""
for block in graph.iterblocks():
+ for i in range(len(block.operations)):
+ block.operations[i] = rewrite_operation(block.operations[i])
optimize_goto_if_not(block)
@@ -32,3 +36,47 @@
block.exitswitch = (op.opname,) + tuple(op.args)
return True
return False
+
+# ____________________________________________________________
+
+def rewrite_operation(op):
+ try:
+ return _rewrite_ops[op.opname](op)
+ except KeyError:
+ return op
+
+def rewrite_op_direct_call(op):
+ """Turn direct_call(fn, i1, i2, ref1, ref2)
+ into residual_call_ir(fn, [i1, i2], [ref1, ref2])
+ (or residual_call_r or residual_call_irf)."""
+ args_i = []
+ args_r = []
+ args_f = []
+ for v in op.args[1:]:
+ add_in_correct_list(v, args_i, args_r, args_f)
+ if args_f: kinds = 'irf'
+ elif args_i: kinds = 'ir'
+ else: kinds = 'r'
+ sublists = []
+ if 'i' in kinds: sublists.append(args_i)
+ if 'r' in kinds: sublists.append(args_r)
+ if 'f' in kinds: sublists.append(args_f)
+ return SpaceOperation('residual_call_' + kinds,
+ [op.args[0]] + sublists,
+ op.result)
+
+def add_in_correct_list(v, lst_i, lst_r, lst_f):
+ kind = getkind(v.concretetype)
+ if kind == 'void': return
+ elif kind == 'int': lst = lst_i
+ elif kind == 'ref': lst = lst_r
+ elif kind == 'float': lst = lst_f
+ else: raise AssertionError(kind)
+ lst.append(v)
+
+# ____________________________________________________________
+
+_rewrite_ops = {}
+for _name, _func in globals().items():
+ if _name.startswith('rewrite_op_'):
+ _rewrite_ops[_name[len('rewrite_op_'):]] = _func
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py Thu Apr 22 14:04:16 2010
@@ -1,7 +1,10 @@
+import random
from pypy.objspace.flow.model import FunctionGraph, Block, Link
from pypy.objspace.flow.model import SpaceOperation, Variable, Constant
from pypy.jit.codewriter import jitter
-from pypy.rpython.lltypesystem import lltype
+from pypy.jit.metainterp.history import getkind
+from pypy.rpython.lltypesystem import lltype, rclass, rstr
+from pypy.translator.unsimplify import varoftype
class FakeLink:
args = []
@@ -47,3 +50,32 @@
block.exitswitch = v3
block.exits = [FakeLink(), FakeLink()]
assert not jitter.optimize_goto_if_not(block)
+
+def test_residual_call():
+ for with_i in [False, True]:
+ for with_r in [False, True]:
+ for with_f in [False, True]:
+ args = []
+ if with_i: args += [lltype.Signed, lltype.Char]
+ if with_r: args += [rclass.OBJECTPTR, lltype.Ptr(rstr.STR)]
+ if with_f: args += [lltype.Float, lltype.Float]
+ random.shuffle(args)
+ if with_f: expectedkind = 'irf' # all kinds
+ elif with_i: expectedkind = 'ir' # integers and references
+ else: expectedkind = 'r' # only references
+ yield residual_call_test, args, expectedkind
+
+def residual_call_test(argtypes, expectedkind):
+ FUNC = lltype.FuncType(argtypes, lltype.Signed)
+ fnptr = lltype.functionptr(FUNC, "g") # no graph
+ c_fnptr = Constant(fnptr, concretetype=lltype.typeOf(fnptr))
+ vars = [varoftype(TYPE) for TYPE in argtypes]
+ op = SpaceOperation('direct_call', [c_fnptr] + vars,
+ varoftype(lltype.Signed))
+ op1 = jitter.rewrite_operation(op)
+ assert op1.opname == 'residual_call_' + expectedkind
+ assert op1.args[0] == c_fnptr
+ assert len(op1.args) == 1 + len(expectedkind)
+ for sublist, kind in zip(op1.args[1:], expectedkind):
+ assert sublist == [v for v in vars
+ if getkind(v.concretetype).startswith(kind)]
More information about the Pypy-commit
mailing list