[pypy-commit] pypy jit-optimizeopt-cleanups: started to move pure operation reusage into an optimization stage of its own
hakanardo
noreply at buildbot.pypy.org
Thu Sep 22 21:44:48 CEST 2011
Author: Hakan Ardo <hakan at 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):
More information about the pypy-commit
mailing list