[pypy-commit] pypy optresult-unroll: start working towards short preamble

fijal noreply at buildbot.pypy.org
Mon Jun 29 11:17:02 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78344:18d849cece6c
Date: 2015-06-25 13:20 +0200
http://bitbucket.org/pypy/pypy/changeset/18d849cece6c/

Log:	start working towards short preamble ;

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
@@ -233,6 +233,7 @@
         self.optpure = None
         self.optheap = None
         self.optearlyforce = None
+        self.optunroll = None
         # the following two fields is the data kept for unrolling,
         # those are the operations that can go to the short_preamble
         if loop is not None:
@@ -307,9 +308,6 @@
             return info.force_box(op, self)
         return op
 
-    def ensure_imported(self, value):
-        pass
-
     def is_inputarg(self, op):
         return op in self.inparg_dict
 
@@ -409,7 +407,7 @@
                                op.getdescr().get_index())
         elif op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC:
             opinfo = info.ArrayPtrInfo(op.getdescr())
-        elif op.getopnum() == rop.GUARD_CLASS:
+        elif op.getopnum() in (rop.GUARD_CLASS, rop.GUARD_NONNULL_CLASS):
             opinfo = info.InstancePtrInfo()
         elif op.getopnum() in (rop.STRLEN,):
             opinfo = vstring.StrPtrInfo(vstring.mode_string)            
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -2,6 +2,7 @@
 from rpython.jit.metainterp.resoperation import rop, OpHelpers, AbstractResOp,\
      ResOperation
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
+from rpython.jit.metainterp.optimizeopt.unroll import PreambleOp
 
 
 class RecentPureOps(object):
@@ -17,12 +18,19 @@
         self.next_index = (next_index + 1) % self.REMEMBER_LIMIT
         self.lst[next_index] = op
 
+    def force_preamble_op(self, opt, op, i):
+        if not isinstance(op, PreambleOp):
+            return
+        op = opt.force_op_from_preamble(op)
+        self.lst[i] = op
+
     def lookup1(self, opt, box0, descr):
         for i in range(self.REMEMBER_LIMIT):
             op = self.lst[i]
             if op is None:
                 break
             if opt.get_box_replacement(op.getarg(0)).same_box(box0) and op.getdescr() is descr:
+                self.force_preamble_op(opt, op, i)
                 return opt.get_box_replacement(op)
         return None
 
@@ -33,6 +41,7 @@
                 break
             if (opt.get_box_replacement(op.getarg(0)).same_box(box0) and opt.get_box_replacement(op.getarg(1)).same_box(box1)
                 and op.getdescr() is descr):
+                self.force_preamble_op(opt, op, i)
                 return opt.get_box_replacement(op)
         return None
 
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -88,7 +88,8 @@
             short_preamble.operations = short
             self.assert_equal(short_preamble, convert_old_style_to_targets(expected_short, jump=True),
                               text_right='expected short preamble')
-            assert short[-1].getdescr() == loop.operations[0].getdescr()
+            #assert short[-1].getdescr() == loop.operations[0].getdescr()
+            # XXX not sure what to do about that one
 
         return loop
 
@@ -187,7 +188,12 @@
         [i0]
         jump(i0)
         """
-        self.optimize_loop(ops, expected)
+        short = """
+        [i2]
+        p3 = cast_int_to_ptr(i2)
+        #jump(i2) <- think about it
+        """
+        self.optimize_loop(ops, expected, expected_short=short)
 
     def test_reverse_of_cast_2(self):
         ops = """
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -5,11 +5,12 @@
 from rpython.jit.metainterp.logger import LogOperations
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.generalize import KillHugeIntBounds
-from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, Optimization
+from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
+     Optimization
 from rpython.jit.metainterp.optimizeopt.virtualstate import (VirtualStateConstructor,
         ShortBoxes, BadVirtualState, VirtualStatesCantMatch)
 from rpython.jit.metainterp.resoperation import rop, ResOperation,\
-     OpHelpers, AbstractInputArg, GuardResOp
+     OpHelpers, AbstractInputArg, GuardResOp, AbstractResOp
 from rpython.jit.metainterp.resume import Snapshot
 from rpython.jit.metainterp import compile
 from rpython.rlib.debug import debug_print, debug_start, debug_stop
@@ -25,6 +26,17 @@
     return opt.propagate_all_forward(start_state, export_state)
 
 
+class PreambleOp(AbstractResOp):
+    def __init__(self, op):
+        self.op = op
+
+    def getarg(self, i):
+        return self.op.getarg(i)
+
+    def __repr__(self):
+        return "Preamble(%r)" % (self.op,)
+
+
 class UnrollableOptimizer(Optimizer):
     def setup(self):
         self.importable_values = {}
@@ -44,6 +56,11 @@
             self.emitted_guards += 1 # FIXME: can we use counter in self._emit_operation?
         self._emit_operation(op)
 
+    def force_op_from_preamble(self, op):
+        op = op.op
+        self.optunroll.short.append(op)
+        return op
+
 
 class UnrollOptimizer(Optimization):
     """Unroll the loop into two iterations. The first one will
@@ -55,6 +72,7 @@
     def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations):
         self.optimizer = UnrollableOptimizer(metainterp_sd, jitdriver_sd,
                                              loop, optimizations)
+        self.optimizer.optunroll = self
         self.boxes_created_this_iteration = None
 
     def get_virtual_state(self, args):
@@ -121,11 +139,12 @@
                 # Initial label matches, jump to it
                 jumpop = ResOperation(rop.JUMP, stop_label.getarglist(),
                                       descr=start_label.getdescr())
-                if self.short:
-                    # Construct our short preamble
-                    self.close_loop(start_label, jumpop, patchguardop)
-                else:
-                    self.optimizer.send_extra_operation(jumpop)
+                #if self.short:
+                #    # Construct our short preamble
+                #    self.close_loop(start_label, jumpop, patchguardop)
+                #else:
+                start_label.getdescr().short_preamble = self.short
+                self.optimizer.send_extra_operation(jumpop)
                 return
 
             if cell_token.target_tokens:
@@ -275,10 +294,19 @@
 
         # Setup the state of the new optimizer by emiting the
         # short operations and discarding the result
-        self.optimizer.emitting_dissabled = True
-        for source, target in exported_state.inputarg_setup_ops:
-            source.set_forwarded(target)
+        #self.optimizer.emitting_dissabled = True
+        # think about it, it seems to be just for consts
+        #for source, target in exported_state.inputarg_setup_ops:
+        #    source.set_forwarded(target)
 
+        for op in self.short_boxes.operations():
+            if not op:
+                continue
+            if op.is_always_pure():
+                self.pure(op.getopnum(), PreambleOp(op))
+            else:
+                yyy
+        return
         seen = {}
         for op in self.short_boxes.operations():
             self.ensure_short_op_emitted(op, self.optimizer, seen)


More information about the pypy-commit mailing list