Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: optresult-unroll
Changeset: r79291:45f5f8d0c2c8
Date: 2015-08-30 12:07 +0200
http://bitbucket.org/pypy/pypy/changeset/45f5f8d0c2c8/

Log:    fix some damage + force args early for preamble

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -473,11 +473,6 @@
             if indexb is None or indexb.contains(idx):
                 cf.force_lazy_setfield(self, None, can_cache)
 
-    def force_at_end_of_preamble(self):
-        self.cached_dict_reads.clear()
-        self.corresponding_array_descrs.clear()
-        self.force_all_lazy_setfields_and_arrayitems()
-
     def force_all_lazy_setfields_and_arrayitems(self):
         items = self.cached_fields.items()
         if not we_are_translated():
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
@@ -206,9 +206,6 @@
     def setup(self):
         pass
 
-    def force_at_end_of_preamble(self):
-        pass
-
     # Called after last operation has been propagated to flush out any 
posponed ops
     def flush(self):
         pass
@@ -296,10 +293,6 @@
             return
         self.replaces_guard[op] = value.last_guard_pos
 
-    def force_at_end_of_preamble(self):
-        for o in self.optimizations:
-            o.force_at_end_of_preamble()
-
     def force_box_for_end_of_preamble(self, box):
         if box.type == 'r':
             info = self.getptrinfo(box)
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
@@ -343,7 +343,10 @@
 
 empty_info = EmptyInfo()
 
-class ShortPreambleBuilder(object):
+class AbstractShortPreambleBuilder(object):
+    pass
+
+class ShortPreambleBuilder(AbstractShortPreambleBuilder):
     """ ShortPreambleBuilder is used during optimizing of the peeled loop,
     starting from short_boxes exported from the preamble. It will build
     the short preamble and necessary extra label arguments
@@ -413,3 +416,6 @@
             TreeLoop.check_consistency_of(self.short_inputargs,
                                 self.short + [jump_op], check_descr=False)
         return [label_op] + self.short + [jump_op]
+
+class ExtendedShortPreambleBuilder(AbstractShortPreambleBuilder):
+    pass
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
@@ -4013,9 +4013,9 @@
         p3 = force_token()
         #
         p2 = new_with_vtable(descr=vref_descr)
+        setfield_gc(p2, p3, descr=virtualtokendescr)
+        setfield_gc(p2, NULL, descr=virtualforceddescr)
         setfield_gc(p0, p2, descr=nextdescr)
-        setfield_gc(p2, NULL, descr=virtualforceddescr)
-        setfield_gc(p2, p3, descr=virtualtokendescr)
         #
         call_may_force_n(i1, descr=mayforcevirtdescr)
         guard_not_forced() [p2, i1]
@@ -4024,9 +4024,9 @@
         setfield_gc(p2, NULL, descr=virtualtokendescr)
         p1 = new_with_vtable(descr=nodesize)
         p1b = new_with_vtable(descr=nodesize)
-        setfield_gc(p2, p1, descr=virtualforceddescr)
         setfield_gc(p1b, i1, descr=valuedescr)
         setfield_gc(p1, p1b, descr=nextdescr)
+        setfield_gc(p2, p1, descr=virtualforceddescr)
         jump(p0, i1)
         """
         # the point of this test is that 'i1' should show up in the fail_args
@@ -4686,8 +4686,8 @@
         [i0, p0]
         p1 = new_array(i0, descr=gcarraydescr)
         i1 = arraylen_gc(p1)
+        ifoo = arraylen_gc(p0, descr=gcarraydescr)
         setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
-        ifoo = arraylen_gc(p0, descr=gcarraydescr)
         jump(i0, p0)
         """
         self.optimize_loop(ops, 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
@@ -2,7 +2,7 @@
 import sys
 from rpython.jit.metainterp.history import Const, TargetToken, JitCellToken
 from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\
-     ShortPreambleBuilder, PreambleOp
+     ShortPreambleBuilder, ExtendedShortPreambleBuilder, PreambleOp
 from rpython.jit.metainterp.optimizeopt import info, intutils
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
      Optimization, LoopInfo, MININT, MAXINT
@@ -121,13 +121,15 @@
             flush=False)
         label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
         extra_same_as = self.short_preamble_producer.extra_same_as[:]
+        args = state.virtual_state.make_inputargs(
+            [self.get_box_replacement(x) for x in end_jump.getarglist()],
+            self.optimizer, force_boxes=True)
+        for arg in args:
+            self.optimizer.force_box(arg)
         target_token = self.finalize_short_preamble(label_op,
                                                     state.virtual_state)
         label_op.setdescr(target_token)
         # 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)
         if new_virtual_state is not None:
             celltoken = start_label.getdescr()
@@ -153,7 +155,7 @@
             return self.jump_to_preamble(cell_token, jump_op, info)
         # force all the information that does not go to the short
         # preamble at all
-        self.optimizer.force_at_end_of_preamble()
+        self.optimizer.flush()
         for a in jump_op.getarglist():
             self.optimizer.force_box_for_end_of_preamble(a)
         vs = self.jump_to_existing_trace(jump_op)
@@ -196,7 +198,7 @@
         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
+        self.short_preamble_producer = ExtendedShortPreambleBuilder()
         label_op.initarglist(label_op.getarglist() + sb.used_boxes)
         return target_token
 
@@ -275,7 +277,7 @@
     def export_state(self, start_label, original_label_args, 
renamed_inputargs):
         end_args = [self.optimizer.force_box_for_end_of_preamble(a)
                     for a in original_label_args]
-        self.optimizer.force_at_end_of_preamble()
+        self.optimizer.flush()
         virtual_state = self.get_virtual_state(end_args)
         end_args = [self.get_box_replacement(arg) for arg in end_args]
         infos = {}
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to