[pypy-commit] pypy jit-short_from_state: dont allow ops generated by value.make_guards() from ending up in optimizer.pure_operations
hakanardo
noreply at buildbot.pypy.org
Sat Aug 6 12:58:34 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r46319:8a90da458db4
Date: 2011-08-06 09:54 +0200
http://bitbucket.org/pypy/pypy/changeset/8a90da458db4/
Log: dont allow ops generated by value.make_guards() from ending up in
optimizer.pure_operations
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
@@ -6683,12 +6683,13 @@
i2 = int_ge(i1, 8)
guard_true(i2) []
p2 = getarrayitem_gc(p1, 7, descr=<GcPtrArrayDescr>)
- jump(p0, p2)
- """
- expected = """
- [p0, p2]
+ jump(p0, p2, p1)
+ """
+ expected = """
+ [p0, p2, p1]
call(p2, descr=nonwritedescr)
- jump(p0, p2)
+ i3 = arraylen_gc(p1) # Should be killed by backend
+ jump(p0, p2, p1)
"""
self.optimize_loop(ops, expected, expected_short=short)
@@ -6760,12 +6761,13 @@
i2 = int_ge(i1, 8)
guard_true(i2) []
p2 = getarrayitem_gc_pure(p1, 7, descr=<GcPtrArrayDescr>)
- jump(p0, p2)
- """
- expected = """
- [p0, p2]
+ jump(p0, p2, p1)
+ """
+ expected = """
+ [p0, p2, p1]
call(p2, descr=nonwritedescr)
- jump(p0, p2)
+ i3 = arraylen_gc(p1) # Should be killed by backend
+ jump(p0, p2, p1)
"""
self.optimize_loop(ops, expected, expected_short=short)
@@ -6790,12 +6792,13 @@
guard_true(i8) []
i9 = int_le(i22, 255)
guard_true(i9) []
- jump(p0, i22)
- """
- expected = """
- [p0, i22]
+ jump(p0, i22, p1)
+ """
+ expected = """
+ [p0, i22, p1]
call(i22, descr=nonwritedescr)
- jump(p0, i22)
+ i3 = strlen(p1) # Should be killed by backend
+ jump(p0, i22, p1)
"""
self.optimize_loop(ops, expected, expected_short=short)
@@ -6817,12 +6820,13 @@
i22 = unicodegetitem(p1, 7, descr=<GcPtrArrayDescr>)
i8 = int_ge(i22, 0)
guard_true(i8) []
- jump(p0, i22)
- """
- expected = """
- [p0, i22]
+ jump(p0, i22, p1)
+ """
+ expected = """
+ [p0, i22, p1]
call(i22, descr=nonwritedescr)
- jump(p0, i22)
+ i3 = unicodelen(p1) # Should be killed by backend
+ jump(p0, i22, p1)
"""
self.optimize_loop(ops, expected, expected_short=short)
@@ -6878,7 +6882,26 @@
call(p1, descr=writeadescr)
jump(p1, p1)
"""
- self.optimize_loop(ops, expected)
+ self.optimize_loop(ops, expected)
+
+ def test_value_guard_arraylen_reused(self):
+ ops = """
+ [p0, p1]
+ p10 = getfield_gc(p0, descr=nextdescr)
+ p11 = getfield_gc(p1, descr=nextdescr)
+ i1 = arraylen_gc(p10, descr=arraydescr)
+ getarrayitem_gc(p11, 1, descr=arraydescr)
+ call(i1, descr=nonwritedescr)
+ jump(p1, p0)
+ """
+ expected = """
+ [p0, p1, p10, p11]
+ i1 = arraylen_gc(p10, descr=arraydescr)
+ getarrayitem_gc(p11, 1, descr=arraydescr)
+ call(i1, descr=nonwritedescr)
+ jump(p1, p0, p11, p10)
+ """
+ self.optimize_loop(ops, expected)
class TestLLtype(OptimizeOptTest, LLtypeMixin):
pass
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -210,7 +210,7 @@
debug_print('inputargs: ' + args)
args = ", ".join([logops.repr_of_arg(arg) for arg in short_inputargs])
debug_print('short inputargs: ' + args)
- self.short_boxes.debug_print(logops)
+ self.short_boxes.debug_print(logops)
# Force virtuals amoung the jump_args of the preamble to get the
# operations needed to setup the proper state of those virtuals
@@ -238,8 +238,6 @@
self.optimizer.emitting_dissabled = True
for op in inputarg_setup_ops:
self.optimizer.send_extra_operation(op)
- # XXX Hack to prevent previos loop from updateing pure_operations
- self.optimizer.pure_operations = args_dict()
seen = {}
for op in self.short_boxes.operations():
self.ensure_short_op_emitted(op, self.optimizer, seen)
@@ -254,6 +252,12 @@
self.optimizer.flush()
self.optimizer.emitting_dissabled = False
+ # XXX Hack to prevent the arraylen/strlen/unicodelen ops generated
+ # by value.make_guards() from ending up in pure_operations
+ for key, op in self.optimizer.pure_operations.items():
+ if not self.short_boxes.has_producer(op.result):
+ del self.optimizer.pure_operations[key]
+
initial_inputargs_len = len(inputargs)
self.inliner = Inliner(loop.inputargs, jump_args)
@@ -375,7 +379,6 @@
self.optimizer.send_extra_operation(newop)
self.optimizer.flush()
-
i = j = 0
while i < len(self.optimizer.newoperations) or j < len(jumpargs):
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -2934,7 +2934,7 @@
i += 1
res = self.meta_interp(f, [32])
assert res == f(32)
- self.check_loops(arraylen_gc=1)
+ self.check_loops(arraylen_gc=2)
class TestOOtype(BasicTests, OOJitMixin):
@@ -3203,7 +3203,7 @@
return sa
res = self.meta_interp(f, [32])
assert res == f(32)
- self.check_loops(arraylen_gc=1, everywhere=True)
+ self.check_loops(arraylen_gc=2, everywhere=True)
def test_release_gil_flush_heap_cache(self):
T = rffi.CArrayPtr(rffi.TIME_T)
More information about the pypy-commit
mailing list