Author: Richard Plangger <r...@pasra.at> Branch: vecopt Changeset: r77986:f7b571afa033 Date: 2015-06-09 11:53 +0200 http://bitbucket.org/pypy/pypy/changeset/f7b571afa033/
Log: in the case #pack > 2 the accum is not split 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 @@ -312,7 +312,7 @@ return None def __repr__(self): - return "Node(opidx: %d)"%self.opidx + return "Node(opidx: %d)" % self.opidx def __ne__(self, other): return not self.__eq__(other) 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 @@ -107,7 +107,7 @@ return PackType(INT, 8, True, 2) elif box.type == FLOAT: return PackType(FLOAT, 8, False, 2) - + # raise AssertionError("box %s not supported" % (box,)) def vectorbox_clone_set(box, count=-1, size=-1, type='-', clone_signed=True, signed=False): @@ -695,9 +695,21 @@ assert isinstance(other, Pack) rightmost = self.operations[-1] leftmost = other.operations[0] - return rightmost == leftmost and \ - self.accum_variable == other.accum_variable and \ - self.accum_position == other.accum_position + # if it is not accumulating it is valid + accum = True + if self.is_accumulating(): + if not other.is_accumulating(): + accum = False + elif self.accum_position != other.accum_position: + accum = False + # aa + #else: + # i = self.accum_position + # lop = leftmost.getoperation() + # roper = rightmost.getoperation() + # if lop.getarg(i) is not roper.result: + # accum = False + return rightmost is leftmost and accum def __repr__(self): return "Pack(%r)" % self.operations diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py --- a/rpython/jit/metainterp/optimizeopt/test/test_util.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py @@ -156,6 +156,7 @@ floatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Float)) intarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed)) int32arraydescr = cpu.arraydescrof(lltype.GcArray(rffi.INT)) + int16arraydescr = cpu.arraydescrof(lltype.GcArray(rffi.SHORT)) uintarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Unsigned)) chararraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Char)) singlefloatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.SingleFloat)) 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 @@ -1069,6 +1069,25 @@ assert opt.loop.inputargs[2] in opt.packset.accum_vars self.debug_print_operations(opt.loop) + def test_accumulate_int16(self): + trace = """ + [p3, i4, p1, i5, i6, i7, i8] + guard_early_exit() [p1, i4, i5, i6, p3] + i9 = raw_load(i7, i5, descr=int16arraydescr) + guard_not_invalidated() [p1, i9, i4, i5, i6, p3] + i10 = int_add(i6, i9) + i12 = int_add(i4, 1) + i14 = int_add(i5, 2) + i15 = int_ge(i12, i8) + guard_false(i15) [p1, i14, i10, i12, None, None, None, p3] + jump(p3, i12, p1, i14, i10, i7, i8) + """ + opt = self.vectorize(self.parse_loop(trace)) + assert len(opt.packset.packs) == 2 + assert len(opt.packset.accum_vars) == 1 + assert opt.loop.inputargs[4] in opt.packset.accum_vars + self.debug_print_operations(opt.loop) + def test_element_f45_in_guard_failargs(self): ops = """ 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 @@ -354,6 +354,15 @@ if len_before == len(self.packset.packs): break + if not we_are_translated(): + # some test cases check the accumulation variables + self.packset.accum_vars = {} + for pack in self.packset.packs: + var = pack.accum_variable + pos = pack.accum_position + if var: + self.packset.accum_vars[var] = pos + def schedule(self, vector=False): self.guard_early_exit = -1 self.clear_newoperations() @@ -523,15 +532,11 @@ self.operations = operations self.unroll_count = unroll_count self.smallest_type_bytes = smallest_type_bytes - self.accum_vars = {} def pack_count(self): return len(self.packs) def add_pack(self, pack): - if pack.is_accumulating(): - # remember the variable and the position in this map - self.accum_vars[pack.accum_variable] = pack.accum_variable self.packs.append(pack) def can_be_packed(self, lnode, rnode, origin_pack): @@ -586,6 +591,9 @@ for op in pack_j.operations[1:]: operations.append(op) self.packs[i] = pack = Pack(operations) + # preserve the accum variable (if present) of the + # left most pack, that is the pack with the earliest + # operation at index 0 in the trace pack.accum_variable = pack_i.accum_variable pack.accum_position = pack_i.accum_position @@ -645,7 +653,11 @@ return None, -1 def accumulate_prepare(self, sched_data, renamer): - for var, pos in self.accum_vars.items(): + for pack in self.packs: + if pack.accum_variable is None: + continue + var = pack.accum_variable + pos = pack.accum_position # create a new vector box for the parameters box = vectorbox_outof_box(var) op = ResOperation(rop.VEC_BOX, [ConstInt(0)], box) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit