Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78509:9ab23edf0d53
Date: 2015-07-09 15:42 +0200
http://bitbucket.org/pypy/pypy/changeset/9ab23edf0d53/

Log:    expansion misses some adjustments after refactoring

diff --git a/rpython/jit/backend/x86/regalloc.py 
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -307,29 +307,32 @@
     def locs_for_fail(self, guard_op):
         faillocs = []
         descr = guard_op.getdescr()
-        for v in guard_op.getfailargs():
-            if v is None:
+        for arg in guard_op.getfailargs():
+            if arg is None:
+                faillocs.append(None)
                 continue
-            accum = v.getaccum()
+            accum = arg.getaccum()
             if accum:
-                loc = self.loc(accum.getvar())
-                self.update_accumulation_loc(v, descr)
+                loc = self.loc(accum.getoriginalbox())
                 faillocs.append(loc)
+                self.update_accumulation_loc(arg, accum, descr)
             else:
-                faillocs.append(self.loc(v))
+                faillocs.append(self.loc(arg))
 
         return faillocs
 
-    def update_accumulation_loc(self, box, accum, descr):
-        """ Saves the location to the AccumInfo object.
-        Necessary to reconstruct the values at a guard exit.
+    def update_accumulation_loc(self, arg, accum, descr):
         """
-        box = accumbox.scalar_var
+        Faillocs saved on the guard can only represent one value.
+        Accumulation has the accumulation box which need to updated uppon
+        guard exit. The fail descr saves where (regloc) the accumulator
+        is located.
+        """
         assert isinstance(descr, ResumeGuardDescr)
         accum_info = descr.rd_accum_list
         while accum_info:
-            if accum_info.box is box:
-                accum_info.loc = self.loc(accumbox)
+            if accum_info.box is accum.getoriginalbox():
+                accum_info.loc = self.loc(arg)
                 break
             accum_info = accum_info.prev
         else:
diff --git a/rpython/jit/metainterp/history.py 
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -551,6 +551,8 @@
         return True
 
     def save_to_descr(self, descr, position):
+        from rpython.jit.metainterp.compile import ResumeGuardDescr
+        from rpython.jit.metainterp.resume import AccumInfo
         assert isinstance(descr,ResumeGuardDescr)
         ai = AccumInfo(descr.rd_accum_list, position, self.operator, self.var)
         descr.rd_accum_list = ai
@@ -732,6 +734,16 @@
     def repr_of_descr(self):
         return 'TargetToken(%d)' % compute_unique_id(self)
 
+def index_of_first(opnum, operations):
+    """ returns the position of the first operation matching the opnum.
+    Or -1 if non is found
+    """
+    for i,op in enumerate(operations):
+        if op.getopnum() == opnum:
+            return i
+    return -1
+
+
 class LoopVersion(object):
 
     def __init__(self, operations, opt_ops, aligned=False):
@@ -739,16 +751,14 @@
         self.aligned = aligned
         self.faildescrs = []
         #
-        i = 0
-        label = self.operations[i]
-        while i < len(self.operations):
-            label = self.operations[i]
-            if label.getopnum() == rop.LABEL:
-                break
-            i += 1
-        assert label.getopnum() == rop.LABEL
-        self.label_pos = i
+        idx = index_of_first(rop.LABEL, operations)
+        assert idx >= 0
+        label = operations[idx]
+        self.label_pos = idx
         self.inputargs = label.getarglist()
+        idx = index_of_first(rop.LABEL, opt_ops)
+        assert idx >= 0
+        version_failargs = opt_ops[idx].getarglist()
         for op in opt_ops:
             if op.is_guard():
                 descr = op.getdescr()
@@ -758,12 +768,9 @@
                     # if there are more possibilites, let the descr
                     # know which loop version he preferes
                     self.faildescrs.append(descr)
-                    op.setfailargs(self.inputargs)
+                    op.setfailargs(version_failargs)
                     op.rd_snapshot = None
 
-    def adddescr(self, op, descr):
-        self.faildescrs.append((op, descr))
-
     def update_token(self, jitcell_token):
         label = self.operations[self.label_pos]
         jump = self.operations[-1]
@@ -820,10 +827,7 @@
 
     def find_first_index(self, opnum):
         """ return the first operation having the same opnum or -1 """
-        for i,op in enumerate(self.operations):
-            if op.getopnum() == opnum:
-                return i
-        return -1
+        return index_of_first(opnum, self.operations)
 
     def get_display_text(self):    # for graphpage.py
         return self.name + '\n' + repr(self.inputargs)
diff --git a/rpython/jit/metainterp/optimizeopt/util.py 
b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -213,15 +213,13 @@
         return True
 
     def rename_failargs(self, guard, clone=False):
-        from rpython.jit.metainterp.compile import ResumeGuardDescr
         if guard.getfailargs() is not None:
             if clone:
                 args = guard.getfailargs()[:]
             else:
                 args = guard.getfailargs()
             for i,arg in enumerate(args):
-                value = self.rename_map.get(arg,arg)
-                args[i] = value
+                args[i] = self.rename_map.get(arg,arg)
             return args
         return None
 
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
@@ -8,14 +8,14 @@
 import py
 import time
 
-from rpython.jit.metainterp.resume import Snapshot, AccumInfo
+from rpython.jit.metainterp.resume import Snapshot
 from rpython.jit.metainterp.jitexc import NotAVectorizeableLoop, 
NotAProfitableLoop
 from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll
 from rpython.jit.metainterp.compile import (ResumeAtLoopHeaderDescr,
         CompileLoopVersionDescr, invent_fail_descr_for_op, ResumeGuardDescr)
 from rpython.jit.metainterp.history import (ConstInt, VECTOR, FLOAT, INT,
         BoxVector, BoxFloat, BoxInt, ConstFloat, TargetToken, JitCellToken, 
Box,
-        LoopVersion, Accum)
+        LoopVersion, Accum, AbstractFailDescr)
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, 
Optimization
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method, 
Renamer
 from rpython.jit.metainterp.optimizeopt.dependency import (DependencyGraph,
@@ -246,15 +246,13 @@
                     target_guard = copied_op
                     copied_op.setdescr(copy_fail_descr(copied_op, self))
                     descr = target_guard.getdescr()
-                    exits_early = descr.guard_opnum == rop.GUARD_EARLY_EXIT
-                    if not exits_early:
-                        # copy failargs/snapshot
-                        copied_op.rd_snapshot = \
-                          renamer.rename_rd_snapshot(copied_op.rd_snapshot,
-                                                     clone=True)
-                        renamed_failargs = \
-                            renamer.rename_failargs(copied_op, clone=True)
-                        copied_op.setfailargs(renamed_failargs)
+                    # copy failargs/snapshot
+                    copied_op.rd_snapshot = \
+                      renamer.rename_rd_snapshot(copied_op.rd_snapshot,
+                                                 clone=True)
+                    renamed_failargs = \
+                        renamer.rename_failargs(copied_op, clone=True)
+                    copied_op.setfailargs(renamed_failargs)
                 #
                 self.emit_unrolled_operation(copied_op)
 
@@ -449,7 +447,6 @@
                 assert False
 
     def schedule(self, vector=False):
-        self.guard_early_exit = -1
         self.clear_newoperations()
         sched_data = VecScheduleData(self.cpu.vector_register_size, 
self.costmodel)
         scheduler = Scheduler(self.dependency_graph, sched_data)
@@ -838,7 +835,6 @@
             if not pack.is_accumulating():
                 continue
             accum = pack.accum
-            pack.accum = None
             # create a new vector box for the parameters
             box = pack.input_type.new_vector_box()
             size = vec_reg_size // pack.input_type.getsize()
@@ -866,4 +862,6 @@
             # rename the variable with the box
             sched_data.setvector_of_box(accum.getoriginalbox(), 0, result) # 
prevent it from expansion
             renamer.start_renaming(accum.getoriginalbox(), result)
+            if not we_are_translated():
+                print "renaming accum", accum.getoriginalbox(), "->", result
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to