[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