Author: Hakan Ardo <ha...@debian.org> Branch: jit-optimizeopt-cleanups Changeset: r47686:a98b7287c8f4 Date: 2011-09-29 18:38 +0200 http://bitbucket.org/pypy/pypy/changeset/a98b7287c8f4/
Log: inroduce a OptEarlyForce optimization stage that forces box, that (most likely) will be forced anyway, early in the chain to allow the preceeding optimization stages to operate on the ops produced by the forcing 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 @@ -8,6 +8,7 @@ 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.jit.metainterp.optimizeopt.earlyforce import OptEarlyForce from pypy.rlib.jit import PARAMETERS from pypy.rlib.unroll import unrolling_iterable @@ -15,6 +16,7 @@ ('rewrite', OptRewrite), ('virtualize', OptVirtualize), ('string', OptString), + ('earlyforce', OptEarlyForce), ('pure', OptPure), ('heap', OptHeap), ('ffi', None), diff --git a/pypy/jit/metainterp/optimizeopt/earlyforce.py b/pypy/jit/metainterp/optimizeopt/earlyforce.py new file mode 100644 --- /dev/null +++ b/pypy/jit/metainterp/optimizeopt/earlyforce.py @@ -0,0 +1,16 @@ +from pypy.jit.metainterp.optimizeopt.optimizer import Optimization +from pypy.jit.metainterp.optimizeopt.vstring import VAbstractStringValue + +class OptEarlyForce(Optimization): + def propagate_forward(self, op): + for arg in op.getarglist(): + if arg in self.optimizer.values: + value = self.getvalue(arg) + if isinstance(value, VAbstractStringValue): + value.force_box(self) + self.emit_operation(op) + + def new(self): + return OptEarlyForce() + + 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 @@ -112,7 +112,7 @@ class BaseTestBasic(BaseTest): - enable_opts = "intbounds:rewrite:virtualize:string:pure:heap" + enable_opts = "intbounds:rewrite:virtualize:string:earlyforce: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:pure:heap:ffi" + enable_opts = "intbounds:rewrite:virtualize:string:pure:earlyforce: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:pure:heap:unroll" + enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll" def optimize_loop(self, ops, expected, expected_preamble=None, call_pure_results=None, expected_short=None): diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py --- a/pypy/jit/metainterp/optimizeopt/vstring.py +++ b/pypy/jit/metainterp/optimizeopt/vstring.py @@ -683,16 +683,6 @@ return dispatch_opt(self, op) - def emit_operation(self, op): - for arg in op.getarglist(): - if arg in self.optimizer.values: - value = self.getvalue(arg) - if isinstance(value, VAbstractStringValue): - value.force_box(self) - self.next_optimization.propagate_forward(op) - - - dispatch_opt = make_dispatcher_method(OptString, 'optimize_', default=OptString.emit_operation) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit