Author: Carl Friedrich Bolz <[email protected]>
Branch: small-unroll-improvements
Changeset: r70846:e973dd1b60d5
Date: 2014-04-22 10:25 +0200
http://bitbucket.org/pypy/pypy/changeset/e973dd1b60d5/
Log: properly generate guards for virtual dicts
extremely advanced technology
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
@@ -10,7 +10,7 @@
equaloplists
from rpython.jit.metainterp.optimizeopt.intutils import IntBound
from rpython.jit.metainterp.optimizeopt.virtualize import (VirtualValue,
- VArrayValue, VStructValue)
+ VArrayValue, VStructValue, VArrayStructValue)
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
@@ -535,6 +535,34 @@
"""
self.guards(info1, info2, value1, expected, [self.nodebox])
+ def test_generate_guards_on_virtual_fields_matches_arraystruct(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
+
+ arraydescr = object()
+ fielddescr = object()
+
+ info1 = VArrayStructStateInfo(arraydescr, [[fielddescr]])
+ info1.fieldstate = [innerinfo1]
+
+ info2 = VArrayStructStateInfo(arraydescr, [[fielddescr]])
+ info2.fieldstate = [innerinfo2]
+
+ value1 = VArrayStructValue(arraydescr, 1, self.nodebox)
+ value1._items[0][fielddescr] = OptValue(self.nodebox)
+
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ guard_class(p0, ConstClass(node_vtable)) []
+ """
+ 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
@@ -223,7 +223,6 @@
self.fielddescrs = fielddescrs
def _generate_guards(self, other, value, state):
- # XXX this needs a test in test_virtualstate!!!
if not isinstance(other, VArrayStructStateInfo):
raise VirtualStatesCantMatch("other is not an
VArrayStructStateInfo")
if self.arraydescr is not other.arraydescr:
@@ -233,14 +232,19 @@
raise VirtualStatesCantMatch("other has a different length")
p = 0
+ v = None
for i in range(len(self.fielddescrs)):
if len(self.fielddescrs[i]) != len(other.fielddescrs[i]):
raise VirtualStatesCantMatch("other has a different length")
for j in range(len(self.fielddescrs[i])):
- if self.fielddescrs[i][j] is not other.fielddescrs[i][j]:
+ descr = self.fielddescrs[i][j]
+ if descr is not other.fielddescrs[i][j]:
raise VirtualStatesCantMatch("other is a different kind of
array")
+ if value is not None:
+ assert isinstance(value, virtualize.VArrayStructValue)
+ v = value._items[i][descr]
self.fieldstate[p].generate_guards(other.fieldstate[p],
- None, # XXX
+ v,
state)
p += 1
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit