Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r46400:080e6b76945d
Date: 2011-08-09 20:06 +0200
http://bitbucket.org/pypy/pypy/changeset/080e6b76945d/
Log: treat cached constants produced by setfield_gc in the same way as
cached constants produced by getfield_gc
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
@@ -136,7 +136,7 @@
result = op.getarg(1)
if isinstance(result, Const):
newresult = result.clonebox()
- shortboxes.alias(newresult, result)
+ optimizer.make_constant(newresult, result)
result = newresult
getop = ResOperation(rop.GETFIELD_GC, [op.getarg(0)],
result, op.getdescr())
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
@@ -6916,13 +6916,13 @@
i10 = getfield_gc(p5, descr=valuedescr)
call(i10, descr=nonwritedescr)
setfield_gc(p5, 1, descr=valuedescr)
- jump(p5, 1)
- """
- expected = """
- [p5, i10]
- call(i10, descr=nonwritedescr)
+ jump(p5)
+ """
+ expected = """
+ [p5]
+ call(1, descr=nonwritedescr)
setfield_gc(p5, 1, descr=valuedescr)
- jump(p5, 1)
+ jump(p5)
"""
self.optimize_loop(ops, expected, preamble)
@@ -6944,6 +6944,61 @@
"""
self.optimize_loop(ops, expected)
+ def test_specialized_to_cached_constant_guard(self):
+ ops = """
+ [p9]
+ i16 = getfield_gc(p9, descr=valuedescr)
+ i17 = int_is_true(i16)
+ guard_false(i17) []
+ call_assembler(i17, descr=asmdescr)
+ i18 = getfield_gc(p9, descr=valuedescr)
+ guard_value(i18, 0) []
+ jump(p9)
+ """
+ expected = """
+ [p9]
+ call_assembler(0, descr=asmdescr)
+ i18 = getfield_gc(p9, descr=valuedescr)
+ guard_value(i18, 0) []
+ jump(p9)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_specialized_to_cached_constant_setfield(self):
+ ops = """
+ [p9]
+ i16 = getfield_gc(p9, descr=valuedescr)
+ i17 = int_is_true(i16)
+ guard_false(i17) []
+ call_assembler(i17, descr=asmdescr)
+ i18 = setfield_gc(p9, 0, descr=valuedescr)
+ jump(p9)
+ """
+ expected = """
+ [p9]
+ call_assembler(0, descr=asmdescr)
+ i18 = setfield_gc(p9, 0, descr=valuedescr)
+ jump(p9)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_cached_equal_fields(self):
+ ops = """
+ [p5, p6]
+ i10 = getfield_gc(p5, descr=valuedescr)
+ i11 = getfield_gc(p6, descr=nextdescr)
+ call(i10, i11, descr=nonwritedescr)
+ setfield_gc(p6, i10, descr=nextdescr)
+ jump(p5, p6)
+ """
+ expected = """
+ [p5, p6, i10, i11]
+ call(i10, i11, descr=nonwritedescr)
+ setfield_gc(p6, i10, descr=nextdescr)
+ jump(p5, p6, i10, i10)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(OptimizeOptTest, LLtypeMixin):
pass
diff --git a/pypy/jit/metainterp/test/test_virtualstate.py
b/pypy/jit/metainterp/test/test_virtualstate.py
--- a/pypy/jit/metainterp/test/test_virtualstate.py
+++ b/pypy/jit/metainterp/test/test_virtualstate.py
@@ -627,7 +627,8 @@
[p0]
guard_nonnull(p0) []
i10 = getfield_gc(p0, descr=valuedescr)
- jump(p0, i10)
+ guard_value(i10, 1) []
+ jump(p0)
"""
self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
bridge = """
@@ -638,10 +639,32 @@
expected = """
[p0]
setfield_gc(p0, 7, descr=valuedescr)
- jump(p0, 7)
+ jump(p0)
"""
- self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
-
+ self.optimize_bridge(loop, bridge, expected, 'Preamble', p0=self.myptr)
+
+ def test_cached_equal_fields(self):
+ loop = """
+ [p5, p6]
+ i10 = getfield_gc(p5, descr=valuedescr)
+ i11 = getfield_gc(p6, descr=nextdescr)
+ call(i10, i11, descr=nonwritedescr)
+ setfield_gc(p6, i10, descr=nextdescr)
+ jump(p5, p6)
+ """
+ bridge = """
+ [p5, p6]
+ jump(p5, p6)
+ """
+ expected = """
+ [p5, p6]
+ guard_nonnull(p5) []
+ guard_nonnull(p6) []
+ i10 = getfield_gc(p5, descr=valuedescr)
+ i11 = getfield_gc(p6, descr=nextdescr)
+ jump(p5, p6, i10, i11)
+ """
+ self.optimize_bridge(loop, bridge, expected, p5=self.myptr,
p6=self.myptr2)
class TestLLtypeGuards(BaseTestGenerateGuards, LLtypeMixin):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit