Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: 
Changeset: r79714:e809b9eb72e9
Date: 2015-09-20 10:06 +0200
http://bitbucket.org/pypy/pypy/changeset/e809b9eb72e9/

Log:    a test and a fix

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -469,11 +469,9 @@
             if op is None:
                 continue
             val = op.getarg(1)
-            if val.type == 'r':
-                ptrinfo = self.getptrinfo(val)
-                if ptrinfo and ptrinfo.is_virtual():
-                    pendingfields.append(op)
-                    continue
+            if self.optimizer.is_virtual(val):
+                pendingfields.append(op)
+                continue
             cf.force_lazy_setfield(self, descr)
         for descr, submap in self.cached_arrayitems.iteritems():
             for index, cf in submap.iteritems():
@@ -486,12 +484,8 @@
                 # SETFIELD_GC or SETARRAYITEM_GC.
                 opinfo = self.getptrinfo(op.getarg(0))
                 assert not opinfo.is_virtual()      # it must be a non-virtual
-                if op.getarg(2).type == 'r':
-                    fieldinfo = self.getptrinfo(op.getarg(2))
-                    if fieldinfo and fieldinfo.is_virtual():
-                        pendingfields.append(op)
-                    else:
-                        cf.force_lazy_setfield(self, descr)
+                if self.optimizer.is_virtual(op.getarg(2)):
+                    pendingfields.append(op)
                 else:
                     cf.force_lazy_setfield(self, descr)                    
         return pendingfields
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -651,6 +651,14 @@
                                        op.getopnum(), argboxes,
                                        op.getdescr(), op.type)
 
+    def is_virtual(self, op):
+        if op.type == 'r':
+            opinfo = self.getptrinfo(op)
+            return opinfo and opinfo.is_virtual()
+        if op.type == 'i':
+            opinfo = self.getrawptrinfo(op)
+            return opinfo and opinfo.is_virtual()
+
     def pure_reverse(self, op):
         import sys
         if self.optpure is None:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -8881,5 +8881,26 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_pending_setfield_delayed_malloc(self):
+        ops = """
+        [i0, p0]
+        i2 = call_i('malloc', 10, descr=raw_malloc_descr)
+        setarrayitem_raw(i2, 0, 13, descr=rawarraydescr)
+        setfield_gc(p0, i2, descr=valuedescr)
+        i1 = int_add(i0, 1)
+        i3 = int_lt(i1, 10)
+        guard_true(i3) []
+        setfield_gc(p0, 0, descr=valuedescr)
+        jump(i1, p0)
+        """
+        expected = """
+        [i0, p0]
+        i1 = int_add(i0, 1)
+        i3 = int_lt(i1, 10)
+        guard_true(i3) [p0]
+        jump(i1, p0)
+        """
+        self.optimize_loop(ops, expected)
+
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
     pass
diff --git a/rpython/jit/metainterp/test/test_ajit.py 
b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -723,6 +723,7 @@
                 elif n == 7: a = 3
                 else:        a = 2
                 x = intmask(x * 10 + a)
+                print "XXXXXXXXXXXXXX", x
                 i += 1
             return x
         res = self.meta_interp(f, [0], backendopt=True)
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
@@ -1069,6 +1069,26 @@
         res = self.meta_interp(run, [42], backendopt=True)
         assert res == 420
 
+    def test_not_too_many_bridges(self):
+        jitdriver = JitDriver(greens = [], reds = 'auto')
+
+        def f(i):
+            s = 0
+            while i > 0:
+                jitdriver.jit_merge_point()
+                if i % 2 == 0:
+                    s += 1
+                elif i % 3 == 0:
+                    s += 1
+                elif i % 5 == 0:
+                    s += 1
+                elif i % 7 == 0:
+                    s += 1            
+                i -= 1
+            return s
+
+        self.meta_interp(f, [30])
+        self.check_trace_count(3)
 
 class TestLLtype(LoopTest, LLJitMixin):
     pass
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to