[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