[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