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

micke at codespeak.net micke at codespeak.net
Wed Aug 19 12:39:53 CEST 2009


Author: micke
Date: Wed Aug 19 12:39:53 2009
New Revision: 66966

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
(cfbolz, micke): optimize series of ooisnull and oononnull on the same object


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py	Wed Aug 19 12:39:53 2009
@@ -85,12 +85,27 @@
         if self.level < LEVEL_NONNULL:
             self.level = LEVEL_NONNULL
 
+    def make_null_or_nonnull(self):
+        if self.box.nonnull():
+            self.make_nonnull()
+        else:
+            self.make_constant()
+
     def is_virtual(self):
         # Don't check this with 'isinstance(_, VirtualValue)'!
         # Even if it is a VirtualValue, the 'box' can be non-None,
         # meaning it has been forced.
         return self.box is None
 
+class BoolValue(OptValue):
+
+    def __init__(self, box, fromvalue):
+        OptValue.__init__(self, box)
+        self.fromvalue = fromvalue
+
+    def make_constant(self):
+        OptValue.make_constant(self)
+        self.fromvalue.make_null_or_nonnull()
 
 class ConstantValue(OptValue):
     level = LEVEL_CONSTANT
@@ -364,6 +379,11 @@
         self.make_equal_to(box, vvalue)
         return vvalue
 
+    def make_bool(self, box, fromvalue):
+        value = BoolValue(box, fromvalue)
+        self.make_equal_to(box, value)
+        return value
+
     def new_ptr_box(self):
         if not self.cpu.is_oo:
             return BoxPtr()
@@ -536,19 +556,22 @@
         self.emit_operation(op)
         self.exception_might_have_happened = False
 
-    def optimize_OONONNULL(self, op):
+    def _optimize_nullness(self, op, expect_nonnull):
         if self.known_nonnull(op.args[0]):
-            assert op.result.getint() == 1
+            assert op.result.getint() == expect_nonnull
+            self.make_constant(op.result)
+        elif self.is_constant(op.args[0]): # known to be null
+            assert op.result.getint() == (not expect_nonnull)
             self.make_constant(op.result)
         else:
-            self.optimize_default(op)
+            self.make_bool(op.result, self.getvalue(op.args[0]))
+            self.emit_operation(op)
+
+    def optimize_OONONNULL(self, op):
+        self._optimize_nullness(op, True)
 
     def optimize_OOISNULL(self, op):
-        if self.known_nonnull(op.args[0]):
-            assert op.result.getint() == 0
-            self.make_constant(op.result)
-        else:
-            self.optimize_default(op)
+        self._optimize_nullness(op, False)
 
     def optimize_OOISNOT(self, op):
         value0 = self.getvalue(op.args[0])

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py	Wed Aug 19 12:39:53 2009
@@ -245,7 +245,6 @@
         self.optimize_loop(ops, 'Not', expected, i0=1, i1=0)
 
     def test_ooisnull_oononnull_2(self):
-        py.test.skip("less important")
         ops = """
         [p0]
         i0 = oononnull(p0)         # p0 != NULL
@@ -263,7 +262,32 @@
           fail()
         jump(p0)
         """
-        self.optimize_loop(ops, 'Not', expected, i0=1, i1=0)
+        self.optimize_loop(ops, 'Not', expected, i0=1, i1=0,
+                           p0=self.nodebox.value)
+
+    def test_ooisnull_oononnull_via_virtual(self):
+        ops = """
+        [p0]
+        pv = new_with_vtable(ConstClass(node_vtable))
+        setfield_gc(pv, p0, descr=valuedescr)
+        i0 = oononnull(p0)         # p0 != NULL
+        guard_true(i0)
+          fail()
+        p1 = getfield_gc(pv, descr=valuedescr)
+        i1 = ooisnull(p1)
+        guard_false(i1)
+          fail()
+        jump(p0)
+        """
+        expected = """
+        [p0]
+        i0 = oononnull(p0)
+        guard_true(i0)
+          fail()
+        jump(p0)
+        """
+        self.optimize_loop(ops, 'Not', expected, i0=1, i1=0,
+                           p0=self.nodebox.value)
 
     def test_oois_1(self):
         ops = """
@@ -556,21 +580,6 @@
         i1 = oononnull(p0)
         guard_true(i1)
           fail()
-        i2 = ooisnull(p0)
-        guard_false(i2)
-          fail()
-        i3 = oononnull(p0)
-        guard_true(i3)
-          fail()
-        i4 = ooisnull(p0)
-        guard_false(i4)
-          fail()
-        i5 = oononnull(p0)
-        guard_true(i5)
-          fail()
-        i6 = ooisnull(p0)
-        guard_false(i6)
-          fail()
         i7 = ooisnot(p0, p1)
         guard_true(i7)
           fail()



More information about the Pypy-commit mailing list