[pypy-commit] pypy vecopt2: updated vector to small test (simpler) and added new test for constant expansion
plan_rich
noreply at buildbot.pypy.org
Tue May 5 09:46:27 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt2
Changeset: r77132:42697efbbfa7
Date: 2015-05-04 19:53 +0200
http://bitbucket.org/pypy/pypy/changeset/42697efbbfa7/
Log: updated vector to small test (simpler) and added new test for
constant expansion
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -118,12 +118,13 @@
assert isinstance(op, GuardResOp)
olddescr = tgt_op.getdescr()
descr = compile.ResumeAtLoopHeaderDescr()
- descr.rd_consts = olddescr.rd_consts
- descr.rd_pendingfields = olddescr.rd_pendingfields
- descr.rd_virtuals = olddescr.rd_virtuals
- descr.rd_numb = olddescr.rd_numb
- descr.rd_count = olddescr.rd_count
- descr.rd_frame_info_list = olddescr.rd_frame_info_list
+ if olddescr:
+ descr.rd_consts = olddescr.rd_consts
+ descr.rd_pendingfields = olddescr.rd_pendingfields
+ descr.rd_virtuals = olddescr.rd_virtuals
+ descr.rd_numb = olddescr.rd_numb
+ descr.rd_count = olddescr.rd_count
+ descr.rd_frame_info_list = olddescr.rd_frame_info_list
#
tgt_op.setdescr(descr)
tgt_op.rd_snapshot = op.rd_snapshot
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -1012,6 +1012,47 @@
vopt = self.vectorize(self.parse_loop(ops),15)
self.assert_equal(vopt.loop, self.parse_loop(opt))
+ def test_too_small_vector(self):
+ ops = """
+ [p0,i0]
+ guard_early_exit() [p0,i0]
+ i1 = getarrayitem_raw(p0, 0, descr=chararraydescr) # constant index
+ i2 = getarrayitem_raw(p0, 1, descr=chararraydescr) # constant index
+ i4 = int_add(i1, i2)
+ i3 = int_add(i0,1)
+ i5 = int_lt(i3, 10)
+ guard_true(i5) [p0, i0]
+ jump(p0,i1)
+ """
+ try:
+ self.vectorize(self.parse_loop(ops))
+ py.test.fail("loop is not vectorizable")
+ except NotAVectorizeableLoop:
+ pass
+
+ def test_constant_expansion(self):
+ ops = """
+ [p0,i0]
+ guard_early_exit() [p0,i0]
+ i1 = getarrayitem_raw(p0, i0, descr=floatarraydescr) # constant index
+ i4 = int_mul(i1, 2)
+ i3 = int_add(i0,1)
+ i5 = int_lt(i3, 10)
+ guard_true(i5) [p0, i0]
+ jump(p0,i3)
+ """
+ opt="""
+ [p0,i0]
+ i2 = int_add(i0, 4)
+ i3 = int_lt(i2, 10)
+ guard_true(i3) [p0,i0]
+ v1 = vec_getarrayitem_raw(p0, i0, 4, descr=floatarraydescr)
+ v2 = int_mul(v1, 2)
+ jump(p0,i2)
+ """
+ vopt = self.vectorize(self.parse_loop(ops),3)
+ self.assert_equal(vopt.loop, self.parse_loop(opt))
+
class TestLLtype(BaseTestVectorize, LLtypeMixin):
pass
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
@@ -97,37 +97,40 @@
#if 4 < i:
# self.check_trace_count(1)
- @py.test.mark.parametrize('i,k',[(9,3)])
- def test_vector_register_too_small_vector(self, i, k):
+ @py.test.mark.parametrize('i',[1,2,3,4,9])
+ def test_vector_register_too_small_vector(self, i):
myjitdriver = JitDriver(greens = [],
reds = 'auto',
vectorize=True)
T = lltype.Array(rffi.SHORT, hints={'nolength': True})
- def f(d,v):
+
+ def g(d, va, vb):
i = 0
- va = lltype.malloc(T, v, flavor='raw', zero=True)
- vb = lltype.malloc(T, v, flavor='raw', zero=True)
- for j in range(v):
+ while i < d:
+ myjitdriver.jit_merge_point()
+ a = va[i]
+ b = vb[i]
+ ec = intmask(a) + intmask(b)
+ va[i] = rffi.r_short(ec)
+ i += 1
+
+ def f(d):
+ i = 0
+ va = lltype.malloc(T, d+100, flavor='raw', zero=True)
+ vb = lltype.malloc(T, d+100, flavor='raw', zero=True)
+ for j in range(d+100):
va[j] = rffi.r_short(1)
vb[j] = rffi.r_short(2)
- while i < d:
- myjitdriver.jit_merge_point()
- j = 0
- while j < v:
- a = va[j]
- b = vb[j]
- ec = intmask(a) + intmask(b)
- va[j] = rffi.r_short(ec)
- j += 1
- i += 1
- res = intmask(va[v-1])
+ g(d+100, va, vb)
+ g(d, va, vb) # this iteration might not fit into the vector register
+
+ res = intmask(va[d])
lltype.free(va, flavor='raw')
lltype.free(vb, flavor='raw')
return res
- res = self.meta_interp(f, [i,k])
- assert res == f(i,k)
-
+ res = self.meta_interp(f, [i])
+ assert res == f(i) == 3
class VectorizeLLtypeTests(VectorizeTests):
pass
More information about the pypy-commit
mailing list