[pypy-commit] pypy vecopt2: passing first unroll test
plan_rich
noreply at buildbot.pypy.org
Tue May 5 09:45:07 CEST 2015
Author: Richard Plangger <rich at 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:
More information about the pypy-commit
mailing list