[pypy-commit] pypy small-unroll-improvements: correctly recursively generate guards for arrays

cfbolz noreply at buildbot.pypy.org
Mon Apr 14 09:58:48 CEST 2014


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: small-unroll-improvements
Changeset: r70625:4cbb8585a69f
Date: 2014-04-13 12:03 +0200
http://bitbucket.org/pypy/pypy/changeset/4cbb8585a69f/

Log:	correctly recursively generate guards for arrays

diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -9,7 +9,7 @@
 from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, \
                                                            equaloplists
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
-from rpython.jit.metainterp.optimizeopt.virtualize import VirtualValue
+from rpython.jit.metainterp.optimizeopt.virtualize import VirtualValue, VArrayValue
 from rpython.jit.metainterp.history import TreeLoop, JitCellToken
 from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeMetaInterpStaticData
 from rpython.jit.metainterp.resoperation import ResOperation, rop
@@ -452,7 +452,34 @@
                                     self.cpu)
 
 
-    def test_generate_guards_on_virtual_fields_matches(self):
+    def test_generate_guards_on_virtual_fields_matches_array(self):
+        innervalue1 = OptValue(self.nodebox)
+        constclassbox = self.cpu.ts.cls_of_box(self.nodebox)
+        innervalue1.make_constant_class(constclassbox, -1)
+        innerinfo1 = NotVirtualStateInfo(innervalue1)
+        innerinfo1.position = 1
+        innerinfo2 = NotVirtualStateInfo(OptValue(self.nodebox))
+        innerinfo2.position = 1
+
+        descr = object()
+
+        info1 = VArrayStateInfo(descr)
+        info1.fieldstate = [innerinfo1]
+
+        info2 = VArrayStateInfo(descr)
+        info2.fieldstate = [innerinfo2]
+
+        value1 = VArrayValue(descr, None, 1, self.nodebox)
+        value1._items[0] = OptValue(self.nodebox)
+
+        expected = """
+        [p0]
+        guard_nonnull(p0) []
+        guard_class(p0, ConstClass(node_vtable)) []
+        """
+        self.guards(info1, info2, value1, expected, [self.nodebox])
+
+    def test_generate_guards_on_virtual_fields_matches_struct(self):
         innervalue1 = OptValue(self.nodebox)
         constclassbox = self.cpu.ts.cls_of_box(self.nodebox)
         innervalue1.make_constant_class(constclassbox, -1)
@@ -477,6 +504,7 @@
         """
         self.guards(info1, info2, value1, expected, [self.nodebox])
 
+
     # _________________________________________________________________________
     # the below tests don't really have anything to do with guard generation
 
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -187,10 +187,13 @@
             raise VirtualStatesCantMatch("other is a different kind of array")
         if len(self.fieldstate) != len(other.fieldstate):
             raise VirtualStatesCantMatch("other has a different length")
+        v = None
         for i in range(len(self.fieldstate)):
-            # XXX value
+            if value is not None:
+                assert isinstance(value, virtualize.VArrayValue)
+                v = value._items[i]
             self.fieldstate[i].generate_guards(other.fieldstate[i],
-                                               None, state)
+                                               v, state)
 
     def enum_forced_boxes(self, boxes, value, optimizer):
         if not isinstance(value, virtualize.VArrayValue):


More information about the pypy-commit mailing list