[pypy-svn] r65580 - in pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp: . test
antocuni at codespeak.net
antocuni at codespeak.net
Thu Jun 4 18:09:12 CEST 2009
Author: antocuni
Date: Thu Jun 4 18:09:10 2009
New Revision: 65580
Modified:
pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py
pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py
Log:
constant fold away guards that always passes. Also, be sure not to call fixop
(and hence new_arguments) more than once for each op
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py Thu Jun 4 18:09:10 2009
@@ -21,6 +21,7 @@
class Specializer(object):
loop = None
nodes = None
+ fixedops = None
def __init__(self, optlist):
self.optlist = optlist
@@ -89,9 +90,17 @@
def fixop(self, op):
if op is None:
- return
+ return None
+ if op in self.fixedops:
+ return op
if op.is_guard():
- return self.fixguard(op)
+ newop = self._fixguard(op)
+ else:
+ newop = self._fixop_default(op)
+ self.fixedops[newop] = None
+ return newop
+
+ def _fixop_default(self, op):
op = op.clone()
op.args = self.new_arguments(op)
if op.is_always_pure():
@@ -107,7 +116,14 @@
return
return op
- def fixguard(self, op):
+ def _fixguard(self, op):
+ if op.is_foldable_guard():
+ for arg in op.args:
+ if not self.getnode(arg).const:
+ break
+ else:
+ return None
+ op.args = self.new_arguments(op)
assert len(op.suboperations) == 1
op_fail = op.suboperations[0]
op_fail.args = self.new_arguments(op_fail)
@@ -119,6 +135,7 @@
def optimize_loop(self, loop):
self.nodes = {}
self.field_caches = {}
+ self.fixedops = {}
self.loop = loop
self.find_nodes()
self.optimize_operations()
@@ -165,7 +182,7 @@
assert isinstance(op.args[1], Const)
if instnode.const:
return
- #op = spec.fixguard(op) # ??
+ op = spec.fixop(op)
instnode.const = True
instnode.source = op.args[0].constbox()
return op
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py Thu Jun 4 18:09:10 2009
@@ -91,10 +91,11 @@
optlist = []
optimize_loop(None, [], loop, self.cpu,
spec=Specializer(optlist))
- return loop.operations
+ return loop
def assert_equal(self, optimized, expected):
- equaloplists(optimized, self.parse(expected).operations)
+ equaloplists(optimized.operations,
+ self.parse(expected).operations)
def test_constfold(self):
@@ -110,6 +111,18 @@
expected = "[]"
self.assert_equal(self.optimize(ops), expected)
+ def test_constfold_guard(self):
+ ops = """
+ []
+ i0 = int_add(0, 0)
+ guard_value(i0, 0)
+ fail(i0)
+ """
+ expected = """
+ []
+ """
+ loop = self.optimize(ops, [])
+ self.assert_equal(loop, expected)
def test_remove_guard_class(self):
ops = """
@@ -143,7 +156,11 @@
guard_value(i0, 0)
fail()
"""
- loop = self.optimize(ops, [OptimizeGuards()])
+ loop = self.parse(ops)
+ # cheat
+ loop.operations[1].result.value = 1
+ loop.operations[3].result.value = 3
+ loop = self.optimize(loop, [OptimizeGuards()])
self.assert_equal(loop, expected)
More information about the Pypy-commit
mailing list