[pypy-svn] pypy jit-short-preamble: need some more -live- to be able to resume at to

hakanardo commits-noreply at bitbucket.org
Fri Jan 21 12:16:26 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short-preamble
Changeset: r41117:cbcba9f47db9
Date: 2011-01-21 12:15 +0100
http://bitbucket.org/pypy/pypy/changeset/cbcba9f47db9/

Log:	need some more -live- to be able to resume at to

diff --git a/pypy/jit/metainterp/test/test_basic.py b/pypy/jit/metainterp/test/test_basic.py
--- a/pypy/jit/metainterp/test/test_basic.py
+++ b/pypy/jit/metainterp/test/test_basic.py
@@ -1944,16 +1944,16 @@
                 myjitdriver.jit_merge_point(y=y, x=x, z=z, res=res)
                 res = res.binop(x)
                 y -= 1
-                if y < 7:
+                if y < 8:
                     x = z
             return res
         def g(x, y):
-            c1 = f(B(x), y, A(x))
-            c2 = f(B(x), y, A(x))
+            c1 = f(A(x), y, B(x))
+            c2 = f(A(x), y, B(x))
             assert c1.val == c2.val
             return c1.val
-        res = self.meta_interp(g, [3, 14])
-        assert res == g(3, 14)
+        res = self.meta_interp(g, [3, 16])
+        assert res == g(3, 16)
 
     def test_inlined_guard_in_short_preamble(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'x', 'z', 'res'])

diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -391,6 +391,26 @@
         self.copy_all_attrbutes_into(res)
         return res
 
+class ResumeAtPositionDescr(ResumeGuardDescr):
+    #def __init__(self, position):
+    #    self.position = position
+        
+    def _clone_if_mutable(self):
+        res = ResumeAtPositionDescr()
+        self.copy_all_attrbutes_into(res)
+        return res
+
+    def handle_fail(self, metainterp_sd, jitdriver_sd):
+        if True or self.must_compile(metainterp_sd, jitdriver_sd):
+            return self._trace_and_compile_from_bridge(metainterp_sd,
+                                                       jitdriver_sd)
+        else:
+            raise NotImplementedError
+            # FIXME: patch blackhole._prepare_resume_from_failure(self, opnum)
+            from pypy.jit.metainterp.blackhole import resume_in_blackhole
+            resume_in_blackhole(metainterp_sd, jitdriver_sd, self)
+            assert 0, "unreachable"
+
 class ResumeGuardForcedDescr(ResumeGuardDescr):
 
     def __init__(self, metainterp_sd, jitdriver_sd):
@@ -589,7 +609,7 @@
         # know exactly what we must do (ResumeGuardDescr/ResumeFromInterpDescr)
         prepare_last_operation(new_loop, target_loop_token)
         resumekey.compile_and_attach(metainterp, new_loop)
-        compile_known_target_bridges(metainterp, new_loop)
+        #compile_known_target_bridges(metainterp, new_loop)
         record_loop_or_bridge(metainterp_sd, new_loop)
     return target_loop_token
 

diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -881,7 +881,9 @@
         op1 = SpaceOperation('jit_merge_point', args, None)
         op2 = SpaceOperation('-live-', [], None)
         # ^^^ we need a -live- for the case of do_recursive_call()
-        return ops + [op1, op2]
+        op3 = SpaceOperation('-live-', [], None)
+        # and one for inlined short preambles
+        return ops + [op3, op1, op2]
 
     def handle_jit_marker__loop_header(self, op, jitdriver):
         jd = self.callcontrol.jitdriver_sd_from_jitdriver(jitdriver)

diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -19,7 +19,7 @@
 from pypy.jit.metainterp.jitexc import JitException, get_llexception
 from pypy.rlib.rarithmetic import intmask
 from pypy.rlib.objectmodel import specialize
-from pypy.jit.codewriter.jitcode import JitCode, SwitchDictDescr
+from pypy.jit.codewriter.jitcode import JitCode, SwitchDictDescr, MissingLiveness
 from pypy.jit.codewriter import heaptracker
 from pypy.jit.metainterp.optimizeutil import RetraceLoop
 
@@ -832,8 +832,13 @@
     @arguments("orgpc", "int", "boxes3", "jitcode_position", "boxes3")
     def opimpl_jit_merge_point(self, orgpc, jdindex, greenboxes,
                                jcposition, redboxes):
+        #try:
+        #resumedescr = compile.ResumeAtPositionDescr() #ResumeGuardDescr()
         resumedescr = compile.ResumeGuardDescr()
-        self.capture_resumedata(resumedescr)
+        self.capture_resumedata(resumedescr, orgpc)
+        #except MissingLiveness:
+        #    resumedescr = None
+        #resumedescr.rd_frame_info_list.pc = orgpc # FIXME: IS this safe?
 
         any_operation = len(self.metainterp.history.operations) > 0
         jitdriver_sd = self.metainterp.staticdata.jitdrivers_sd[jdindex]
@@ -1091,11 +1096,13 @@
             metainterp.jitdriver_sd.greenfield_info is not None):
             virtualizable_boxes = metainterp.virtualizable_boxes
         saved_pc = self.pc
-        if resumepc >= 0:
-            self.pc = resumepc
-        resume.capture_resumedata(metainterp.framestack, virtualizable_boxes,
-                                  metainterp.virtualref_boxes, resumedescr)
-        self.pc = saved_pc
+        try:
+            if resumepc >= 0:
+                self.pc = resumepc
+            resume.capture_resumedata(metainterp.framestack, virtualizable_boxes,
+                                      metainterp.virtualref_boxes, resumedescr)
+        finally:
+            self.pc = saved_pc
 
     def implement_guard_value(self, orgpc, box):
         """Promote the given Box into a Const.  Note: be careful, it's a


More information about the Pypy-commit mailing list