[pypy-svn] r74582 - in pypy/branch/blackhole-improvement/pypy/jit: codewriter codewriter/test metainterp

arigo at codespeak.net arigo at codespeak.net
Wed May 19 17:27:37 CEST 2010


Author: arigo
Date: Wed May 19 17:27:35 2010
New Revision: 74582

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
Log:
Fix, in-progress.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Wed May 19 17:27:35 2010
@@ -444,8 +444,10 @@
 
     def handle_getfield_typeptr(self, op):
         # note: the 'G_' prefix tells that the operation might generate
-        # a guard in pyjitpl (see liveness.py)
-        return SpaceOperation('G_guard_class', [op.args[0]], op.result)
+        # a guard in pyjitpl (see liveness.py).  The following 'keepalive'
+        # is needed to ensure that op.args[0] is restored on guard failure.
+        return [SpaceOperation('G_guard_class', [op.args[0]], op.result),
+                SpaceOperation('keepalive', [op.args[0]], None)]
 
     def rewrite_op_malloc(self, op):
         assert op.args[1].value == {'flavor': 'gc'}

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	Wed May 19 17:27:35 2010
@@ -283,10 +283,13 @@
     c_name = Constant('typeptr', lltype.Void)
     v_result = varoftype(rclass.OBJECT.typeptr)
     op = SpaceOperation('getfield', [v_parent, c_name], v_result)
-    op1 = Transformer(FakeCPU()).rewrite_operation(op)
+    op1, op2 = Transformer(FakeCPU()).rewrite_operation(op)
     assert op1.opname == 'G_guard_class'
     assert op1.args == [v_parent]
     assert op1.result == v_result
+    assert op2.opname == 'keepalive'
+    assert op2.args == [v_parent]
+    assert op2.result == None
 
 def test_setfield():
     # XXX a more compact encoding would be possible; see test_getfield()

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py	Wed May 19 17:27:35 2010
@@ -186,3 +186,25 @@
             L2:
             reraise
         """)
+
+    def test_regalloc_lists(self):
+        v1 = Variable(); v1.concretetype = lltype.Signed
+        v2 = Variable(); v2.concretetype = lltype.Signed
+        v3 = Variable(); v3.concretetype = lltype.Signed
+        v4 = Variable(); v4.concretetype = lltype.Signed
+        v5 = Variable(); v5.concretetype = lltype.Signed
+        block = Block([v1])
+        block.operations = [
+            SpaceOperation('int_add', [v1, Constant(1, lltype.Signed)], v2),
+            SpaceOperation('rescall', [ListOfKind('int', [v1, v2])], v5),
+            SpaceOperation('rescall', [ListOfKind('int', [v1, v2])], v3),
+            ]
+        graph = FunctionGraph('f', block, v4)
+        block.closeblock(Link([v3], graph.returnblock))
+        #
+        self.check_assembler(graph, """
+            int_add %i0, $1, %i1
+            rescall I[%i0, %i1], %i2
+            rescall I[%i0, %i1], %i0
+            int_return %i0
+        """)

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Wed May 19 17:27:35 2010
@@ -744,10 +744,10 @@
     opimpl_ref_guard_value = _opimpl_guard_value
     opimpl_float_guard_value = _opimpl_guard_value
 
-    @arguments("box", "force_initial_pc")
-    def opimpl_guard_class(self, box):
+    @arguments("box", "orgpc")
+    def opimpl_guard_class(self, box, orgpc):
         clsbox = self.cls_of_box(box)
-        self.generate_guard(rop.GUARD_CLASS, box, [clsbox])
+        self.generate_guard(rop.GUARD_CLASS, box, [clsbox], resumepc=orgpc)
         return clsbox
 
 ##    @FixME  #arguments("orgpc", "box", "builtin")
@@ -924,7 +924,7 @@
         except ChangeFrame:
             pass
 
-    def generate_guard(self, opnum, box=None, extraargs=[]):
+    def generate_guard(self, opnum, box=None, extraargs=[], resumepc=-1):
         if isinstance(box, Const):    # no need for a guard
             return
         metainterp = self.metainterp
@@ -947,8 +947,11 @@
         virtualizable_boxes = None
         if metainterp.staticdata.virtualizable_info is not None:
             virtualizable_boxes = metainterp.virtualizable_boxes
+        if resumepc < 0:
+            resumepc = self.pc
         resume.capture_resumedata(metainterp.framestack, virtualizable_boxes,
-                                  metainterp.virtualref_boxes, resumedescr)
+                                  metainterp.virtualref_boxes, resumedescr,
+                                  resumepc)
         self.metainterp.staticdata.profiler.count_ops(opnum, GUARDS)
         # count
         metainterp.attach_debug_info(guard_op)
@@ -2004,8 +2007,8 @@
         assert position >= 0
         args = ()
         next_argcode = 0
-        force_initial_pc = False
         code = self.bytecode
+        orgpc = position
         position += 1
         for argtype in argtypes:
             if argtype == "box":     # a box, of whatever type
@@ -2068,17 +2071,15 @@
                                            argcodes[next_argcode + 2])
                 next_argcode = next_argcode + 3
                 position = position3 + 1 + length3
-            elif argtype == "force_initial_pc":
-                force_initial_pc = True
-                continue
+            elif argtype == "orgpc":
+                value = orgpc
             else:
                 raise AssertionError("bad argtype: %r" % (argtype,))
             args += (value,)
         #
         num_return_args = len(argcodes) - next_argcode
         assert num_return_args == 0 or num_return_args == 1
-        if not force_initial_pc:
-            self.pc = position + num_return_args
+        self.pc = position + num_return_args
         #
         if not we_are_translated():
             print '\tpyjitpl: %s(%s)' % (name, ', '.join(map(repr, args))),
@@ -2099,8 +2100,6 @@
         else:
             resultbox = unboundmethod(self, *args)
         #
-        if force_initial_pc:
-            self.pc = position + num_return_args
         if resultbox is not None:
             self.make_result_of_lastop(resultbox)
     #

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py	Wed May 19 17:27:35 2010
@@ -25,10 +25,10 @@
 class FrameInfo(object):
     __slots__ = ('prev', 'jitcode', 'pc')
 
-    def __init__(self, prev, frame):
+    def __init__(self, prev, jitcode, pc):
         self.prev = prev
-        self.jitcode = frame.jitcode
-        self.pc = frame.pc
+        self.jitcode = jitcode
+        self.pc = pc
 
 def _ensure_parent_resumedata(framestack, n):
     target = framestack[n]
@@ -38,18 +38,19 @@
     back = framestack[n-1]
     target.parent_resumedata_frame_info_list = FrameInfo(
                                          back.parent_resumedata_frame_info_list,
-                                         back)
+                                         back.jitcode,
+                                         back.pc)
     target.parent_resumedata_snapshot = Snapshot(
                                          back.parent_resumedata_snapshot,
                                          back.get_list_of_active_boxes())
 
 def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
-                       storage):
+                       storage, pc):
     n = len(framestack)-1
     top = framestack[n]
     _ensure_parent_resumedata(framestack, n)
     frame_info_list = FrameInfo(top.parent_resumedata_frame_info_list,
-                                top)
+                                top.jitcode, pc)
     storage.rd_frame_info_list = frame_info_list
     snapshot = Snapshot(top.parent_resumedata_snapshot,
                         top.get_list_of_active_boxes())



More information about the Pypy-commit mailing list