Author: Hakan Ardo <ha...@debian.org> Branch: jit-optimizeopt-cleanups Changeset: r47406:8b3e60e6d037 Date: 2011-09-22 21:42 +0200 http://bitbucket.org/pypy/pypy/changeset/8b3e60e6d037/
Log: started to move pure operation reusage into an optimization stage of its own diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py --- a/pypy/jit/metainterp/optimizeopt/__init__.py +++ b/pypy/jit/metainterp/optimizeopt/__init__.py @@ -7,6 +7,7 @@ from pypy.jit.metainterp.optimizeopt.unroll import optimize_unroll, OptInlineShortPreamble from pypy.jit.metainterp.optimizeopt.fficall import OptFfiCall from pypy.jit.metainterp.optimizeopt.simplify import OptSimplify +from pypy.jit.metainterp.optimizeopt.pure import OptPure from pypy.rlib.jit import PARAMETERS from pypy.rlib.unroll import unrolling_iterable @@ -14,6 +15,7 @@ ('rewrite', OptRewrite), ('virtualize', OptVirtualize), ('string', OptString), + ('pure', OptPure), ('heap', OptHeap), ('ffi', None), ('unroll', None)] diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py --- a/pypy/jit/metainterp/optimizeopt/heap.py +++ b/pypy/jit/metainterp/optimizeopt/heap.py @@ -165,6 +165,9 @@ def flush(self): self.force_all_lazy_setfields_and_arrayitems() + if self.posponedop: + self.next_optimization.propagate_forward(self.posponedop) + self.posponedop = None def new(self): return OptHeap() 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 @@ -566,48 +566,8 @@ args[n + 1] = op.getdescr() return args - @specialize.argtype(0) def optimize_default(self, op): - canfold = op.is_always_pure() - if op.is_ovf(): - self.posponedop = op - return - if self.posponedop: - nextop = op - op = self.posponedop - self.posponedop = None - canfold = nextop.getopnum() == rop.GUARD_NO_OVERFLOW - else: - nextop = None - - if canfold: - for i in range(op.numargs()): - if self.get_constant_box(op.getarg(i)) is None: - break - else: - # all constant arguments: constant-fold away - resbox = self.constant_fold(op) - # note that INT_xxx_OVF is not done from here, and the - # overflows in the INT_xxx operations are ignored - self.make_constant(op.result, resbox) - return - - # did we do the exact same operation already? - args = self.make_args_key(op) - oldop = self.pure_operations.get(args, None) - if oldop is not None and oldop.getdescr() is op.getdescr(): - assert oldop.getopnum() == op.getopnum() - self.make_equal_to(op.result, self.getvalue(oldop.result), - True) - return - else: - self.pure_operations[args] = op - self.remember_emitting_pure(op) - - # otherwise, the operation remains self.emit_operation(op) - if nextop: - self.emit_operation(nextop) def remember_emitting_pure(self, op): pass diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py new file mode 100644 --- /dev/null +++ b/pypy/jit/metainterp/optimizeopt/pure.py @@ -0,0 +1,57 @@ +from pypy.jit.metainterp.optimizeopt.optimizer import Optimization +from pypy.jit.metainterp.resoperation import rop, ResOperation + +class OptPure(Optimization): + def __init__(self): + self.posponedop = None + + def propagate_forward(self, op): + canfold = op.is_always_pure() + if op.is_ovf(): + self.posponedop = op + return + if self.posponedop: + nextop = op + op = self.posponedop + self.posponedop = None + canfold = nextop.getopnum() == rop.GUARD_NO_OVERFLOW + else: + nextop = None + + if canfold: + for i in range(op.numargs()): + if self.get_constant_box(op.getarg(i)) is None: + break + else: + # all constant arguments: constant-fold away + resbox = self.optimizer.constant_fold(op) + # note that INT_xxx_OVF is not done from here, and the + # overflows in the INT_xxx operations are ignored + self.optimizer.make_constant(op.result, resbox) + return + + # did we do the exact same operation already? + args = self.optimizer.make_args_key(op) + oldop = self.optimizer.pure_operations.get(args, None) + if oldop is not None and oldop.getdescr() is op.getdescr(): + assert oldop.getopnum() == op.getopnum() + self.optimizer.make_equal_to(op.result, self.getvalue(oldop.result), + True) + return + else: + self.optimizer.pure_operations[args] = op + self.optimizer.remember_emitting_pure(op) + + # otherwise, the operation remains + self.emit_operation(op) + if op.returns_bool_result(): + self.optimizer.bool_boxes[self.getvalue(op.result)] = None + if nextop: + self.emit_operation(nextop) + + def flush(self): + assert self.posponedop is None + + def new(self): + assert self.posponedop is None + return OptPure() diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -111,7 +111,7 @@ class BaseTestBasic(BaseTest): - enable_opts = "intbounds:rewrite:virtualize:string:heap" + enable_opts = "intbounds:rewrite:virtualize:string:pure:heap" def optimize_loop(self, ops, optops, call_pure_results=None): diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizefficall.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizefficall.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizefficall.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizefficall.py @@ -36,7 +36,7 @@ class TestFfiCall(BaseTestBasic, LLtypeMixin): - enable_opts = "intbounds:rewrite:virtualize:string:heap:ffi" + enable_opts = "intbounds:rewrite:virtualize:string:pure:heap:ffi" class namespace: cpu = LLtypeMixin.cpu diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -68,7 +68,7 @@ class BaseTestWithUnroll(BaseTest): - enable_opts = "intbounds:rewrite:virtualize:string:heap:unroll" + enable_opts = "intbounds:rewrite:virtualize:string:pure:heap:unroll" def optimize_loop(self, ops, expected, expected_preamble=None, call_pure_results=None, expected_short=None): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit