[pypy-svn] r70306 - in pypy/branch/jit-delayed-write/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Mon Dec 28 17:34:51 CET 2009


Author: arigo
Date: Mon Dec 28 17:34:49 2009
New Revision: 70306

Modified:
   pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py
   pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
hackish: reverse the order of the last two operations if it makes
sense to avoid a situation like "int_eq/setfield_gc/guard_true"
which the backend (at least the x86 backend) is not good at handling.


Modified: pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py	Mon Dec 28 17:34:49 2009
@@ -978,7 +978,7 @@
             self.force_all_lazy_setfields()
         self.clean_caches()
 
-    def force_lazy_setfield(self, descr):
+    def force_lazy_setfield(self, descr, before_guard=False):
         try:
             op = self.lazy_setfields[descr]
         except KeyError:
@@ -988,6 +988,18 @@
         if isinstance(fieldvalue, AbstractVirtualValue):
             fieldvalue.backstore_field = None
         self.optimizer._emit_operation(op)
+        #
+        # hackish: reverse the order of the last two operations if it makes
+        # sense to avoid the situation "int_eq/setfield_gc/guard_true"
+        newoperations = self.optimizer.newoperations
+        if before_guard and len(newoperations) >= 2:
+            lastop = newoperations[-1]
+            prevop = newoperations[-2]
+            if prevop.is_always_pure() and prevop.result not in lastop.args:
+                del newoperations[-1]
+                del newoperations[-1]
+                newoperations.append(lastop)
+                newoperations.append(prevop)
 
     def force_all_lazy_setfields(self):
         if len(self.lazy_setfields_descrs) > 0:
@@ -1014,7 +1026,7 @@
                 if fieldvalue.backstore_field is descr:
                     # this is the case that can be handled by resume data
                     continue
-            self.force_lazy_setfield(descr)
+            self.force_lazy_setfield(descr, before_guard=True)
 
     def force_lazy_setfield_if_necessary(self, op, value, write=False):
         try:

Modified: pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py	Mon Dec 28 17:34:49 2009
@@ -1429,6 +1429,20 @@
         """
         self.optimize_loop(ops, 'Not, Not, Not', expected)
 
+    def test_duplicate_setfield_residual_guard_3(self):
+        # test that the setfield_gc does not end up between int_eq and
+        # the following guard_true
+        ops = """
+        [p1, i1, i2, i3]
+        setfield_gc(p1, i1, descr=valuedescr)
+        i5 = int_eq(i3, 5)
+        guard_true(i5) []
+        i4 = int_neg(i2)
+        setfield_gc(p1, i2, descr=valuedescr)
+        jump(p1, i1, i2, i4)
+        """
+        self.optimize_loop(ops, 'Not, Not, Not, Not', ops)
+
     def test_duplicate_setfield_aliasing(self):
         # a case where aliasing issues (and not enough cleverness) mean
         # that we fail to remove any setfield_gc
@@ -2088,20 +2102,20 @@
         p2 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p2, i2, descr=valuedescr)
         setfield_gc(p1, p2, descr=nextdescr)
-        guard_true(i3, descr=fdescr) [p1]
+        guard_true(i3, descr=fdescr) []
         i4 = int_neg(i2)
         setfield_gc(p1, NULL, descr=nextdescr)
         jump(p1, i2, i4)
         """
         expected = """
         [p1, i2, i3]
-        guard_true(i3, descr=fdescr) [p1, i2]
+        guard_true(i3, descr=fdescr) [i2]
         i4 = int_neg(i2)
         setfield_gc(p1, NULL, descr=nextdescr)
         jump(p1, i2, i4)
         """
         self.optimize_loop(ops, 'Not, Not, Not', expected)
-        self.check_expanded_fail_descr('''p1
+        self.check_expanded_fail_descr('''
             where p2 is a node_vtable, valuedescr=i2 --> p1.nextdescr
             ''')
 



More information about the Pypy-commit mailing list