Author: Spenser Bauman <saba...@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..." _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit