Author: Richard Plangger <planri...@gmail.com> Branch: vecopt-merge Changeset: r79818:fd5cdd7ddc3e Date: 2015-09-25 10:51 +0200 http://bitbucket.org/pypy/pypy/changeset/fd5cdd7ddc3e/
Log: 7 new test cases to check the guard_true/false assembler for vector parameters diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py --- a/pypy/module/micronumpy/test/test_zjit.py +++ b/pypy/module/micronumpy/test/test_zjit.py @@ -118,20 +118,6 @@ retval = self.interp.eval_graph(self.graph, [i]) return retval - def define_dot_matrix(): - return """ - mat = |16| - m = reshape(mat, [4,4]) - vec = [0,1,2,3] - a = dot(m, vec) - a -> 3 - """ - - def test_dot_matrix(self): - result = self.run("dot_matrix") - assert int(result) == 86 - self.check_vectorized(2, 1) - def define_float32_copy(): return """ a = astype(|30|, float32) @@ -916,6 +902,21 @@ # that iterates continous chunks of the matrix self.check_vectorized(1,1) + def define_dot_matrix(): + return """ + mat = |16| + m = reshape(mat, [4,4]) + vec = [0,1,2,3] + a = dot(m, vec) + a -> 3 + """ + + def test_dot_matrix(self): + result = self.run("dot_matrix") + assert int(result) == 86 + self.check_vectorized(2, 1) + + # NOT WORKING def define_pow(): diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py --- a/rpython/jit/backend/llgraph/runner.py +++ b/rpython/jit/backend/llgraph/runner.py @@ -1075,12 +1075,22 @@ def execute_guard_early_exit(self, descr): pass + def _check_true(self, arg): + if isinstance(arg, list): + return all(arg) + return arg + + def _check_false(self, arg): + if isinstance(arg, list): + return any(arg) + return arg + def execute_guard_true(self, descr, arg): - if not arg: + if not self._check_true(arg): self.fail_guard(descr) def execute_guard_false(self, descr, arg): - if arg: + if self._check_false(arg): self.fail_guard(descr) def execute_guard_value(self, descr, arg1, arg2): diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py --- a/rpython/jit/backend/llsupport/descr.py +++ b/rpython/jit/backend/llsupport/descr.py @@ -248,7 +248,7 @@ all_interiorfielddescrs = None concrete_type = '\x00' - def __init__(self, basesize, itemsize, lendescr, flag, concrete_type='\x00', is_pure=False): + def __init__(self, basesize, itemsize, lendescr, flag, is_pure=False, concrete_type='\x00'): self.basesize = basesize self.itemsize = itemsize self.lendescr = lendescr # or None, if no length @@ -339,13 +339,13 @@ descrs = heaptracker.all_interiorfielddescrs(gccache, ARRAY_INSIDE, get_field_descr=get_interiorfield_descr) arraydescr.all_interiorfielddescrs = descrs - concreate_type = '\x00' + concrete_type = '\x00' if ARRAY_INSIDE.OF is lltype.SingleFloat or \ ARRAY_INSIDE.OF is lltype.Float: # it would be better to set the flag as FLOAT_TYPE # for single float -> leads to problems - concrete_type = FLOAT - arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, concreate_type) + concrete_type = 'f' + arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, is_pure, concrete_type=concrete_type) if ARRAY_OR_STRUCT._gckind == 'gc': gccache.init_array_descr(ARRAY_OR_STRUCT, arraydescr) return arraydescr diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -1658,14 +1658,6 @@ self.mc.PUNPCKLDQ_xx(resloc.value, loc1.value) def genop_guard_guard_true(self, guard_op, guard_token, locs, resloc): - #loc = locs[0] - #if isinstance(loc, RegLoc): - # if loc.is_xmm: - # self._guard_vector_true(guard_op, loc) - # # XXX - # self.implement_guard(guard_token, 'NZ') - # return - #self.mc.TEST(loc, loc) self.implement_guard(guard_token) genop_guard_guard_nonnull = genop_guard_guard_true diff --git a/rpython/jit/backend/x86/vector_ext.py b/rpython/jit/backend/x86/vector_ext.py --- a/rpython/jit/backend/x86/vector_ext.py +++ b/rpython/jit/backend/x86/vector_ext.py @@ -43,9 +43,9 @@ self.mc.PBLENDW_xxi(loc.value, temp.value, select) def _guard_vector_true(self, guard_op, loc, zero=False): + return arg = guard_op.getarg(0) - assert isinstance(arg, BoxVector) - size = arg.item_size + size = arg.bytesize temp = X86_64_XMM_SCRATCH_REG # self.mc.PXOR(temp, temp) @@ -65,7 +65,6 @@ def _guard_vector_false(self, guard_op, loc): arg = guard_op.getarg(0) - assert isinstance(arg, BoxVector) # # if the vector is not fully packed blend 1s if not arg.fully_packed(self.cpu.vector_register_size): @@ -204,6 +203,17 @@ # a second time -> every zero entry (corresponding to non zero # entries before) become ones self.mc.PCMPEQ(loc, temp, sizeloc.value) + # TODO + #self.flush_cc(rx86.Conditions['NZ'], resloc) + #loc = locs[0] + #if isinstance(loc, RegLoc): + # if loc.is_xmm: + # self._guard_vector_true(guard_op, loc) + # # XXX + # self.implement_guard(guard_token, 'NZ') + # return + #self.mc.TEST(loc, loc) + def genop_guard_vec_int_is_true(self, op, guard_op, guard_token, arglocs, resloc): guard_opnum = guard_op.getopnum() @@ -618,11 +628,9 @@ def consider_vec_arith_unary(self, op): lhs = op.getarg(0) - assert isinstance(lhs, BoxVector) - size = lhs.item_size args = op.getarglist() res = self.xrm.force_result_in_reg(op, op.getarg(0), args) - self.perform(op, [res, imm(size)], res) + self.perform(op, [res, imm(lhs.bytesize)], res) consider_vec_float_neg = consider_vec_arith_unary consider_vec_float_abs = consider_vec_arith_unary @@ -637,15 +645,13 @@ def consider_vec_float_eq(self, op, guard_op): lhs = op.getarg(0) - assert isinstance(lhs, BoxVector) - size = lhs.item_size args = op.getarglist() lhsloc = self.xrm.force_result_in_reg(op, op.getarg(0), args) rhsloc = self.make_sure_var_in_reg(op.getarg(1), args) if guard_op: - self.perform_with_guard(op, guard_op, [lhsloc, rhsloc, imm(size)], None) + self.perform_with_guard(op, guard_op, [lhsloc, rhsloc, imm(lhs.bytesize)], None) else: - self.perform(op, [lhsloc, rhsloc, imm(size)], lhsloc) + self.perform(op, [lhsloc, rhsloc, imm(lhs.bytesize)], lhsloc) consider_vec_float_ne = consider_vec_float_eq consider_vec_int_eq = consider_vec_float_eq @@ -681,16 +687,14 @@ assert isinstance(count, ConstInt) args = op.getarglist() srcloc = self.make_sure_var_in_reg(op.getarg(0), args) - if isinstance(op.result, BoxVector): + if op.is_vector(): resloc = self.xrm.force_result_in_reg(op.result, op.getarg(0), args) - assert isinstance(op.result, BoxVector) - size = op.result.getsize() + size = op.bytesize else: # unpack into iX box resloc = self.force_allocate_reg(op.result, args) arg = op.getarg(0) - assert isinstance(arg, BoxVector) - size = arg.getsize() + size = arg.bytesize residx = 0 args = op.getarglist() arglocs = [resloc, srcloc, imm(residx), imm(index.value), imm(count.value), imm(size)] @@ -726,16 +730,13 @@ assert size > 0 self.perform(op, [resloc, imm(size), imm(op.bytesize)], resloc) - def consider_vec_int_is_true(self, op, guard_op): + def consider_vec_int_is_true(self, op): args = op.getarglist() - resloc = self.xrm.force_result_in_reg(op.result, op.getarg(0), args) - sizearg = op.getarg(0) - assert isinstance(sizearg, BoxVector) - size = sizearg.getsize() - if guard_op is not None: - self.perform_with_guard(op, guard_op, [resloc,imm(size)], None) - else: - self.perform(op, [resloc,imm(size)], None) + #resloc = self.xrm.force_result_in_reg(op, op.getarg(0), args) + arg = op.getarg(0) + argloc = self.loc(arg) + resloc = self.force_allocate_reg_or_cc(op) + self.perform(op, [resloc,imm(size)], None) def _consider_vec(self, op): # pseudo instruction, needed to create a new variable diff --git a/rpython/jit/metainterp/optimizeopt/version.py b/rpython/jit/metainterp/optimizeopt/version.py --- a/rpython/jit/metainterp/optimizeopt/version.py +++ b/rpython/jit/metainterp/optimizeopt/version.py @@ -32,7 +32,6 @@ self.descrs.append(descr) assert descr not in self.leads_to self.leads_to[descr] = version - assert version.renamed_inputargs is not None def remove(self, descr): if descr in self.leads_to: @@ -90,12 +89,11 @@ create one instance and attach it to a guard descr. If not attached to a descriptor, it will not be compiled. """ - _attrs_ = ('label', 'operations', 'inputargs', 'renamed_inputargs') + _attrs_ = ('label', 'loop', 'inputargs') def __init__(self, loop): self.loop = loop self.inputargs = loop.label.getarglist() - self.renamed_inputargs = loop.label.getarglist() def setup_once(self, info): for op in self.loop.operations: diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -28,10 +28,11 @@ _repr_memo = CountingDict() is_info_class = False namespace = None - _attrs_ = ('datatype', 'bytesize', 'signed') + _attrs_ = ('datatype', 'bytesize', 'signed', 'count') datatype = '\x00' bytesize = -1 # -1 means the biggest size known to the machine signed = True + count = -1 def _get_hash_(self): return compute_identity_hash(self) @@ -121,15 +122,18 @@ return if self.is_primitive_array_access(): + from rpython.jit.backend.llsupport.descr import ArrayDescr descr = self.getdescr() if not we_are_translated(): from rpython.jit.backend.llgraph.runner import _getdescr descr = _getdescr(self) type = self.type - if descr.is_array_of_floats() or descr.concrete_type == 'f': + if descr.is_array_of_floats(): + type = 'f' + if isinstance(descr, ArrayDescr) and descr.getconcrete_type() == 'f': type = 'f' self.bytesize = descr.get_item_size_in_bytes() - self.sign = descr.is_item_signed() + self.signed = descr.is_item_signed() self.datatype = type elif self.opnum == rop.INT_SIGNEXT: from rpython.jit.metainterp import history @@ -166,6 +170,8 @@ self.setdatatype('r', INT_WORD, False) return self.setdatatype(arg.datatype, arg.bytesize, arg.signed) + if self.returns_bool_result(): + self.datatype = 'i' assert self.datatype != '\x00' #assert self.bytesize > 0 @@ -209,7 +215,6 @@ boolinverse = -1 vector = -1 # -1 means, no vector equivalent, -2 it is a vector statement casts = ('\x00', -1, '\x00', -1, -1) - count = -1 def getopnum(self): return self.opnum diff --git a/rpython/jit/metainterp/test/test_vector.py b/rpython/jit/metainterp/test/test_vector.py --- a/rpython/jit/metainterp/test/test_vector.py +++ b/rpython/jit/metainterp/test/test_vector.py @@ -157,6 +157,38 @@ res = self.meta_interp(f, [30]) assert res == f(30) == 128 + @py.test.mark.parametrize('func,init,insert,at,count,breaks', + # all + [(lambda x: not bool(x), 1.0, None, -1,32, False), + (lambda x: x == 0.0, 1.0, None, -1,33, False), + (lambda x: x == 0.0, 1.0, 0.0, 33,34, True), + # any + (lambda x: x != 0.0, 0.0, 1.0, 33,35, True), + (lambda x: x != 0.0, 0.0, 1.0, -1,36, False), + (lambda x: bool(x), 0.0, 1.0, 33,37, True), + (lambda x: bool(x), 0.0, 1.0, -1,38, False), + ]) + def test_bool_reduction(self, func, init, insert, at, count, breaks): + myjitdriver = JitDriver(greens = [], reds = 'auto', vectorize=True) + T = lltype.Array(rffi.DOUBLE, hints={'nolength': True}) + def f(d): + va = lltype.malloc(T, d, flavor='raw', zero=True) + for i in range(d): va[i] = init + if at != -1: + va[at] = insert + i = 0 ; nobreak = False + while i < d: + myjitdriver.jit_merge_point() + if func(va[i]): + break + i += 1 + else: + nobreak = True + lltype.free(va, flavor='raw') + return not nobreak + res = self.meta_interp(f, [count]) + assert res == f(count) == breaks + def test_sum(self): myjitdriver = JitDriver(greens = [], reds = 'auto', vectorize=True) T = lltype.Array(rffi.DOUBLE, hints={'nolength': True}) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit