Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r44705:17a04836345a
Date: 2011-06-05 09:30 +0200
http://bitbucket.org/pypy/pypy/changeset/17a04836345a/
Log: guard_class needs to be guarded with guard_nonnull
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -247,6 +247,8 @@
# excisting compiled loop or retracing the loop. Both
# alternatives will always generate correct behaviour, but
# performace will differ.
+ op = ResOperation(rop.GUARD_NONNULL, [box], None)
+ extra_guards.append(op)
op = ResOperation(rop.GUARD_CLASS, [box, self.known_class], None)
extra_guards.append(op)
return
diff --git a/pypy/jit/metainterp/test/test_virtualstate.py
b/pypy/jit/metainterp/test/test_virtualstate.py
--- a/pypy/jit/metainterp/test/test_virtualstate.py
+++ b/pypy/jit/metainterp/test/test_virtualstate.py
@@ -1,3 +1,5 @@
+import py
+from pypy.jit.metainterp.optimizeutil import InvalidLoop
from pypy.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo,
VStructStateInfo, \
VArrayStateInfo, NotVirtualStateInfo
from pypy.jit.metainterp.optimizeopt.optimizer import OptValue
@@ -124,17 +126,20 @@
info.fieldstate = [info]
assert info.generalization_of(info, {}, {})
-class BaseTestGenerateGuards(BaseTest):
+class BaseTestGenerateGuards(BaseTest):
+ def guards(self, info1, info2, box, expected):
+ info1.position = info2.position = 0
+ guards = []
+ info1.generate_guards(info2, box, self.cpu, guards, {})
+ loop = self.parse(expected)
+ assert equaloplists(guards, loop.operations, False,
+ {loop.inputargs[0]: box})
def test_intbounds(self):
value1 = OptValue(BoxInt())
value1.intbound.make_ge(IntBound(0, 10))
value1.intbound.make_le(IntBound(20, 30))
info1 = NotVirtualStateInfo(value1)
info2 = NotVirtualStateInfo(OptValue(BoxInt()))
- info1.position = info2.position = 0
- guards = []
- box = BoxInt(15)
- info1.generate_guards(info2, box, None, guards, {})
expected = """
[i0]
i1 = int_ge(i0, 0)
@@ -142,9 +147,25 @@
i2 = int_le(i0, 30)
guard_true(i2) []
"""
- loop = self.parse(expected)
- assert equaloplists(guards, loop.operations, False,
- {loop.inputargs[0]: box})
+ self.guards(info1, info2, BoxInt(15), expected)
+ py.test.raises(InvalidLoop, self.guards,
+ info1, info2, BoxInt(50), expected)
+
+
+ def test_known_class(self):
+ value1 = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value1.make_constant_class(classbox, -1)
+ info1 = NotVirtualStateInfo(value1)
+ info2 = NotVirtualStateInfo(OptValue(self.nodebox))
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ guard_class(p0, ConstClass(node_vtable)) []
+ """
+ self.guards(info1, info2, self.nodebox, expected)
+ py.test.raises(InvalidLoop, self.guards,
+ info1, info2, BoxPtr(), expected)
class TestLLtype(BaseTestGenerateGuards, LLtypeMixin):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit