Author: Richard Plangger <r...@pasra.at> Branch: vecopt Changeset: r77799:95db7332c363 Date: 2015-06-03 08:53 +0200 http://bitbucket.org/pypy/pypy/changeset/95db7332c363/
Log: remember expansion (reduces register pressure if constant/variable is use more often). but not for heterogeneous expanded vectors, I don't think this happens frequently 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 @@ -108,6 +108,7 @@ v2[i64#2] = vec_int_pack(v1[i64#2], i0, 0, 1) v3[i64#2] = vec_int_pack(v2[i64#2], i1, 1, 1) v4[i64#2] = vec_int_expand(73) + # v5[i64#2] = vec_int_add(v3[i64#2], v4[i64#2]) """, False) self.assert_equal(loop2, loop3) @@ -123,6 +124,28 @@ v2[f64#2] = vec_float_pack(v1[f64#2], f0, 0, 1) v3[f64#2] = vec_float_pack(v2[f64#2], f1, 1, 1) v4[f64#2] = vec_float_expand(73.0) + # v5[f64#2] = vec_float_add(v3[f64#2], v4[f64#2]) """, False) self.assert_equal(loop2, loop3) + + def test_scalar_remember_expansion(self): + loop1 = self.parse(""" + f10 = float_add(f0, f5) + f11 = float_add(f1, f5) + f12 = float_add(f10, f5) + f13 = float_add(f11, f5) + """) + pack1 = self.pack(loop1, 0, 2) + pack2 = self.pack(loop1, 2, 4) + loop2 = self.schedule(loop1, [pack1, pack2], prepend_invariant=True) + loop3 = self.parse(""" + v1[f64#2] = vec_box(2) + v2[f64#2] = vec_float_pack(v1[f64#2], f0, 0, 1) + v3[f64#2] = vec_float_pack(v2[f64#2], f1, 1, 1) + v4[f64#2] = vec_float_expand(f5) # only expaned once + # + v5[f64#2] = vec_float_add(v3[f64#2], v4[f64#2]) + v6[f64#2] = vec_float_add(v5[f64#2], v4[f64#2]) + """, False) + self.assert_equal(loop2, loop3) 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 @@ -1052,11 +1052,17 @@ def expand(self, nodes, arg, argidx): vbox = self.input_type.new_vector_box(len(nodes)) box_type = arg.type + expanded_map = self.sched_data.expanded_map invariant_ops = self.sched_data.invariant_oplist invariant_vars = self.sched_data.invariant_vector_vars if isinstance(arg, BoxVector): box_type = arg.item_type + # note that heterogenous nodes are not yet tracked + already_expanded = expanded_map.get(arg, None) + if already_expanded: + return already_expanded + for i, node in enumerate(nodes): op = node.getoperation() if not arg.same_box(op.getarg(argidx)): @@ -1069,6 +1075,7 @@ op = ResOperation(expand_opnum, [arg], vbox) invariant_ops.append(op) invariant_vars.append(vbox) + expanded_map[arg] = vbox return vbox op = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox) @@ -1085,6 +1092,7 @@ op = ResOperation(opnum, [vbox,arg,ci,c1], new_box) vbox = new_box invariant_ops.append(op) + invariant_vars.append(vbox) return vbox @@ -1239,6 +1247,7 @@ self.vec_reg_size = vec_reg_size self.invariant_oplist = [] self.invariant_vector_vars = [] + self.expanded_map = {} def as_vector_operation(self, pack): op_count = len(pack.operations) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit