[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