[pypy-commit] pypy optresult-unroll: pass the first inlining of short preamble in the bridge, yay!

fijal noreply at buildbot.pypy.org
Wed Aug 19 12:18:41 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79051:73dadee30d14
Date: 2015-08-19 12:18 +0200
http://bitbucket.org/pypy/pypy/changeset/73dadee30d14/

Log:	pass the first inlining of short preamble in the bridge, yay!

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
@@ -266,6 +266,8 @@
                                descr=start_descr)
     mid_descr_token = TargetToken(jitcell_token,
                                   original_jitcell_token=jitcell_token)
+    mid_descr_token.short_preamble = loop_info.short_preamble
+    mid_descr_token.virtual_state = start_state.virtual_state
     mid_label = ResOperation(rop.LABEL, loop_info.label_args,
                              descr=mid_descr_token)
     # XXX assign short preamble and virtual state
@@ -1043,10 +1045,12 @@
                                  call_pure_results=call_pure_results,
                                  enable_opts=enable_opts)
     try:
-        info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data)
+        try:
+            info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data)
+        finally:
+            forget_optimization_info(inputargs)
+            forget_optimization_info(operations)
     except InvalidLoop:
-        forget_optimization_info(inputargs)
-        forget_optimization_info(operations)
         debug_print("compile_new_bridge: got an InvalidLoop")
         # XXX I am fairly convinced that optimize_bridge cannot actually raise
         # InvalidLoop
@@ -1056,9 +1060,9 @@
     new_trace = create_empty_loop(metainterp)
     new_trace.inputargs = info.inputargs
     new_trace.operations = newops
+    target_token = new_trace.operations[-1].getdescr()
     resumekey.compile_and_attach(metainterp, new_trace)
     record_loop_or_bridge(metainterp_sd, new_trace)
-    target_token = new_trace.operations[-1].getdescr()
     return target_token
     xxxx
     if new_trace.operations[-1].getopnum() != rop.LABEL:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
@@ -18,6 +18,8 @@
         info = self.unroll_and_optimize(loop, None)
         jitcell_token = compile.make_jitcell_token(None)
         mid_label_descr = TargetToken(jitcell_token)
+        mid_label_descr.short_preamble = info.short_preamble
+        mid_label_descr.virtual_state = info.virtual_state
         start_label_descr = TargetToken(jitcell_token)
         jitcell_token.target_tokens = [mid_label_descr, start_label_descr]
         loop.operations[0].setdescr(mid_label_descr)
@@ -28,6 +30,7 @@
         bridge = self.parse(bridge_ops, postprocess=self.postprocess)
         start_label = ResOperation(rop.LABEL, bridge.inputargs)
         bridge.operations[-1].setdescr(jitcell_token)
+        self.add_guard_future_condition(bridge)
         data = compile.BridgeCompileData(start_label, bridge.operations,
                                          enable_opts=self.enable_opts,
                             inline_short_preamble=inline_short_preamble)
