Author: Richard Plangger <r...@pasra.at> Branch: vecopt Changeset: r77760:692b8f945d3a Date: 2015-06-02 15:19 +0200 http://bitbucket.org/pypy/pypy/changeset/692b8f945d3a/
Log: expanding variables/constants are not inlined before the instruction but gathered in another list to be prepended to the label operation diff --git a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py --- a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py @@ -39,7 +39,7 @@ def pack(self, loop, l, r): return [Node(op,1+l+i) for i,op in enumerate(loop.operations[1+l:1+r])] - def schedule(self, loop_orig, packs, vec_reg_size=16): + def schedule(self, loop_orig, packs, vec_reg_size=16, prepend_invariant=False): loop = get_model(False).ExtendedTreeLoop("loop") loop.original_jitcell_token = loop_orig.original_jitcell_token loop.inputargs = loop_orig.inputargs @@ -53,6 +53,8 @@ for op in vsd.as_vector_operation(Pack(pack)): ops.append(op) loop.operations = ops + if prepend_invariant: + loop.operations = vsd.invariant_oplist + ops return loop def assert_operations_match(self, loop_a, loop_b): @@ -100,7 +102,7 @@ i11 = int_add(i1, 73) """) pack1 = self.pack(loop1, 0, 2) - loop2 = self.schedule(loop1, [pack1]) + loop2 = self.schedule(loop1, [pack1], prepend_invariant=True) loop3 = self.parse(""" v1[i64#2] = vec_box(2) v2[i64#2] = vec_int_pack(v1[i64#2], i0, 0, 1) @@ -115,7 +117,7 @@ f11 = float_add(f1, 73.0) """) pack1 = self.pack(loop1, 0, 2) - loop2 = self.schedule(loop1, [pack1]) + loop2 = self.schedule(loop1, [pack1], prepend_invariant=True) loop3 = self.parse(""" v1[f64#2] = vec_box(2) v2[f64#2] = vec_float_pack(v1[f64#2], f0, 0, 1) 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 @@ -941,8 +941,7 @@ box_pos, vbox = self.sched_data.getvector_of_box(arg) if not vbox: # constant/variable expand this box - vbox = self.input_type.new_vector_box(len(ops)) - vbox = self.expand_box_to_vector_box(vbox, ops, arg, argidx) + vbox = self.expand(ops, arg, argidx) box_pos = 0 # use the input as an indicator for the pack type @@ -1049,39 +1048,43 @@ assert index.value + count.value <= result.item_count assert result.item_count > arg0.item_count - def expand_box_to_vector_box(self, vbox, nodes, arg, argidx): - all_same_box = True + def expand(self, nodes, arg, argidx): + vbox = self.input_type.new_vector_box(len(nodes)) + box_type = arg.type + invariant_ops = self.sched_data.invariant_oplist + invariant_vars = self.sched_data.invariant_vector_vars + if isinstance(arg, BoxVector): + box_type = arg.item_type + for i, node in enumerate(nodes): op = node.getoperation() if not arg.same_box(op.getarg(argidx)): - all_same_box = False break i += 1 + else: + expand_opnum = rop.VEC_FLOAT_EXPAND + if box_type == INT: + expand_opnum = rop.VEC_INT_EXPAND + op = ResOperation(expand_opnum, [arg], vbox) + invariant_ops.append(op) + invariant_vars.append(vbox) + return vbox - box_type = arg.type - if isinstance(arg, BoxVector): - box_type = arg.item_type - expand_opnum = rop.VEC_FLOAT_EXPAND - if box_type == INT: - expand_opnum = rop.VEC_INT_EXPAND - - if all_same_box: - expand_op = ResOperation(expand_opnum, [arg], vbox) - self.preamble_ops.append(expand_op) - else: - resop = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox) - self.preamble_ops.append(resop) - opnum = rop.VEC_FLOAT_PACK - if arg.type == INT: - opnum = rop.VEC_INT_PACK - for i,node in enumerate(nodes): - op = node.getoperation() - arg = op.getarg(argidx) - new_box = vbox.clonebox() - resop = ResOperation(opnum, - [vbox,arg,ConstInt(i),ConstInt(1)], new_box) - vbox = new_box - self.preamble_ops.append(resop) + op = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox) + invariant_ops.append(op) + opnum = rop.VEC_FLOAT_PACK + if arg.type == INT: + opnum = rop.VEC_INT_PACK + for i,node in enumerate(nodes): + op = node.getoperation() + arg = op.getarg(argidx) + new_box = vbox.clonebox() + ci = ConstInt(i) + c1 = ConstInt(1) + op = ResOperation(opnum, [vbox,arg,ci,c1], new_box) + vbox = new_box + invariant_ops.append(op) + invariant_vars.append(vbox) return vbox class OpToVectorOpConv(OpToVectorOp): @@ -1232,9 +1235,9 @@ class VecScheduleData(SchedulerData): def __init__(self, vec_reg_size): self.box_to_vbox = {} - self.preamble_ops = None - self.expansion_byte_count = -1 self.vec_reg_size = vec_reg_size + self.invariant_oplist = [] + self.invariant_vector_vars = [] def as_vector_operation(self, pack): op_count = len(pack.operations) @@ -1247,7 +1250,7 @@ op0 = pack.operations[0].getoperation() tovector = ROP_ARG_RES_VECTOR.get(op0.vector, None) if tovector is None: - raise NotImplementedError("missing vecop for '" + op0.getopname() + "'") + raise NotImplementedError("missing vecop for '%s'" % (op0.getopname(),)) oplist = [] tovector.as_vector_operation(pack, self, oplist) return oplist _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit