[pypy-commit] pypy clean-exported-state: Implement deep scrubbing of optimization information from stored short boxes

sbauman pypy.commits at gmail.com
Wed Oct 12 23:56:19 EDT 2016


Author: Spenser Bauman <sabauma at gmail.com>
Branch: clean-exported-state
Changeset: r87742:2725e32ba613
Date: 2016-10-12 23:54 -0400
http://bitbucket.org/pypy/pypy/changeset/2725e32ba613/

Log:	Implement deep scrubbing of optimization information from stored
	short boxes

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
@@ -18,7 +18,7 @@
     See force_op_from_preamble for details how the extra things are put.
     """
     op = None
-    
+
     def __init__(self, op, preamble_op, invented_name):
         self.op = op
         self.preamble_op = preamble_op
@@ -51,7 +51,13 @@
 class AbstractShortOp(object):
     """ An operation that is potentially produced by the short preamble
     """
-    pass
+    res = None
+
+    def _check_no_forwarding(self):
+        assert self.res.get_forwarded() is None
+
+    def forget_optimization_info(self):
+        self.res.clear_forwarded()
 
 class HeapOp(AbstractShortOp):
     def __init__(self, res, getfield_op):
@@ -101,6 +107,14 @@
                                        descr=sop.getdescr())
         return ProducedShortOp(self, preamble_op)
 
+    def _check_no_forwarding(self):
+        AbstractShortOp._check_no_forwarding(self)
+        assert self.getfield_op.get_forwarded() is None
+
+    def forget_optimization_info(self):
+        AbstractShortOp.forget_optimization_info(self)
+        self.getfield_op.clear_forwarded()
+
     def __repr__(self):
         return "HeapOp(%r)" % (self.res,)
 
@@ -193,6 +207,16 @@
                 l.append(pop)
         return l
 
+    def _check_no_forwarding(self):
+        AbstractShortOp._check_no_forwarding(self)
+        self.one._check_no_forwarding()
+        self.two._check_no_forwarding()
+
+    def forget_optimization_info(self):
+        AbstractShortOp.forget_optimization_info(self)
+        self.one.forget_optimization_info()
+        self.two.forget_optimization_info()
+
     def repr(self, memo):
         return "CompoundOp(%s, %s, %s)" % (self.res.repr(memo),
                                            self.one.repr(memo),
@@ -203,7 +227,7 @@
 
 class ProducedShortOp(AbstractProducedShortOp):
     invented_name = False
-    
+
     def __init__(self, short_op, preamble_op):
         self.short_op = short_op
         self.preamble_op = preamble_op
@@ -215,6 +239,14 @@
     def repr(self, memo):
         return self.short_op.repr(memo)
 
+    def _check_no_forwarding(self):
+        self.short_op._check_no_forwarding()
+        assert self.preamble_op.get_forwarded() is None
+
+    def forget_optimization_info(self):
+        self.short_op.forget_optimization_info()
+        self.preamble_op.clear_forwarded()
+
     def __repr__(self):
         return "%r -> %r" % (self.short_op, self.preamble_op)
 
@@ -235,6 +267,14 @@
     def repr(self, memo):
         return "INP(%s)" % (self.res.repr(memo),)
 
+    def _check_no_forwarding(self):
+        AbstractShortOp._check_no_forwarding(self)
+        assert self.preamble_op.get_forwarded() is None
+
+    def forget_optimization_info(self):
+        AbstractShortOp.forget_optimization_info(self)
+        self.preamble_op.clear_forwarded()
+
     def __repr__(self):
         return "INP(%r -> %r)" % (self.res, self.preamble_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
@@ -550,10 +550,15 @@
     def _check_no_forwarding(self, optimizer):
         """ Ensures that no optimization state is attached to relevant operations
         before importing anything. """
-        shortops = [pop.short_op.res for pop in self.short_boxes]
+        # Some of these may be redunant
         optimizer._check_no_forwarding([
-            self.end_args, self.next_iteration_args, self.renamed_inputargs,
-            self.short_inputargs, shortops, self.exported_infos.keys()])
+            self.end_args,
+            self.next_iteration_args,
+            self.renamed_inputargs,
+            self.short_inputargs,
+            self.exported_infos.keys()])
+        for box in self.short_boxes:
+            box._check_no_forwarding()
 
     def forget_optimization_info(self):
         """ Clean up optimization info on all operations stored in the ExportedState.
@@ -566,13 +571,11 @@
         with an InvalidLoop exception, as optimize_peeled_loop() mutates the
         contents of ExportedState.
         """
-        # These first two may be subsumed by clearing self.exported_infos
-        # but I am not 100% certain
-        Optimizer._clean_optimization_info(self.end_args)
-        Optimizer._clean_optimization_info(self.next_iteration_args)
         Optimizer._clean_optimization_info(self.renamed_inputargs)
-        Optimizer._clean_optimization_info(self.short_inputargs)
-        Optimizer._clean_optimization_info(self.exported_infos.keys())
+        for box in self.exported_infos.iterkeys():
+            box.clear_forwarded()
+        for box in self.short_boxes:
+            box.forget_optimization_info()
 
     def final(self):
         return False
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -52,6 +52,10 @@
         llop.debug_print(lltype.Void, "setting forwarded on:", self.__class__.__name__)
         raise SettingForwardedOnAbstractValue()
 
+    def clear_forwarded(self):
+        if self.get_forwarded() is not None:
+            self.set_forwarded(None)
+
     @specialize.arg(1)
     def get_box_replacement(op, not_const=False):
         # Read the chain "op, op._forwarded, op._forwarded._forwarded..."


More information about the pypy-commit mailing list