[pypy-commit] pypy jit-optimizeopt-cleanups: 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
hakanardo
noreply at buildbot.pypy.org
Thu Sep 29 18:39:32 CEST 2011
Author: Hakan Ardo <hakan at 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)
More information about the pypy-commit
mailing list