Author: Richard Plangger <r...@pasra.at> Branch: vecopt Changeset: r78342:b785c8f713af Date: 2015-06-29 10:49 +0200 http://bitbucket.org/pypy/pypy/changeset/b785c8f713af/
Log: rpython translation issues, adding reshape operation to zjit tests diff --git a/pypy/module/micronumpy/compile.py b/pypy/module/micronumpy/compile.py --- a/pypy/module/micronumpy/compile.py +++ b/pypy/module/micronumpy/compile.py @@ -37,12 +37,20 @@ class BadToken(Exception): pass +class FakeArguments(W_Root): + def __init__(self, args_w, kw_w): + self.args_w = args_w + self.kw_w = kw_w + + def unpack(self): + return self.args_w, self.kw_w + SINGLE_ARG_FUNCTIONS = ["sum", "prod", "max", "min", "all", "any", "unegative", "flat", "tostring", "count_nonzero", "argsort", "cumsum", "logical_xor_reduce"] -TWO_ARG_FUNCTIONS = ["dot", 'take', 'searchsorted'] -TWO_ARG_FUNCTIONS_OR_NONE = ['view', 'astype'] +TWO_ARG_FUNCTIONS = ["dot", 'multiply', 'take', 'searchsorted'] +TWO_ARG_FUNCTIONS_OR_NONE = ['view', 'astype', 'reshape'] THREE_ARG_FUNCTIONS = ['where'] class W_TypeObject(W_Root): @@ -779,6 +787,8 @@ raise ArgumentNotAnArray if self.name == "dot": w_res = arr.descr_dot(interp.space, arg) + if self.name == "multiply": + w_res = arr.descr_mul(interp.space, arg) elif self.name == 'take': w_res = arr.descr_take(interp.space, arg) elif self.name == "searchsorted": @@ -807,8 +817,12 @@ w_res = arr.descr_view(interp.space, arg) elif self.name == 'astype': w_res = arr.descr_astype(interp.space, arg) + elif self.name == 'reshape': + w_arg = self.args[1] + assert isinstance(w_arg, ArrayConstant) + w_res = arr.reshape(interp.space, w_arg.wrap(interp.space)) else: - assert False + assert False, "missing two arg impl for: %s" % (self.name,) else: raise WrongFunctionName if isinstance(w_res, W_NDimArray): 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,6 +118,17 @@ retval = self.interp.eval_graph(self.graph, [i]) return retval + def define_matrix_dot(): + return """ + mat = |16| + m = reshape(mat, [4,4]) + """ + + def test_matrix_dot(self): + result = self.run("matrix_dot") + assert int(result) == 45 + self.check_vectorized(1, 1) + def define_float32_copy(): return """ a = astype(|30|, float32) @@ -387,7 +398,7 @@ def test_sum_int(self): result = self.run("sum_int") assert result == sum(range(65)) - self.check_vectorized(2, 2) # 1 vecopt try+success for type conversion + self.check_vectorized(2, 2) # 1 sum, 1 for type conversion def define_sum_multi(): return """ 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 @@ -1670,12 +1670,13 @@ def genop_guard_guard_true(self, ign_1, guard_op, guard_token, locs, ign_2): loc = locs[0] - if loc.is_xmm: - self._guard_vector_true(guard_op, loc) - self.implement_guard(guard_token, 'NZ') - else: - self.mc.TEST(loc, loc) - self.implement_guard(guard_token, 'Z') + if isinstance(loc, RegLoc): + if loc.is_xmm: + self._guard_vector_true(guard_op, loc) + self.implement_guard(guard_token, 'NZ') + return + self.mc.TEST(loc, loc) + self.implement_guard(guard_token, 'Z') genop_guard_guard_nonnull = genop_guard_guard_true def genop_guard_guard_no_exception(self, ign_1, guard_op, guard_token, @@ -1770,12 +1771,13 @@ def genop_guard_guard_false(self, ign_1, guard_op, guard_token, locs, ign_2): loc = locs[0] - if loc.is_xmm: - self._guard_vector_false(guard_op, loc) - self.implement_guard(guard_token, 'NZ') - else: - self.mc.TEST(loc, loc) - self.implement_guard(guard_token, 'NZ') + if isinstance(loc, RegLoc): + if loc.is_xmm: + self._guard_vector_false(guard_op, loc) + self.implement_guard(guard_token, 'NZ') + return + self.mc.TEST(loc, loc) + self.implement_guard(guard_token, 'NZ') genop_guard_guard_isnull = genop_guard_guard_false def genop_guard_guard_value(self, ign_1, guard_op, guard_token, locs, ign_2): diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py --- a/rpython/jit/backend/x86/regalloc.py +++ b/rpython/jit/backend/x86/regalloc.py @@ -393,7 +393,6 @@ def _consider_guard_tf(self, op): arg = op.getarg(0) if arg.type == VECTOR: - assert arg.item_type == INT loc = self.xrm.make_sure_var_in_reg(arg) else: loc = self.rm.make_sure_var_in_reg(arg) diff --git a/rpython/jit/backend/x86/regloc.py b/rpython/jit/backend/x86/regloc.py --- a/rpython/jit/backend/x86/regloc.py +++ b/rpython/jit/backend/x86/regloc.py @@ -607,19 +607,18 @@ _rx86_getattr(self, methname)(val1, val2) invoke._annspecialcase_ = 'specialize:arg(1)' + possible_instr_unrolled = unrolling_iterable([(1,'B_xx'),(2,'W_xx'),(4,'D_xx'),(8,'Q_xx')]) + def INSN(self, size, loc1, loc2): code1 = loc1.location_code() code2 = loc2.location_code() - val1 = getattr(loc1, "value_" + code1)() - val2 = getattr(loc2, "value_" + code2)() - suffix = 'B' - if size == 2: - suffix = 'W' - elif size == 4: - suffix = 'D' - else: - suffix = 'Q' - invoke(self, suffix + "_"+ code1+code2, val1, val2) + assert code1 == code2 == 'x' + val1 = loc1.value_x() + val2 = loc2.value_x() + for s,suffix in possible_instr_unrolled: + if s == size: + invoke(self, suffix, val1, val2) + break return INSN diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py --- a/rpython/jit/metainterp/optimizeopt/schedule.py +++ b/rpython/jit/metainterp/optimizeopt/schedule.py @@ -113,13 +113,13 @@ def vectorbox_clone_set(box, count=-1, size=-1, type='-', clone_signed=True, signed=False): if count == -1: - count = box.item_count + count = box.getcount() if size == -1: - size = box.item_size + size = box.getsize() if type == '-': - type = box.item_type + type = box.gettype() if clone_signed: - signed = box.item_signed + signed = box.getsigned() return BoxVector(type, count, size, signed) def getpackopnum(type): @@ -156,8 +156,8 @@ def of(box, count=-1): assert isinstance(box, BoxVector) if count == -1: - count = box.item_count - return PackType(box.item_type, box.item_size, box.item_signed, count) + count = box.getcount() + return PackType(box.gettype(), box.getsize(), box.getsigned(), count) @staticmethod def by_descr(descr, vec_reg_size): @@ -295,6 +295,7 @@ vop = ResOperation(op.vector, args, result, op.getdescr()) if op.is_guard(): assert isinstance(op, GuardResOp) + assert isinstance(vop, GuardResOp) vop.setfailargs(op.getfailargs()) vop.rd_snapshot = op.rd_snapshot self.preamble_ops.append(vop) @@ -307,7 +308,7 @@ # # mark the position and the vbox in the hash for i, node in enumerate(self.getoperations()): - if i >= vbox.item_count: + if i >= vbox.getcount(): break op = node.getoperation() self.sched_data.setvector_of_box(op.result, i, vbox) @@ -342,7 +343,7 @@ # use the input as an indicator for the pack type packable = self.input_type.getcount() - packed = vbox.item_count + packed = vbox.getcount() assert packed >= 0 assert packable >= 0 if packed > packable: @@ -394,7 +395,7 @@ def update_arg_in_vector_pos(self, argidx, box): arguments = [op.getoperation().getarg(argidx) for op in self.getoperations()] for i,arg in enumerate(arguments): - if i >= box.item_count: + if i >= box.getcount(): break self.sched_data.setvector_of_box(arg, i, box) @@ -418,7 +419,7 @@ raise NotImplementedError("cannot yet extend float") def extend_int(self, vbox, newtype): - vbox_cloned = newtype.new_vector_box(vbox.item_count) + vbox_cloned = newtype.new_vector_box(vbox.getcount()) self.sched_data._prevent_signext(newtype.getsize(), vbox.getsize()) newsize = newtype.getsize() assert newsize > 0 @@ -430,11 +431,11 @@ return vbox_cloned def unpack(self, vbox, index, count, arg_ptype): - assert index < vbox.item_count - assert index + count <= vbox.item_count + assert index < vbox.getcount() + assert index + count <= vbox.getcount() assert count > 0 vbox_cloned = vectorbox_clone_set(vbox, count=count) - opnum = getunpackopnum(vbox.item_type) + opnum = getunpackopnum(vbox.gettype()) op = ResOperation(opnum, [vbox, ConstInt(index), ConstInt(count)], vbox_cloned) self.costmodel.record_vector_unpack(vbox, index, count) self.preamble_ops.append(op) @@ -447,9 +448,9 @@ new_box = [1,2,3,4,5,6,_,_] after the operation, tidx=4, scount=2 """ assert sidx == 0 # restriction - count = tgt.item_count + src.item_count + count = tgt.getcount() + src.getcount() new_box = vectorbox_clone_set(tgt, count=count) - opnum = getpackopnum(tgt.item_type) + opnum = getpackopnum(tgt.gettype()) op = ResOperation(opnum, [tgt, src, ConstInt(tidx), ConstInt(scount)], new_box) self.preamble_ops.append(op) self.costmodel.record_vector_pack(src, sidx, scount) @@ -467,14 +468,14 @@ assert isinstance(arg0, BoxVector) assert isinstance(index, ConstInt) assert isinstance(count, ConstInt) - assert arg0.item_size == result.item_size + assert arg0.getsize() == result.getsize() if isinstance(arg1, BoxVector): - assert arg1.item_size == result.item_size + assert arg1.getsize() == result.getsize() else: assert count.value == 1 - assert index.value < result.item_count - assert index.value + count.value <= result.item_count - assert result.item_count > arg0.item_count + assert index.value < result.getcount() + assert index.value + count.value <= result.getcount() + assert result.getcount() > arg0.getcount() def expand(self, arg, argidx): elem_count = self.input_type.getcount() @@ -484,7 +485,7 @@ invariant_ops = self.sched_data.invariant_oplist invariant_vars = self.sched_data.invariant_vector_vars if isinstance(arg, BoxVector): - box_type = arg.item_type + box_type = arg.gettype() # note that heterogenous nodes are not yet tracked already_expanded = expanded_map.get(arg, None) @@ -830,7 +831,7 @@ return self.box_to_vbox.get(arg, (-1, None)) def setvector_of_box(self, box, off, vector): - assert off < vector.item_count + assert off < vector.getcount() self.box_to_vbox[box] = (off, vector) def prepend_invariant_operations(self, oplist): 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 @@ -1357,18 +1357,18 @@ def test_abc(self): trace=""" - [p0, p9, i10, p7, i11, p2, p4, p5, p12, i13, i14, i15, i16, i17, i18] - guard_early_exit(descr=<rpython.jit.metainterp.compile.ResumeAtLoopHeaderDescr object at 0x7f8a20c32090>) [p7, p5, p4, p2, p0, i10, i13, p9, p12, i11, i14] - i19 = raw_load(i15, i14, descr=int16arraydescr) - i21 = int_add(i14, 2) - i22 = int_add(i19, i16) - i24 = int_signext(i22, 2) - raw_store(i17, i11, i24, descr=int16arraydescr) - i26 = int_add(i10, 1) - i28 = int_add(i11, 2) - i29 = int_ge(i26, i18) - guard_false(i29, descr=<rpython.jit.metainterp.compile.ResumeGuardFalseDescr object at 0x7f8a20c32990>) [p7, p5, p4, p2, p0, i21, i28, i26, None, i13, p9, p12, None, None] - jump(p0, p9, i26, p7, i28, p2, p4, p5, p12, i13, i21, i15, i16, i17, i18) + # int32 sum + label(p0, p19, i18, i24, i14, i8, i25, descr=TargetToken(140320937897104)) + guard_early_exit(descr=<Guard0x7f9f03ab6310>) [p0, p19, i18, i14, i24] + i27 = raw_load(i8, i24, descr=<ArrayS 4>) + guard_not_invalidated(descr=<Guard0x7f9f03af5050>) [p0, i27, p19, i18, i14, i24] + i28 = int_add(i14, i27) + i29 = int_signext(i28, 4) + i30 = int_add(i18, 1) + i31 = int_add(i24, 4) + i32 = int_ge(i30, i25) + guard_false(i32, descr=<Guard0x7f9f03ab17d0>) [p0, i29, i30, i31, p19, None, None, None] + jump(p0, p19, i30, i31, i29, i8, i25, descr=TargetToken(140320937897104)) """ # schedule 885 -> ptype is non for raw_load? opt = self.vectorize(self.parse_loop(trace)) diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py --- a/rpython/jit/metainterp/optimizeopt/vectorize.py +++ b/rpython/jit/metainterp/optimizeopt/vectorize.py @@ -509,7 +509,7 @@ renamer.start_renaming(arg, arg_cloned) cj = ConstInt(j) ci = ConstInt(1) - opnum = getunpackopnum(vbox.item_type) + opnum = getunpackopnum(vbox.gettype()) unpack_op = ResOperation(opnum, [vbox, cj, ci], arg_cloned) self.costmodel.record_vector_unpack(vbox, j, 1) self.emit_operation(unpack_op) @@ -833,7 +833,7 @@ box = result result = BoxVectorAccum(box, accum.var, '+') # pack the scalar value - op = ResOperation(getpackopnum(box.item_type), + op = ResOperation(getpackopnum(box.gettype()), [box, accum.var, ConstInt(0), ConstInt(1)], result) sched_data.invariant_oplist.append(op) # rename the variable with the box _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit