Author: Hakan Ardo <ha...@debian.org> Branch: jit-optimizeopt-cleanups Changeset: r47649:52f393f9ced1 Date: 2011-09-28 08:02 +0200 http://bitbucket.org/pypy/pypy/changeset/52f393f9ced1/
Log: Make values forced at loop boundaries be emitted at the OptPure stage when unrolling diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py --- a/pypy/jit/metainterp/optimizeopt/optimizer.py +++ b/pypy/jit/metainterp/optimizeopt/optimizer.py @@ -337,6 +337,7 @@ self.newoperations = [] self.volatile = {} self.optimizer = self + self.optpure = None if loop is not None: self.call_pure_results = loop.call_pure_results diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py --- a/pypy/jit/metainterp/optimizeopt/pure.py +++ b/pypy/jit/metainterp/optimizeopt/pure.py @@ -5,7 +5,10 @@ def __init__(self): self.posponedop = None - def propagate_forward(self, op): + def propagate_forward(self, op): + self.emit_operation(op) + + def emit_operation(self, op): canfold = op.is_always_pure() if op.is_ovf(): self.posponedop = op @@ -43,11 +46,11 @@ self.optimizer.remember_emitting_pure(op) # otherwise, the operation remains - self.emit_operation(op) + self.next_optimization.propagate_forward(op) if op.returns_bool_result(): self.optimizer.bool_boxes[self.getvalue(op.result)] = None if nextop: - self.emit_operation(nextop) + self.next_optimization.propagate_forward(nextop) def flush(self): assert self.posponedop is None @@ -55,3 +58,6 @@ def new(self): assert self.posponedop is None return OptPure() + + def setup(self): + self.optimizer.optpure = self diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py --- a/pypy/jit/metainterp/optimizeopt/virtualstate.py +++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py @@ -378,6 +378,8 @@ cpu, extra_guards, renum) def make_inputargs(self, values, optimizer, keyboxes=False): + if optimizer.optpure: + optimizer = optimizer.optpure assert len(values) == len(self.state) inputargs = [None] * len(self.notvirtuals) for i in range(len(values)): @@ -434,8 +436,12 @@ def get_virtual_state(self, jump_args): self.optimizer.force_at_end_of_preamble() already_forced = {} + if self.optimizer.optpure: + opt = self.optimizer.optpure + else: + opt = self.optimizer values = [self.getvalue(box).force_at_end_of_preamble(already_forced, - self.optimizer) + opt) for box in jump_args] for value in values: _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit