Author: Richard Plangger <r...@pasra.at> Branch: vecopt Changeset: r77655:f9c2fe944393 Date: 2015-05-28 15:50 +0200 http://bitbucket.org/pypy/pypy/changeset/f9c2fe944393/
Log: correctly emitting normal guards not subject of the strengh opt copying failargs, descr and frame info on strength opt added some traces to test_vectorize 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 @@ -347,7 +347,6 @@ """ def test_reduce_compile_only_once(self): - py.test.skip('TODO') self.compile_graph() reset_jit() i = self.code_mapping['reduce'] @@ -358,7 +357,6 @@ assert len(get_stats().loops) == 1 def test_reduce_axis_compile_only_once(self): - py.test.skip('TODO') self.compile_graph() reset_jit() i = self.code_mapping['axissum'] @@ -375,22 +373,12 @@ """ def test_prod(self): - py.test.skip('TODO') result = self.run("prod") expected = 1 for i in range(30): expected *= i * 2 assert result == expected self.check_trace_count(1) - self.check_simple_loop({ - 'float_mul': 1, - 'guard_false': 1, - 'guard_not_invalidated': 1, - 'int_add': 2, - 'int_ge': 1, - 'jump': 1, - 'raw_load': 1, - }) def define_max(): return """ @@ -400,38 +388,9 @@ """ def test_max(self): - py.test.skip('TODO') result = self.run("max") assert result == 128 self.check_trace_count(3) - self.check_simple_loop({ - 'float_ge': 1, - 'float_ne': 1, - 'guard_false': 3, - 'guard_not_invalidated': 1, - 'int_add': 2, - 'int_ge': 1, - 'jump': 1, - 'raw_load': 1, - }) - self.check_resops({ - 'float_ge': 2, - 'float_ne': 2, - 'getfield_gc': 4, - 'getfield_gc_pure': 30, - 'guard_class': 1, - 'guard_false': 8, - 'guard_nonnull': 2, - 'guard_nonnull_class': 2, - 'guard_not_invalidated': 2, - 'guard_true': 7, - 'guard_value': 2, - 'int_add': 8, - 'int_ge': 4, - 'int_is_true': 3, - 'jump': 3, - 'raw_load': 2, - }) def define_min(): return """ @@ -441,20 +400,9 @@ """ def test_min(self): - py.test.skip('TODO') result = self.run("min") assert result == -128 self.check_trace_count(1) - self.check_simple_loop({ - 'float_le': 1, - 'guard_false': 1, - 'guard_not_invalidated': 1, - 'guard_true': 1, - 'int_add': 2, - 'int_ge': 1, - 'jump': 1, - 'raw_load': 1, - }) def define_any(): return """ 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 @@ -1278,6 +1278,25 @@ opt = self.vectorize(self.parse_loop(trace)) self.debug_print_operations(opt.loop) + def test_max(self): + trace = """ + [p3, i4, p2, i5, f6, i7, i8] + guard_early_exit() [p2, f6, i4, i5, p3] + f9 = raw_load(i7, i5, descr=floatarraydescr) + guard_not_invalidated() [p2, f9, f6, i4, i5, p3] + i10 = float_ge(f6, f9) + guard_false(i10) [p2, f9, f6, None, i4, i5, p3] + i12 = float_ne(f6, f6) + guard_false(i12) [p2, f9, f6, None, i4, i5, p3] + i14 = int_add(i4, 1) + i16 = int_add(i5, 8) + i17 = int_ge(i14, i8) + guard_false(i17) [p2, i16, f9, i14, None, None, None, p3] + jump(p3, i14, p2, i16, f9, i7, i8) + """ + opt = self.vectorize(self.parse_loop(trace)) + self.debug_print_operations(opt.loop) + def test_reduction_basic(self): trace = """ [p5, i6, p2, i7, p1, p8, i9, i10, f11, i12, i13, i14] 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 @@ -35,10 +35,7 @@ for i,op in enumerate(loop.operations): print "[",str(i).center(2," "),"]",op, if op.is_guard(): - if op.rd_snapshot is not None: - print ps(op.rd_snapshot) - else: - print op.getfailargs() + print op.getfailargs() else: print "" @@ -356,13 +353,14 @@ self.clear_newoperations() sched_data = VecScheduleData(self.metainterp_sd.cpu.vector_register_size) scheduler = Scheduler(self.dependency_graph, sched_data) + renamer = Renamer() while scheduler.has_more(): position = len(self._newoperations) ops = scheduler.next(position) for op in ops: if self.tried_to_pack: - self.unpack_from_vector(op, sched_data) - self.emit_operation(op) + self.unpack_from_vector(op, sched_data, renamer) + self.emit_operation(op), op.getfailargs() if not we_are_translated(): for node in self.dependency_graph.nodes: @@ -370,26 +368,27 @@ self.loop.operations = self._newoperations[:] self.clear_newoperations() - def unpack_from_vector(self, op, sched_data): + def unpack_from_vector(self, op, sched_data, renamer): + renamer.rename(op) args = op.getarglist() for i, arg in enumerate(op.getarglist()): if isinstance(arg, Box): - argument = self._unpack_from_vector(i, arg, sched_data) + argument = self._unpack_from_vector(i, arg, sched_data, renamer) if arg is not argument: op.setarg(i, argument) if op.is_guard(): fail_args = op.getfailargs() for i, arg in enumerate(fail_args): if arg and isinstance(arg, Box): - argument = self._unpack_from_vector(i, arg, sched_data) + argument = self._unpack_from_vector(i, arg, sched_data, renamer) if arg is not argument: fail_args[i] = argument - def _unpack_from_vector(self, i, arg, sched_data): - arg = sched_data.unpack_rename(arg) + def _unpack_from_vector(self, i, arg, sched_data, renamer): (j, vbox) = sched_data.box_to_vbox.get(arg, (-1, None)) if vbox: arg_cloned = arg.clonebox() + renamer.start_renaming(arg, arg_cloned) cj = ConstInt(j) ci = ConstInt(1) opnum = rop.VEC_FLOAT_UNPACK @@ -397,8 +396,7 @@ opnum = rop.VEC_INT_UNPACK unpack_op = ResOperation(opnum, [vbox, cj, ci], arg_cloned) self.emit_operation(unpack_op) - sched_data.rename_unpacked(arg, arg_cloned) - arg = arg_cloned + return arg_cloned return arg def analyse_index_calculations(self): @@ -665,16 +663,26 @@ guard = Guard(i, op, cmp_op, lhs, lhs_arg, rhs, rhs_arg) if guard.implies(other, self): + op.setfailargs(other.op.getfailargs()) + op.setdescr(other.op.getdescr()) + op.rd_frame_info_list = other.op.rd_frame_info_list + op.rd_snapshot = other.op.rd_snapshot + strongest_guards[key] = guard guard.stronger = True guard.index = other.index guards[other.index] = guard + # do not mark as emit continue elif other.implies(guard, self): guard.implied = True # mark as emit guards[i] = guard + else: + # emit non guard_true/false guards + guards[i] = Guard(i, op, None, None, None, None, None) + strongest_guards = None # self.renamer = Renamer() @@ -703,7 +711,6 @@ self.renamer.rename(op) self._newoperations.append(op) - def must_unpack_result_to_exec(op, target_op): # TODO either move to resop or util if op.getoperation().vector != -1: @@ -1106,17 +1113,10 @@ class VecScheduleData(SchedulerData): def __init__(self, vec_reg_size): self.box_to_vbox = {} - self.unpack_rename_map = {} self.preamble_ops = None self.expansion_byte_count = -1 self.vec_reg_size = vec_reg_size - def unpack_rename(self, arg): - return self.unpack_rename_map.get(arg, arg) - - def rename_unpacked(self, arg, argdest): - self.unpack_rename_map[arg] = argdest - def as_vector_operation(self, pack): op_count = len(pack.operations) assert op_count > 1 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit