[pypy-svn] pypy jit-short-preamble: Reordering the snapshot boxes correctly

hakanardo commits-noreply at bitbucket.org
Fri Jan 21 13:44:09 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short-preamble
Changeset: r41128:7d69bcd700c1
Date: 2011-01-21 13:43 +0100
http://bitbucket.org/pypy/pypy/changeset/7d69bcd700c1/

Log:	Reordering the snapshot boxes correctly

diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -6,17 +6,19 @@
 from pypy.jit.metainterp.optimizeopt.string import OptString
 from pypy.jit.metainterp.optimizeopt.unroll import optimize_unroll, OptInlineShortPreamble
 
-def optimize_loop_1(metainterp_sd, loop, unroll=True):
+def optimize_loop_1(metainterp_sd, loop, unroll=True, inline_short_preamble=True):
     """Optimize loop.operations to remove internal overheadish operations. 
     """
     opt_str = OptString()
-    optimizations = [OptInlineShortPreamble(),
-                     OptIntBounds(),
+    optimizations = [OptIntBounds(),
                      OptRewrite(),
                      OptVirtualize(),
                      opt_str,
                      OptHeap(),
                     ]
+    if inline_short_preamble:
+        optimizations = [OptInlineShortPreamble()] +  optimizations
+        
     if metainterp_sd.jit_ffi:
         from pypy.jit.metainterp.optimizeopt.fficall import OptFfiCall
         optimizations = optimizations + [
@@ -31,6 +33,6 @@
         optimizer = Optimizer(metainterp_sd, loop, optimizations)
         optimizer.propagate_all_forward()
 
-def optimize_bridge_1(metainterp_sd, bridge):
+def optimize_bridge_1(metainterp_sd, bridge, inline_short_preamble=True):
     """The same, but for a bridge. """
-    optimize_loop_1(metainterp_sd, bridge, False)
+    optimize_loop_1(metainterp_sd, bridge, False, inline_short_preamble)

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
@@ -595,10 +595,14 @@
     new_loop.operations = [op.clone() for op in metainterp.history.operations]
     metainterp_sd = metainterp.staticdata
     state = metainterp.jitdriver_sd.warmstate
+    if isinstance(resumekey, ResumeAtPositionDescr):
+        inline_short_preamble = False
+    else:
+        inline_short_preamble = True
     try:
         target_loop_token = state.optimize_bridge(metainterp_sd,
                                                   old_loop_tokens,
-                                                  new_loop)
+                                                  new_loop, inline_short_preamble)
     except InvalidLoop:
         # XXX I am fairly convinced that optimize_bridge cannot actually raise
         # InvalidLoop

diff --git a/pypy/jit/metainterp/optimize.py b/pypy/jit/metainterp/optimize.py
--- a/pypy/jit/metainterp/optimize.py
+++ b/pypy/jit/metainterp/optimize.py
@@ -22,20 +22,20 @@
 
 # ____________________________________________________________
 
-def optimize_bridge(metainterp_sd, old_loop_tokens, bridge):
+def optimize_bridge(metainterp_sd, old_loop_tokens, bridge, inline_short_preamble=True):
     debug_start("jit-optimize")
     try:
-        return _optimize_bridge(metainterp_sd, old_loop_tokens, bridge)
+        return _optimize_bridge(metainterp_sd, old_loop_tokens, bridge, inline_short_preamble)
     finally:
         debug_stop("jit-optimize")
 
-def _optimize_bridge(metainterp_sd, old_loop_tokens, bridge):
+def _optimize_bridge(metainterp_sd, old_loop_tokens, bridge, inline_short_preamble):
     cpu = metainterp_sd.cpu
     metainterp_sd.logger_noopt.log_loop(bridge.inputargs, bridge.operations)
     if old_loop_tokens:
         old_loop_token = old_loop_tokens[0]
         bridge.operations[-1].setdescr(old_loop_token)   # patch jump target
-        optimize_bridge_1(metainterp_sd, bridge)
+        optimize_bridge_1(metainterp_sd, bridge, inline_short_preamble)
         return old_loop_tokens[0]
         #return bridge.operations[-1].getdescr()
     return None

diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -152,7 +152,6 @@
         if jumpop:
             assert jumpop.getdescr() is loop.token
             loop.preamble.operations = self.optimizer.newoperations
-
             self.optimizer = self.optimizer.reconstruct_for_next_iteration()
 
             jump_args = jumpop.getarglist()
@@ -166,6 +165,13 @@
 
             loop.operations = self.optimizer.newoperations
 
+            new_snapshot_args = []
+            start_resumedescr = loop.preamble.token.start_resumedescr.clone_if_mutable()
+            snapshot_args = start_resumedescr.rd_snapshot.prev.boxes 
+            for a in snapshot_args:
+                new_snapshot_args.append(loop.preamble.inputargs[jump_args.index(a)])
+            start_resumedescr.rd_snapshot.prev.boxes = new_snapshot_args
+
             short = self.create_short_preamble(loop.preamble, loop)
             if short:
                 if False:
@@ -180,9 +186,7 @@
                         op = op.clone()
                         #op.setfailargs(loop.preamble.inputargs)
                         #op.setjumptarget(loop.preamble.token)
-                        start_resumedescr = loop.preamble.token.start_resumedescr.clone_if_mutable()
-                        start_resumedescr.rd_snapshot.prev.boxes = loop.preamble.inputargs[:]
-                        op.setdescr(start_resumedescr)
+                        op.setdescr(start_resumedescr.clone_if_mutable())
                         short[i] = op
 
                 short_loop = TreeLoop('short preamble')

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
@@ -819,9 +819,13 @@
         self.generate_guard(rop.GUARD_CLASS, box, [clsbox], resumepc=orgpc)
         return clsbox
 
-    @arguments("int")
-    def opimpl_loop_header(self, jdindex):
+    @arguments("int", "orgpc")
+    def opimpl_loop_header(self, jdindex, orgpc):
+        #resumedescr = compile.ResumeGuardDescr()
+        resumedescr = compile.ResumeAtPositionDescr()
+        self.capture_resumedata(resumedescr, orgpc)
         self.metainterp.seen_loop_header_for_jdindex = jdindex
+        self.metainterp.loop_header_resumedescr = resumedescr
 
     def verify_green_args(self, jitdriver_sd, varargs):
         num_green_args = jitdriver_sd.num_green_args
@@ -833,19 +837,21 @@
     def opimpl_jit_merge_point(self, orgpc, jdindex, greenboxes,
                                jcposition, redboxes):
         #try:
-        #resumedescr = compile.ResumeAtPositionDescr() #ResumeGuardDescr()
-        resumedescr = compile.ResumeGuardDescr()
-        self.capture_resumedata(resumedescr, orgpc)
+        #resumedescr = compile.ResumeAtPositionDescr()
+        #resumedescr = compile.ResumeGuardDescr()
+        #self.capture_resumedata(resumedescr, orgpc)
         #except MissingLiveness:
         #    resumedescr = None
         #resumedescr.rd_frame_info_list.pc = orgpc # FIXME: IS this safe?
-
+        resumedescr = self.metainterp.loop_header_resumedescr
+        
         any_operation = len(self.metainterp.history.operations) > 0
         jitdriver_sd = self.metainterp.staticdata.jitdrivers_sd[jdindex]
         self.verify_green_args(jitdriver_sd, greenboxes)
         # xxx we may disable the following line in some context later
         self.debug_merge_point(jitdriver_sd, self.metainterp.in_recursion,
                                greenboxes)
+
         if self.metainterp.seen_loop_header_for_jdindex < 0:
             if not jitdriver_sd.no_loop_header or not any_operation:
                 return
@@ -856,6 +862,7 @@
             "found a loop_header for a JitDriver that does not match "
             "the following jit_merge_point's")
         self.metainterp.seen_loop_header_for_jdindex = -1
+        
         #
         if not self.metainterp.in_recursion:
             assert jitdriver_sd is self.metainterp.jitdriver_sd
@@ -1419,6 +1426,7 @@
         self.free_frames_list = []
         self.last_exc_value_box = None
         self.retracing_loop_from = None
+        self.loop_header_resumedescr = None
 
     def perform_call(self, jitcode, boxes, greenkey=None):
         # causes the metainterp to enter the given subfunction


More information about the Pypy-commit mailing list