[pypy-svn] r66440 - in pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Mon Jul 20 17:08:10 CEST 2009


Author: arigo
Date: Mon Jul 20 17:08:09 2009
New Revision: 66440

Modified:
   pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimizefindnode.py
   pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/resoperation.py
   pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimizefindnode.py
Log:
Fix optimizefindnode: a CALL_PURE operation has no side-effect,
but it must still force its arguments to be non-virtual.


Modified: pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimizefindnode.py
==============================================================================
--- pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimizefindnode.py	(original)
+++ pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimizefindnode.py	Mon Jul 20 17:08:09 2009
@@ -89,7 +89,7 @@
                 self.find_nodes_default(op)
 
     def find_nodes_default(self, op):
-        if not op.has_no_side_effect():
+        if not op.has_no_side_effect_ptr():
             # default case: mark the arguments as escaping
             for box in op.args:
                 self.getnode(box).mark_escaped()

Modified: pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/resoperation.py	(original)
+++ pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/resoperation.py	Mon Jul 20 17:08:09 2009
@@ -81,6 +81,10 @@
     def has_no_side_effect(self):
         return rop._NOSIDEEFFECT_FIRST <= self.opnum <= rop._NOSIDEEFFECT_LAST
 
+    def has_no_side_effect_ptr(self):
+        return (rop._NOSIDEEFFECT_PTR_FIRST <= self.opnum <=
+                rop._NOSIDEEFFECT_PTR_LAST)
+
     def can_raise(self):
         return rop._CANRAISE_FIRST <= self.opnum <= rop._CANRAISE_LAST
 
@@ -151,6 +155,7 @@
     INT_INVERT             = 62
     BOOL_NOT               = 63
     #
+    _NOSIDEEFFECT_PTR_FIRST = 70 # -- start of no_side_effect_ptr operations --
     OONONNULL              = 70
     OOISNULL               = 71
     OOIS                   = 72
@@ -176,6 +181,7 @@
     GETARRAYITEM_GC        = 120
     GETFIELD_GC            = 121
     GETFIELD_RAW           = 122
+    _NOSIDEEFFECT_PTR_LAST = 129 # -- end of no_side_effect_ptr operations --
     _NOSIDEEFFECT_LAST = 129 # ----- end of no_side_effect operations -----
 
     NEW                    = 130

Modified: pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimizefindnode.py	(original)
+++ pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimizefindnode.py	Mon Jul 20 17:08:09 2009
@@ -358,6 +358,62 @@
                     nextdescr=Virtual(node_vtable,
                                       nextdescr=Virtual(node_vtable)))''')
 
+    def test_find_nodes_oois(self):
+        ops = """
+        [p3, p4, p2]
+        p0 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
+        i1 = oononnull(p0)
+        guard_true(i1)
+          fail()
+        i2 = ooisnull(p0)
+        guard_false(i2)
+          fail()
+        i3 = ooisnot(p0, NULL)
+        guard_true(i3)
+          fail()
+        i4 = oois(p0, NULL)
+        guard_false(i4)
+          fail()
+        i5 = ooisnot(NULL, p0)
+        guard_true(i5)
+          fail()
+        i6 = oois(NULL, p0)
+        guard_false(i6)
+          fail()
+        i7 = ooisnot(p0, p1)
+        guard_true(i7)
+          fail()
+        i8 = oois(p0, p1)
+        guard_false(i8)
+          fail()
+        i9 = ooisnot(p0, p2)
+        guard_true(i9)
+          fail()
+        i10 = oois(p0, p2)
+        guard_false(i10)
+          fail()
+        i11 = ooisnot(p2, p1)
+        guard_true(i11)
+          fail()
+        i12 = oois(p2, p1)
+        guard_false(i12)
+          fail()
+        jump(p0, p1, p2)
+        """
+        self.find_nodes(ops, '''Virtual(node_vtable),
+                                Virtual(node_vtable),
+                                Not''')
+
+    def test_find_nodes_call(self):
+        ops = """
+        [i0, p2]
+        p0 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
+        i1 = call_pure(i0, p0)     # forces p0 to not be virtual
+        jump(i1, p0)
+        """
+        self.find_nodes(ops, 'Not, Not')
+
     # ------------------------------
     # Bridge tests
 



More information about the Pypy-commit mailing list