[pypy-commit] pypy share-guard-info: start branch for sharing guards

fijal noreply at buildbot.pypy.org
Sun Sep 13 12:59:38 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: share-guard-info
Changeset: r79602:00542277afd9
Date: 2015-09-13 12:59 +0200
http://bitbucket.org/pypy/pypy/changeset/00542277afd9/

Log:	start branch for sharing guards

diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -1,7 +1,6 @@
 from rpython.jit.metainterp import jitprof, resume, compile
 from rpython.jit.metainterp.executor import execute_nonspec_const
-from rpython.jit.metainterp.logger import LogOperations
-from rpython.jit.metainterp.history import Const, ConstInt, REF, ConstPtr
+from rpython.jit.metainterp.history import Const, ConstInt, ConstPtr
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound,\
      ConstIntBound, MININT, MAXINT
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
@@ -258,6 +257,7 @@
         self.optunroll = None
 
         self._emitting = True
+        self._last_guard_op = None
 
         self.set_optimizations(optimizations)
         self.setup()
@@ -573,17 +573,34 @@
                 return
             else:
                 guard_op = self.replace_op_with(op, op.getopnum())
-                op = self.store_final_boxes_in_guard(guard_op, pendingfields)
-                # for unrolling
-                for farg in op.getfailargs():
-                    if farg:
-                        self.force_box(farg)
+                if self._last_guard_op:
+                    op = self._copy_resume_data_from(guard_op,
+                                                     self._last_guard_op)
+                else:
+                    op = self.store_final_boxes_in_guard(guard_op,
+                                                         pendingfields)
+                    self._last_guard_op = op
+                    # for unrolling
+                    for farg in op.getfailargs():
+                        if farg:
+                            self.force_box(farg)
         elif op.can_raise():
             self.exception_might_have_happened = True
         if self._emitting:
+            if op.has_no_side_effect() or op.is_guard():
+                pass
+            else:
+                self._last_guard_op = None
             self._really_emitted_operation = op
             self._newoperations.append(op)
 
+    def _copy_resume_data_from(self, guard_op, last_guard_op):
+        descr = compile.invent_fail_descr_for_op(guard_op.getopnum(), self)
+        descr.copy_all_attributes_from(last_guard_op.getdescr())
+        guard_op.setdescr(descr)
+        guard_op.setfailargs(last_guard_op.getfailargs())
+        return guard_op
+
     def getlastop(self):
         return self._really_emitted_operation
 


More information about the pypy-commit mailing list