Author: Richard Plangger <r...@pasra.at> Branch: vecopt2 Changeset: r77062:fd541605e0a7 Date: 2015-03-06 12:04 +0100 http://bitbucket.org/pypy/pypy/changeset/fd541605e0a7/
Log: passing first unroll test diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py --- a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py @@ -78,7 +78,7 @@ raw_store(p0, i0, i3, descr=floatarraydescr) i4 = int_add(i0, 1) i5 = int_le(i4, 10) - guard_true(i5) [p0,p1,p2,i4] + guard_true(i5) [] jump(p0,p1,p2,i4) """ unfolded_ops = """ @@ -89,17 +89,17 @@ raw_store(p0, i0, i3, descr=floatarraydescr) i4 = int_add(i0, 1) i5 = int_le(i4, 10) - guard_true(i5) [p0,p1,p2,i4] - i10 = raw_load(p1, i4, descr=floatarraydescr) - i11 = raw_load(p2, i4, descr=floatarraydescr) - i12 = int_add(i10,i11) - raw_store(p0, i4, i12, descr=floatarraydescr) - i20 = int_add(i4, 1) - i21 = int_le(i20, 10) - guard_true(i21) [p0,p1,p2,i20] - jump(p0,p1,p2,i21) + guard_true(i5) [] + i6 = raw_load(p1, i4, descr=floatarraydescr) + i7 = raw_load(p2, i4, descr=floatarraydescr) + i8 = int_add(i6,i7) + raw_store(p0, i4, i8, descr=floatarraydescr) + i9 = int_add(i4, 1) + i10 = int_le(i9, 10) + guard_true(i10) [] + jump(p0,p1,p2,i9) """ - self.assert_unfold_loop(self.parse_loop(ops),4, self.parse_loop(unfolded_ops)) + self.assert_unfold_loop(self.parse_loop(ops),2, self.parse_loop(unfolded_ops)) class TestLLtype(BaseTestDependencyGraph, LLtypeMixin): pass diff --git a/rpython/jit/metainterp/optimizeopt/unfold.py b/rpython/jit/metainterp/optimizeopt/unfold.py --- a/rpython/jit/metainterp/optimizeopt/unfold.py +++ b/rpython/jit/metainterp/optimizeopt/unfold.py @@ -14,8 +14,8 @@ def optimize_unfold(metainterp_sd, jitdriver_sd, loop, optimizations, start_state=None, - export_state=True): - opt = OptUnfold(metainterp_sd, jitdriver_sd, loop, optimizations) + export_state=True, unroll_factor=-1): + opt = OptUnfold(metainterp_sd, jitdriver_sd, loop, optimizations, unroll_factor) return opt.propagate_all_forward(start_state, export_state) @@ -48,11 +48,8 @@ inline_short_preamble = True - # for testing purpose only - # TODO: hide it from rpython - _force_unroll_factor = -1 - - def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations): + def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations, unroll_factor): + self.force_unroll_factor = unroll_factor self.optimizer = UnfoldOptimizer(metainterp_sd, jitdriver_sd, loop, optimizations) self.boxes_created_this_iteration = None @@ -72,23 +69,23 @@ prev = self.fix_snapshot(jump_args, snapshot.prev) return Snapshot(prev, new_snapshot_args) - def _rename_arguments_ssa(rename_map, label_args, jump_args): - + def _rename_arguments_ssa(self, rename_map, label_args, jump_args): + # fill the map with the renaming boxes. keys are boxes from the label + # values are the target boxes. for la,ja in zip(label_args, jump_args): if la != ja: rename_map[la] = ja - return new_jump_args - def propagate_all_forward(self, starting_state, export_state=True): - unroll_factor = 2 + unroll_factor = self.force_unroll_factor + if unroll_factor == -1: + unroll_factor = 2 # TODO find a sensible factor. think about loop type? self.optimizer.exporting_state = export_state loop = self.optimizer.loop self.optimizer.clear_newoperations() - label_op = loop.operations[0] jump_op = loop.operations[-1] operations = loop.operations[1:-1] @@ -101,13 +98,46 @@ rename_map = {} for unroll_i in range(2, unroll_factor+1): - _rename_arguments_ssa(rename_map, label_op_args, jump_op_args) + # for each unrolling factor the boxes are renamed. + self._rename_arguments_ssa(rename_map, label_op_args, jump_op_args) iteration_ops = [] - for op in operations: - cop = op.clone() - iteration_ops.append(cop) + for op in operations: + copied_op = op.clone() + + if copied_op.result is not None: + # every result assigns a new box, thus creates an entry + # to the rename map. + new_assigned_box = copied_op.result.clonebox() + rename_map[copied_op.result] = new_assigned_box + copied_op.result = new_assigned_box + + args = copied_op.getarglist() + for i, arg in enumerate(args): + try: + value = rename_map[arg] + copied_op.setarg(i, value) + except KeyError: + pass + + iteration_ops.append(copied_op) + + # the jump arguments have been changed + # if label(iX) ... jump(i(X+1)) is called, at the next unrolled loop + # must look like this: label(i(X+1)) ... jump(i(X+2)) + + args = jump_op.getarglist() + for i, arg in enumerate(args): + try: + value = rename_map[arg] + jump_op.setarg(i, value) + except KeyError: + pass + # map will be rebuilt, the jump operation has been updated already + rename_map.clear() + iterations.append(iteration_ops) + # unwrap the loop nesting. loop.operations.append(label_op) for iteration in iterations: for op in iteration: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit