[pypy-commit] pypy optresult-unroll: start working on direct tests for bridges

fijal noreply at buildbot.pypy.org
Wed Aug 19 11:09:22 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79048:2f2f6319cdd2
Date: 2015-08-19 11:09 +0200
http://bitbucket.org/pypy/pypy/changeset/2f2f6319cdd2/

Log:	start working on direct tests for bridges

diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -76,6 +76,26 @@
         return opt.propagate_all_forward(self.start_label.getarglist(),
             self.operations, self.call_pure_results, self.enable_opts)
 
+class BridgeCompileData(CompileData):
+    """ This represents ops() with a jump at the end that goes to some
+    loop, we need to deal with virtual state and inlining of short preamble
+    """
+    def __init__(self, start_label, operations, call_pure_results=None,
+                 enable_opts=None, inline_short_preamble=False):
+        self.start_label = start_label
+        self.operations = operations
+        self.call_pure_results = call_pure_results
+        self.enable_opts = enable_opts
+        self.inline_short_preamble = inline_short_preamble
+
+    def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll):
+        from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
+
+        opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
+        return opt.optimize_bridge(self.start_label, self.operations,
+                                   self.call_pure_results,
+                                   self.inline_short_preamble)
+
 class UnrolledLoopData(CompileData):
     """ This represents label() ops jump with extra info that's from the
     run of LoopCompileData. Jump goes to the same label
@@ -253,7 +273,7 @@
     loop.operations = ([start_label] + preamble_ops + loop_info.extra_same_as +
                        [mid_label] + loop_ops)
     loop.check_consistency()
-    jitcell_token.all_target_tokens = [start_descr, mid_descr_token]
+    jitcell_token.target_tokens = [mid_descr_token, start_descr]
     send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop")
     record_loop_or_bridge(metainterp_sd, loop)
     return start_descr
@@ -783,10 +803,10 @@
         # to the corresponding guard_op and compile from there
         assert metainterp.resumekey_original_loop_token is not None
         new_loop.original_jitcell_token = metainterp.resumekey_original_loop_token
-        inputargs = metainterp.history.inputargs
+        inputargs = new_loop.inputargs
         if not we_are_translated():
             self._debug_suboperations = new_loop.operations
-        propagate_original_jitcell_token(new_loop)
+        #propagate_original_jitcell_token(new_loop)
         send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata,
                                self, inputargs, new_loop.operations,
                                new_loop.original_jitcell_token)
@@ -1001,11 +1021,10 @@
     metainterp_sd = metainterp.staticdata
     jitdriver_sd = metainterp.jitdriver_sd
     state = jitdriver_sd.warmstate
-    #if isinstance(resumekey, ResumeAtPositionDescr):
-    #    inline_short_preamble = False
-    #else:
-    #    xxx
-    #    inline_short_preamble = True
+    if isinstance(resumekey, ResumeAtPositionDescr):
+        inline_short_preamble = False
+    else:
+        inline_short_preamble = True
     inputargs = metainterp.history.inputargs[:]
     operations = metainterp.history.operations
     label = ResOperation(rop.LABEL, inputargs)
@@ -1014,9 +1033,15 @@
 
     call_pure_results = metainterp.call_pure_results
 
-    data = SimpleCompileData(label, operations,
-                             call_pure_results=call_pure_results,
-                             enable_opts=enable_opts)
+    if operations[-1].getopnum() == rop.JUMP:
+        data = BridgeCompileData(label, operations[:],
+                                 call_pure_results=call_pure_results,
+                                 enable_opts=enable_opts,
+                                 inline_short_preamble=inline_short_preamble)
+    else:
+        data = SimpleCompileData(label, operations[:],
+                                 call_pure_results=call_pure_results,
+                                 enable_opts=enable_opts)
     try:
         info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data)
     except InvalidLoop:
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
@@ -521,6 +521,10 @@
     def _emit_operation(self, op):
         assert not op.is_call_pure()
         orig_op = op
+        op = self.get_box_replacement(op)
+        if op.is_constant():
+            return # can happen e.g. if we postpone the operation that becomes
+            # constant
         op = self.replace_op_with(op, op.getopnum())
         for i in range(op.numargs()):
             arg = self.force_box(op.getarg(i))
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
@@ -0,0 +1,56 @@
+
+from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest,\
+     LLtypeMixin, convert_old_style_to_targets
+from rpython.jit.metainterp import compile
+from rpython.jit.metainterp.resoperation import ResOperation, rop
+from rpython.jit.metainterp.history import TargetToken
+
+class TestOptimizeBridge(BaseTest, LLtypeMixin):
+    enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
+
+    def optimize(self, ops, bridge_ops, expected, inline_short_preamble=True):
+        loop = self.parse(ops, postprocess=self.postprocess)
+        info = self.unroll_and_optimize(loop, None)
+        jitcell_token = compile.make_jitcell_token(None)
+        mid_label_descr = TargetToken(jitcell_token)
+        start_label_descr = TargetToken(jitcell_token)
+        jitcell_token.target_tokens = [mid_label_descr, start_label_descr]
+        loop.operations[0].setdescr(mid_label_descr)
+        loop.operations[-1].setdescr(mid_label_descr)
+        info.preamble.operations[0].setdescr(start_label_descr)
+        guards = [op for op in loop.operations if op.is_guard()]
+        assert len(guards) == 1, "more than one guard in the loop"
+        bridge = self.parse(bridge_ops, postprocess=self.postprocess)
+        start_label = ResOperation(rop.LABEL, bridge.inputargs)
+        bridge.operations[-1].setdescr(jitcell_token)
+        data = compile.BridgeCompileData(start_label, bridge.operations,
+                                         enable_opts=self.enable_opts,
+                            inline_short_preamble=inline_short_preamble)
+        bridge_info, ops = self._do_optimize_loop(data)
+        loop.check_consistency(check_descr=False)
+        info.preamble.check_consistency(check_descr=False)
+        bridge.operations = ([ResOperation(rop.LABEL, bridge_info.inputargs)] +
+                             ops)
+        bridge.inputargs = bridge_info.inputargs
+        bridge.check_consistency(check_descr=False)
+        expected = self.parse(expected, postprocess=self.postprocess)
+        self.assert_equal(bridge, convert_old_style_to_targets(expected,
+                                                               jump=True))
+    
+    def test_simple(self):
+        loop = """
+        [i0]
+        i1 = int_add(i0, 1)
+        i2 = int_is_true(i1)
+        guard_true(i2) [i1, i2]
+        jump(i1)
+        """
+        bridge = """
+        [i0, i1]
+        jump(i1)
+        """
+        expected = """
+        [i0, i1]
+        jump(i1)
+        """
+        self.optimize(loop, bridge, expected)
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
@@ -122,6 +122,23 @@
                            self.short_preamble_producer.extra_same_as),
                 self.optimizer._newoperations)
 
+    def optimize_bridge(self, start_label, operations, call_pure_results,
+                        inline_short_preamble):
+        assert inline_short_preamble
+        info, ops = self.optimizer.propagate_all_forward(
+            start_label.getarglist()[:], operations[:-1],
+            call_pure_results, True)
+        jump_op = operations[-1]
+        self.jump_to_existing_trace(jump_op, inline_short_preamble)
+        return info, self.optimizer._newoperations[:]
+
+    def jump_to_existing_trace(self, jump_op, inline_short_preamble):
+        jitcelltoken = jump_op.getdescr()
+        args = jump_op.getarglist()
+        virtual_state = self.get_virtual_state(args)
+        self.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
+                                  descr=jitcelltoken.target_tokens[0]))
+
     def filter_extra_jump_args(self, label_args, jump_args):
         new_label_args = []
         new_jump_args = []


More information about the pypy-commit mailing list