Author: Richard Plangger <r...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit