Author: Richard Plangger <r...@pasra.at> Branch: vecopt2 Changeset: r77080:236a9b21cf32 Date: 2015-03-16 14:15 +0100 http://bitbucket.org/pypy/pypy/changeset/236a9b21cf32/
Log: debug_merge_points are not unrolled, but only prepended & appended 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 @@ -532,6 +532,17 @@ self.assert_memory_ref_not_adjacent(mref, mref2) assert mref != mref2 + def test_do_not_unroll_debug_merge_point(self): + ops = """ + [] + debug_merge_point(0, 0, 'loc 1') + debug_merge_point(0, 0, 'loc 1') + jump() + """ + loop = self.parse_loop(ops) + vopt = self.vec_optimizer_unrolled(loop,2) + self.assert_equal(loop, self.parse_loop(ops)) + class TestLLtype(BaseTestDependencyGraph, LLtypeMixin): pass 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 @@ -30,13 +30,22 @@ def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations): Optimizer.__init__(self, metainterp_sd, jitdriver_sd, loop, optimizations) - self.vec_info = LoopVectorizeInfo() + self.vec_info = LoopVectorizeInfo(self) self.memory_refs = [] self.dependency_graph = None + self.first_debug_merge_point = False + self.last_debug_merge_point = None def emit_unrolled_operation(self, op): + if op.getopnum() == rop.DEBUG_MERGE_POINT: + self.last_debug_merge_point = op + if not self.first_debug_merge_point: + self.first_debug_merge_point = True + else: + return False self._last_emitted_op = op self._newoperations.append(op) + return True def _rename_arguments_ssa(self, rename_map, label_args, jump_args): # fill the map with the renaming boxes. keys are boxes from the label @@ -50,27 +59,29 @@ rename_map[la] = ja def unroll_loop_iterations(self, loop, unroll_factor): + op_count = len(loop.operations) + label_op = loop.operations[0] - jump_op = loop.operations[-1] + jump_op = loop.operations[op_count-1] + + self.vec_info.track_memory_refs = True + + self.emit_unrolled_operation(label_op) # TODO use the new optimizer structure (branch of fijal currently) label_op_args = [self.getvalue(box).get_key_box() for box in label_op.getarglist()] values = [self.getvalue(box) for box in label_op.getarglist()] operations = [] - self.emit_unrolled_operation(label_op) - - for i in range(1,len(loop.operations)-1): + for i in range(1,op_count-1): op = loop.operations[i].clone() operations.append(op) self.emit_unrolled_operation(op) - - op_index = len(operations) + 1 - + self.vec_info.inspect_operation(op) jump_op_args = jump_op.getarglist() rename_map = {} - for unroll_i in range(2, unroll_factor+1): + for i in range(2, unroll_factor+1): # for each unrolling factor the boxes are renamed. self._rename_arguments_ssa(rename_map, label_op_args, jump_op_args) for op in operations: @@ -91,9 +102,7 @@ except KeyError: pass - self.vec_info._op_index = op_index self.emit_unrolled_operation(copied_op) - op_index += 1 self.vec_info.inspect_operation(copied_op) # the jump arguments have been changed @@ -110,11 +119,14 @@ # map will be rebuilt, the jump operation has been updated already rename_map.clear() + if self.last_debug_merge_point is not None: + self._last_emitted_op = self.last_debug_merge_point + self._newoperations.append(self.last_debug_merge_point) self.emit_unrolled_operation(jump_op) - def _gather_trace_information(self, loop): + def _gather_trace_information(self, loop, track_memref = False): + self.vec_info.track_memory_refs = track_memref for i,op in enumerate(loop.operations): - self.vec_info._op_index = i self.vec_info.inspect_operation(op) def get_estimated_unroll_factor(self, force_reg_bytes = -1): @@ -317,18 +329,21 @@ default=IntegralMod.default_operation) IntegralMod.inspect_operation = integral_dispatch_opt + class LoopVectorizeInfo(object): - def __init__(self): + def __init__(self, optimizer): + self.optimizer = optimizer self.smallest_type_bytes = 0 - self._op_index = 0 self.memory_refs = {} - self.label_op = None + self.track_memory_refs = False def operation_RAW_LOAD(self, op): descr = op.getdescr() - self.memory_refs[self._op_index] = \ - MemoryRef(op.getarg(0), op.getarg(1), op.getdescr()) + if self.track_memory_refs: + idx = len(self.optimizer._newoperations)-1 + self.memory_refs[idx] = \ + MemoryRef(op.getarg(0), op.getarg(1), op.getdescr()) if not descr.is_array_of_pointers(): byte_count = descr.get_item_size_in_bytes() if self.smallest_type_bytes == 0 \ _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit