[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