Author: Spenser Bauman <saba...@gmail.com>
Branch: clean-exported-state
Changeset: r87755:259d7eac6056
Date: 2016-10-13 09:59 -0400
http://bitbucket.org/pypy/pypy/changeset/259d7eac6056/

Log:    Fix interaction with forcing virtual state and retracing

        Abort optimization when forcing portions of the virtual state
        requires modifying an existing short preamble

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
@@ -5,6 +5,7 @@
      rop, AbstractResOp, AbstractInputArg
 from rpython.jit.metainterp.history import Const, make_hashable_int,\
      TreeLoop
+from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt import info
 
 class PreambleOp(AbstractResOp):
@@ -494,16 +495,23 @@
         self.sb = sb
         self.extra_same_as = self.sb.extra_same_as
         self.target_token = target_token
+        self.build_inplace = False
 
     def setup(self, jump_args, short, label_args):
         self.jump_args = jump_args
         self.short = short
         self.label_args = label_args
+        self.build_inplace = True
 
     def add_preamble_op(self, preamble_op):
         """ Notice that we're actually using the preamble_op, add it to
         label and jump
         """
+        # Could this be considered a speculative error?
+        # This check should only fail when trying to jump to an existing trace
+        # by forcing portions of the virtualstate.
+        if not self.build_inplace:
+            raise InvalidLoop("Forcing boxes would modify an existing short 
preamble")
         op = preamble_op.op.get_box_replacement()
         if preamble_op.invented_name:
             self.extra_same_as.append(op)
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
@@ -350,6 +350,9 @@
                 self.optimizer.metainterp_sd.logger_ops.log_short_preamble([],
                     short_preamble, {})
                 raise
+            except InvalidLoop:
+                assert force_boxes
+                raise
 
             self.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
                                       args=args + extra,
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to