[pypy-svn] r70336 - in pypy/trunk/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Dec 29 14:08:24 CET 2009
Author: arigo
Date: Tue Dec 29 14:08:23 2009
New Revision: 70336
Modified:
pypy/trunk/pypy/jit/metainterp/optimizeopt.py
pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
Bug test and fix, with an XXX.
Modified: pypy/trunk/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/trunk/pypy/jit/metainterp/optimizeopt.py Tue Dec 29 14:08:23 2009
@@ -754,11 +754,11 @@
def optimize_SETFIELD_GC(self, op):
value = self.getvalue(op.args[0])
+ fieldvalue = self.getvalue(op.args[1])
if value.is_virtual():
- value.setfield(op.descr, self.getvalue(op.args[1]))
+ value.setfield(op.descr, fieldvalue)
else:
value.ensure_nonnull()
- fieldvalue = self.getvalue(op.args[1])
self.heap_op_optimizer.optimize_SETFIELD_GC(op, value, fieldvalue)
def optimize_NEW_WITH_VTABLE(self, op):
@@ -863,9 +863,14 @@
d[value] = fieldvalue
def read_cached_field(self, descr, value):
+ # XXX self.cached_fields and self.lazy_setfields should probably
+ # be merged somehow
d = self.cached_fields.get(descr, None)
if d is None:
- return None
+ op = self.lazy_setfields.get(descr, None)
+ if op is None:
+ return None
+ return self.optimizer.getvalue(op.args[1])
return d.get(value, None)
def cache_arrayitem_value(self, descr, value, indexvalue, fieldvalue, write=False):
Modified: pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py Tue Dec 29 14:08:23 2009
@@ -1369,6 +1369,28 @@
"""
self.optimize_loop(ops, 'Not, Not, Not, Not', expected)
+ def test_duplicate_setfield_5(self):
+ ops = """
+ [p0, i1]
+ p1 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p1, i1, descr=valuedescr)
+ setfield_gc(p0, p1, descr=nextdescr)
+ setfield_raw(i1, i1, descr=valuedescr) # random op with side-effects
+ p2 = getfield_gc(p0, descr=nextdescr)
+ i2 = getfield_gc(p2, descr=valuedescr)
+ setfield_gc(p0, NULL, descr=nextdescr)
+ escape(i2)
+ jump(p0, i1)
+ """
+ expected = """
+ [p0, i1]
+ setfield_raw(i1, i1, descr=valuedescr)
+ setfield_gc(p0, NULL, descr=nextdescr)
+ escape(i1)
+ jump(p0, i1)
+ """
+ self.optimize_loop(ops, 'Not, Not', expected)
+
def test_duplicate_setfield_sideeffects_1(self):
ops = """
[p1, i1, i2]
More information about the Pypy-commit
mailing list