[pypy-commit] pypy optresult-unroll: a few fixes + a failing test. I think guard_subclass implementation in llgraph is incorrect
fijal
noreply at buildbot.pypy.org
Thu Sep 3 19:11:51 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79397:5b24a245a731
Date: 2015-09-03 19:11 +0200
http://bitbucket.org/pypy/pypy/changeset/5b24a245a731/
Log: a few fixes + a failing test. I think guard_subclass implementation
in llgraph is incorrect
diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -20,6 +20,9 @@
def force_box(self, op, optforce):
return op
+ def is_precise(self):
+ return False
+
def getconst(self):
raise Exception("not a constant")
@@ -119,6 +122,9 @@
def get_descr(self):
return self.descr
+ def is_precise(self):
+ return True
+
def force_box(self, op, optforce):
if self.is_virtual():
optforce.forget_numberings()
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -294,8 +294,11 @@
def optimize_GUARD_IS_OBJECT(self, op):
info = self.getptrinfo(op.getarg(0))
- if info is not None and info.is_about_object():
- return
+ if info is not None:
+ if info.is_about_object():
+ return
+ if info.is_precise():
+ raise InvalidLoop()
self.emit_operation(op)
def optimize_GUARD_GC_TYPE(self, op):
diff --git a/rpython/jit/metainterp/test/test_loop.py b/rpython/jit/metainterp/test/test_loop.py
--- a/rpython/jit/metainterp/test/test_loop.py
+++ b/rpython/jit/metainterp/test/test_loop.py
@@ -1,5 +1,5 @@
import py
-from rpython.rlib.jit import JitDriver, hint, set_param
+from rpython.rlib.jit import JitDriver, hint, set_param, dont_look_inside
from rpython.rlib.objectmodel import compute_hash
from rpython.jit.metainterp.warmspot import ll_meta_interp, get_stats
from rpython.jit.metainterp.test.support import LLJitMixin
@@ -953,5 +953,62 @@
res = self.meta_interp(f, [20, 10])
assert res == f(20, 10)
+ def test_subclasses_dont_match(self):
+ class A(object):
+ def __init__(self, val):
+ self.val = val
+
+ def getval(self):
+ return self.val
+
+ class B(A):
+ def __init__(self, foo, val):
+ self.foo = foo
+ self.val = val
+ self.val2 = val
+
+ def getval(self):
+ return self.val2
+
+ class Container(object):
+ def __init__(self, x):
+ self.x = x
+
+ myjitdriver = JitDriver(greens = [], reds = 'auto')
+
+ @dont_look_inside
+ def externfn(a, i):
+ if i > 7:
+ return 1
+ return 0
+
+ class Foo(Exception):
+ pass
+
+ @dont_look_inside
+ def checkclass(a):
+ if type(a) is not B:
+ raise Foo()
+
+ def f(n):
+ i = 0
+ a = Container(B(A(n), n))
+ b = Container(A(n))
+ s = 0
+ while i < n:
+ myjitdriver.jit_merge_point()
+ i += 1
+ try:
+ checkclass(a.x)
+ except Foo:
+ pass
+ else:
+ s += a.x.val2
+ if externfn(a, i):
+ a = b
+
+ assert f(15) == self.meta_interp(f, [15])
+
+
class TestLLtype(LoopTest, LLJitMixin):
pass
More information about the pypy-commit
mailing list