[pypy-commit] pypy optresult-unroll: kill modifying short preamble in place

fijal noreply at buildbot.pypy.org
Fri Aug 28 18:32:32 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79284:4cf54bb12f0f
Date: 2015-08-28 18:14 +0200
http://bitbucket.org/pypy/pypy/changeset/4cf54bb12f0f/

Log:	kill modifying short preamble in place

diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -408,8 +408,7 @@
 
     def build_short_preamble(self):
         label_op = ResOperation(rop.LABEL, self.short_inputargs[:])
-        jump_op = ResOperation(rop.JUMP, self.short_preamble_jump)
-        # WARNING! the short_preamble_jump is shared on purpose
+        jump_op = ResOperation(rop.JUMP, self.short_preamble_jump[:])
         if not we_are_translated():
             TreeLoop.check_consistency_of(self.short_inputargs,
                                 self.short + [jump_op], check_descr=False)
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
@@ -855,19 +855,19 @@
         i3 = getfield_gc_i(p3sub, descr=valuedescr)
         escape_n(i3)
         p2sub = new_with_vtable(descr=nodesize2)
+        setfield_gc(p2sub, i1, descr=valuedescr)
         setfield_gc(p2, p2sub, descr=nextdescr)
-        setfield_gc(p2sub, i1, descr=valuedescr)
-        i4 = same_as_i(i1)
-        jump(i1, p2, p2sub, i4)
-        """
-        expected = """
-        [i1, p2, p10, i10]
-        escape_n(i10)
+        jump(i1, p2, p2sub)
+        """
+        expected = """
+        [i1, p2, p10]
+        i3 = getfield_gc_i(p10, descr=valuedescr)
+        escape_n(i3)
         p1 = new_with_vtable(descr=nodesize)
         p3sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p3sub, i1, descr=valuedescr)
         setfield_gc(p1, p3sub, descr=nextdescr)
-        jump(i1, p1, p3sub, i1)
+        jump(i1, p1, p3sub)
         """
         self.optimize_loop(ops, expected, preamble,
                 jump_values=[None, self.nodefulladdr, self.nodefulladdr, None])
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
@@ -81,7 +81,6 @@
     distinction anymore)"""
 
     short_preamble_producer = None
-    main_target_token = None
 
     def __init__(self, metainterp_sd, jitdriver_sd, optimizations):
         self.optimizer = UnrollableOptimizer(metainterp_sd, jitdriver_sd,
@@ -121,20 +120,15 @@
             start_label.getarglist()[:], ops, call_pure_results, False,
             flush=False)
         label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
+        extra_same_as = self.short_preamble_producer.extra_same_as[:]
         target_token = self.finalize_short_preamble(label_op,
                                                     state.virtual_state)
-        self.main_target_token = target_token
         label_op.setdescr(target_token)
-        extra = self.short_preamble_producer.used_boxes
-        label_op.initarglist(label_args + extra)
         # force the boxes for virtual state to match
         state.virtual_state.make_inputargs(
             [self.get_box_replacement(x) for x in end_jump.getarglist()],
             self.optimizer, force_boxes=True)
         new_virtual_state = self.jump_to_existing_trace(end_jump)
-        # the short preamble could have grown, we reinitialize
-        # the label_op again
-        label_op.initarglist(label_args + extra)
         if new_virtual_state is not None:
             celltoken = start_label.getdescr()
             assert isinstance(celltoken, JitCellToken)
@@ -142,8 +136,7 @@
             return (UnrollInfo(target_token, label_op, []),
                     self.optimizer._newoperations)
             #return new_virtual_state, self.optimizer._newoperations
-        return (UnrollInfo(target_token, label_op,
-                           self.short_preamble_producer.extra_same_as),
+        return (UnrollInfo(target_token, label_op, extra_same_as),
                 self.optimizer._newoperations)
 
     def optimize_bridge(self, start_label, operations, call_pure_results,
@@ -203,6 +196,8 @@
         target_token.virtual_state = virtual_state
         target_token.short_preamble = short_preamble
         jitcelltoken.target_tokens.append(target_token)
+        self.short_preamble_producer = None # no more boxes
+        label_op.initarglist(label_op.getarglist() + sb.used_boxes)
         return target_token
 
     def jump_to_preamble(self, cell_token, jump_op, info):
@@ -238,13 +233,9 @@
                 self.optimizer, append_virtuals=True)
             args = target_virtual_state.make_inputargs(args,
                 self.optimizer)
-            if target_token is self.main_target_token:
-                # rebuild the short preamble, it might have changed
-                new_sp = self.short_preamble_producer.build_short_preamble()
-                target_token.short_preamble = new_sp
             short_preamble = target_token.short_preamble
             extra = self.inline_short_preamble(pass_to_short, args,
-                short_preamble[0].getarglist(), short_preamble,
+                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,
@@ -255,16 +246,13 @@
     def inline_short_preamble(self, jump_args, args_no_virtuals,
                               short_inputargs, short_ops,
                               short_jump_op, patchguardop):
-        # warning!!!! short_jump_op might have arguments appended IN PLACE
         try:
             self._check_no_forwarding([short_inputargs, short_ops], False)
             assert len(short_inputargs) == len(jump_args)
             for i in range(len(jump_args)):
                 short_inputargs[i].set_forwarded(None)
                 self.make_equal_to(short_inputargs[i], jump_args[i])
-            i = 1
-            while i < len(short_ops) - 1:
-                op = short_ops[i]
+            for op in short_ops:
                 if op.is_guard():
                     op = self.replace_op_with(op, op.getopnum(),
                                     descr=compile.ResumeAtPositionDescr())
@@ -272,7 +260,6 @@
                     op.rd_snapshot = patchguardop.rd_snapshot
                     op.rd_frame_info_list = patchguardop.rd_frame_info_list
                 self.optimizer.send_extra_operation(op)
-                i += 1
             # force all of them except the virtuals
             for arg in args_no_virtuals + short_jump_op:
                 self.optimizer.force_box(self.get_box_replacement(arg))
@@ -284,9 +271,9 @@
                 op.set_forwarded(None)
 
     def export_state(self, start_label, original_label_args, renamed_inputargs):
-        self.optimizer.force_at_end_of_preamble()
         end_args = [self.optimizer.force_box_for_end_of_preamble(a)
                     for a in original_label_args]
+        self.optimizer.force_at_end_of_preamble()
         virtual_state = self.get_virtual_state(end_args)
         end_args = [self.get_box_replacement(arg) for arg in end_args]
         infos = {}


More information about the pypy-commit mailing list