[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