[pypy-commit] pypy vecopt: copying operations if there are more versioned fail descrs,

plan_rich noreply at buildbot.pypy.org
Fri Jul 10 13:35:37 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78526:756c0b5ed2d7
Date: 2015-07-10 13:35 +0200
http://bitbucket.org/pypy/pypy/changeset/756c0b5ed2d7/

Log:	copying operations if there are more versioned fail descrs, added a
	test to check if array bounds checking can be improved

diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -195,18 +195,18 @@
 
 def generate_pending_loop_versions(loop, jitdriver_sd, metainterp, jitcell_token):
     metainterp_sd = metainterp.staticdata
+    cpu = metainterp_sd.cpu
     if loop.versions is not None:
         token = jitcell_token
         for version in loop.versions:
-            for faildescr  in version.faildescrs:
+            for faildescr in version.faildescrs:
                 vl = create_empty_loop(metainterp)
                 vl.inputargs = version.inputargs
-                vl.operations = version.operations
+                vl.operations = version.copy_operations()
                 vl.original_jitcell_token = jitcell_token
                 send_bridge_to_backend(jitdriver_sd, metainterp_sd,
                                        faildescr, version.inputargs,
                                        version.operations, jitcell_token)
-                vl.original_jitcell_token = jitcell_token
                 record_loop_or_bridge(metainterp_sd, vl)
     loop.versions = None
 
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -780,6 +780,9 @@
                     op.setfailargs(version_failargs)
                     op.rd_snapshot = None
 
+    def copy_operations(self):
+        return [op.clone() for op in self.operations]
+
     def update_token(self, jitcell_token):
         label = self.operations[self.label_pos]
         jump = self.operations[-1]
diff --git a/rpython/jit/metainterp/test/test_vectorize.py b/rpython/jit/metainterp/test/test_vectorize.py
--- a/rpython/jit/metainterp/test/test_vectorize.py
+++ b/rpython/jit/metainterp/test/test_vectorize.py
@@ -171,6 +171,46 @@
         res = self.meta_interp(f, [60])
         assert res == f(60) == sum(range(60))
 
+    @py.test.mark.parametrize('i',[15])
+    def test_array_bounds_check_elimination(self,i):
+        myjitdriver = JitDriver(greens = [],
+                                reds = 'auto',
+                                vectorize=True)
+        T = lltype.Array(rffi.INT, hints={'nolength': True})
+        def f(d):
+            va = lltype.malloc(T, d, flavor='raw', zero=True)
+            vb = lltype.malloc(T, d, flavor='raw', zero=True)
+            for j in range(d):
+                va[j] = rffi.r_int(j)
+                vb[j] = rffi.r_int(j)
+            i = 0
+            while i < d:
+                myjitdriver.jit_merge_point()
+
+                if i < 0:
+                    raise IndexError
+                if i >= d:
+                    raise IndexError
+                a = va[i]
+                if i < 0:
+                    raise IndexError
+                if i >= d:
+                    raise IndexError
+                b = vb[i]
+                ec = intmask(a)+intmask(b)
+                if i < 0:
+                    raise IndexError
+                if i >= d:
+                    raise IndexError
+                va[i] = rffi.r_int(ec)
+
+                i += 1
+            lltype.free(va, flavor='raw')
+            lltype.free(vb, flavor='raw')
+            return 0
+        res = self.meta_interp(f, [i])
+        assert res == f(i)
+
 class VectorizeLLtypeTests(VectorizeTests):
     pass
 


More information about the pypy-commit mailing list