[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