@@ -85,4 +88,9 @@
         [i0, i1, i2]
         jump(i0, i1, i2)
         """
-        self.optimize(loop, bridge, bridge)
+        expected = """
+        [i0, i1, i2]
+        i3 = int_add(i0, 1)
+        jump(i0, i1, i2, i3)
+        """
+        self.optimize(loop, bridge, expected)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -395,9 +395,10 @@
             return ""
 
 class Info(object):
-    def __init__(self, preamble, short_preamble=None):
+    def __init__(self, preamble, short_preamble=None, virtual_state=None):
         self.preamble = preamble
         self.short_preamble = short_preamble
+        self.virtual_state = virtual_state
 
 class Storage(compile.ResumeGuardDescr):
     "for tests."
@@ -494,7 +495,8 @@
                                loop_info.extra_same_as + [emit_end_label])
         loop.inputargs = inputargs
         loop.operations = [emit_end_label] + ops
-        return Info(preamble, loop_info.short_preamble)
+        return Info(preamble, loop_info.short_preamble,
+                    start_state.virtual_state)
 
 
 class FakeDescr(compile.ResumeGuardDescr):
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
@@ -79,11 +79,12 @@
         modifier = VirtualStateConstructor(self.optimizer)
         return modifier.get_virtual_state(args)
 
-    def _check_no_forwarding(self, lsts):
+    def _check_no_forwarding(self, lsts, check_newops=True):
         for lst in lsts:
             for op in lst:
                 assert op.get_forwarded() is None
-        assert not self.optimizer._newoperations
+        if check_newops:
+            assert not self.optimizer._newoperations
     
     def optimize_preamble(self, start_label, end_label, ops, call_pure_results):
         self._check_no_forwarding([[start_label, end_label], ops])
@@ -110,7 +111,12 @@
         pass_to_short = state.virtual_state.make_inputargs(orig_jump_args,
                                     self.optimizer, force_boxes=True,
                                     append_virtuals=True)
-        extra_jump_args = self.inline_short_preamble(pass_to_short)
+        sb = self.short_preamble_producer
+        self.optimizer._clean_optimization_info(sb.short_inputargs)
+        extra_jump_args = self.inline_short_preamble(pass_to_short,
+                                sb.short_inputargs, sb.short,
+                                sb.short_preamble_jump,
+                                self.optimizer.patchguardop)
         # remove duplicates, removes stuff from used boxes too
         label_args, jump_args = self.filter_extra_jump_args(
             start_label.getarglist() + self.short_preamble_producer.used_boxes,
@@ -125,6 +131,8 @@
     def optimize_bridge(self, start_label, operations, call_pure_results,
                         inline_short_preamble):
         assert inline_short_preamble
+        self._check_no_forwarding([start_label.getarglist(),
+                                    operations])
         info, ops = self.optimizer.propagate_all_forward(
             start_label.getarglist()[:], operations[:-1],
             call_pure_results, True)
@@ -134,9 +142,15 @@
 
     def jump_to_existing_trace(self, jump_op, inline_short_preamble):
         jitcelltoken = jump_op.getdescr()
-        args = jump_op.getarglist()
+        args = [self.get_box_replacement(op) for op in jump_op.getarglist()]
+        target_token = jitcelltoken.target_tokens[0]
         virtual_state = self.get_virtual_state(args)
+        short_preamble = target_token.short_preamble
+        extra = self.inline_short_preamble(args,
+            short_preamble[0].getarglist(), short_preamble[1:-1],
+            short_preamble[-1].getarglist(), self.optimizer.patchguardop)
         self.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
+                                  args=args + extra,
                                   descr=jitcelltoken.target_tokens[0]))
 
     def filter_extra_jump_args(self, label_args, jump_args):
@@ -153,22 +167,24 @@
             d[arg] = None
         return new_label_args, new_jump_args
 
-    def inline_short_preamble(self, jump_args):
-        sb = self.short_preamble_producer
-        assert len(sb.short_inputargs) == len(jump_args)
+    def inline_short_preamble(self, jump_args, short_inputargs, short_ops,
+                              short_jump_op, patchguardop):
+        self._check_no_forwarding([short_inputargs, short_ops], False)
+        assert len(short_inputargs) == len(jump_args)
         for i in range(len(jump_args)):
-            sb.short_inputargs[i].set_forwarded(None)
-            self.make_equal_to(sb.short_inputargs[i], jump_args[i])
-        patchguardop = self.optimizer.patchguardop
-        for op in sb.short:
+            short_inputargs[i].set_forwarded(None)
+            self.make_equal_to(short_inputargs[i], jump_args[i])
+        for op in short_ops:
             if op.is_guard():
                 op = self.replace_op_with(op, op.getopnum())
                 op.rd_snapshot = patchguardop.rd_snapshot
                 op.rd_frame_info_list = patchguardop.rd_frame_info_list
             self.optimizer.send_extra_operation(op)
         res = [self.optimizer.get_box_replacement(op) for op in
-                sb.short_preamble_jump]
-        for op in sb.short_inputargs:
+                short_jump_op]
+        for op in short_inputargs:
+            op.set_forwarded(None)
+        for op in short_ops:
             op.set_forwarded(None)
         return res
 


More information about the pypy-commit mailing list