[pypy-commit] pypy vecopt2: work in progress (continued)

plan_rich noreply at buildbot.pypy.org
Tue May 5 09:46:02 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt2
Changeset: r77110:dc0a99fbcf21
Date: 2015-04-09 16:58 +0200
http://bitbucket.org/pypy/pypy/changeset/dc0a99fbcf21/

Log:	work in progress (continued)

diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -72,8 +72,8 @@
                 % (self.at.opidx, self.to.opidx, self.args)
 
 class DefTracker(object):
-    def __init__(self, memory_refs):
-        self.memory_refs = memory_refs
+    def __init__(self, graph):
+        self.graph = graph
         self.defs = {}
 
     def define(self, arg, index, argcell=None):
@@ -97,10 +97,10 @@
                 assert index != -1
                 i = len(def_chain)-1
                 try:
-                    mref = self.memory_refs[index]
+                    mref = self.graph.memory_refs[index]
                     while i >= 0:
                         def_index = def_chain[i][0]
-                        oref = self.memory_refs.get(def_index)
+                        oref = self.graph.memory_refs.get(def_index)
                         if oref is not None and mref.indices_can_alias(oref):
                             return def_index
                         elif oref is None:
@@ -112,6 +112,15 @@
                     pass
                 return def_chain[-1][0]
 
+    def depends_on_arg(self, arg, to, argcell=None):
+        try:
+            idx_at = self.definition_index(arg, to.opidx, argcell)
+            at = self.graph.operations[idx_at]
+            graph.edge(at, to, arg)
+        except KeyError:
+            assert False, "arg %s must be defined" % arg
+
+
 class DependencyGraph(object):
     """ A graph that represents one of the following dependencies:
           * True dependency
@@ -148,11 +157,12 @@
             Write After Read, Write After Write dependencies are not possible,
             the operations are in SSA form
         """
-        tracker = DefTracker(self.memory_refs)
+        tracker = DefTracker(self)
         #
         intformod = IntegralForwardModification(self.memory_refs, self.index_vars)
         # pass 1
-        for i,op in enumerate(self.operations):
+        for i,opw in enumerate(self.operations):
+            op = opw.op
             # the label operation defines all operations at the
             # beginning of the loop
             if op.getopnum() == rop.LABEL:
@@ -176,7 +186,7 @@
             if op.is_always_pure() or op.is_final():
                 # normal case every arguments definition is set
                 for arg in op.getarglist():
-                    self._def_use(arg, i, tracker)
+                    tracker.depends_on_arg(arg, opw)
             elif op.is_guard():
                 self.guards.append(i)
             else:
@@ -209,14 +219,14 @@
         # 'GUARD_NONNULL/1d',
         # 'GUARD_ISNULL/1d',
         # 'GUARD_NONNULL_CLASS/2d',
-        guard_op = self.operations[guard_idx]
+        guard_opw = self.operations[guard_idx]
+        guard_op = guard_opw.op
         for arg in guard_op.getarglist():
-            self._def_use(arg, guard_idx, tracker)
+            tracker.depends_on_arg(arg, guard_opw)
 
         variables = []
-        for dep in self.depends(guard_idx):
-            idx = dep.idx_from
-            op = self.operations[idx]
+        for dep in self.depends(guard_opw):
+            op = dep.at.op
             for arg in op.getarglist():
                 if isinstance(arg, Box):
                     variables.append(arg)
@@ -228,16 +238,16 @@
                 def_idx = tracker.definition_index(var)
                 for dep in self.provides(def_idx):
                     if var in dep.args and dep.idx_to > guard_idx:
-                        self._put_edge(dep.idx_to, guard_idx, dep.idx_to, var, force=True, label='prev('+str(var)+')')
+                        self.edge(guard_opw, dep.to, var, label='prev('+str(var)+')')
             except KeyError:
                 pass
         # handle fail args
-        op = self.operations[guard_idx]
-        if op.getfailargs():
-            for arg in op.getfailargs():
+        if guard_op.getfailargs():
+            for arg in guard_op.getfailargs():
                 try:
                     for def_idx in tracker.redefintions(arg):
-                        dep = self._put_edge(guard_idx, def_idx, guard_idx, arg, label="fail")
+                        at = self.operations[def_idx]
+                        dep = self.edge(at, guard_opw, arg, label="fail")
                 except KeyError:
                     assert False
         #
@@ -245,27 +255,28 @@
         # find the first non guard operation
         prev_op_idx = guard_idx - 1
         while prev_op_idx > 0:
-            prev_op = self.operations[prev_op_idx]
+            prev_op = self.operations[prev_op_idx].op
             if prev_op.is_guard():
                 prev_op_idx -= 1
             else:
                 break
-        prev_op = self.operations[prev_op_idx]
+        prev_op = self.operations[prev_op_idx].op
         #
         if op.is_guard_exception() and prev_op.can_raise():
-            self._guard_inhert(prev_op_idx, guard_idx)
+            self.i_guard_inhert(prev_op_idx, guard_idx)
         elif op.is_guard_overflow() and prev_op.is_ovf():
-            self._guard_inhert(prev_op_idx, guard_idx)
+            self.i_guard_inhert(prev_op_idx, guard_idx)
         elif op.getopnum() == rop.GUARD_NOT_FORCED and prev_op.can_raise():
-            self._guard_inhert(prev_op_idx, guard_idx)
+            self.i_guard_inhert(prev_op_idx, guard_idx)
         elif op.getopnum() == rop.GUARD_NOT_FORCED_2 and prev_op.can_raise():
-            self._guard_inhert(prev_op_idx, guard_idx)
+            self.i_guard_inhert(prev_op_idx, guard_idx)
 
-    def _guard_inhert(self, idx, guard_idx):
-        dep = self._put_edge(guard_idx, idx, guard_idx, None, label='inhert')
-        for dep in self.provides(idx):
-            if dep.idx_to > guard_idx:
-                self._put_edge(dep.idx_to, guard_idx, dep.idx_to, None, label='inhert')
+    def i_guard_inhert(self, idx, guard_idx):
+        at = self.operation[idx]
+        dep = self.i_edge(idx, guard_idx, None, label='inhert')
+        for dep in self.provides(at):
+            if dep.to.opidx > guard_idx:
+                self.i_edge(guard_idx, dep.to.opidx, None, label='inhert')
 
     def _build_non_pure_dependencies(self, op, index, tracker):
         # self._update_memory_ref(op, index, tracker)
@@ -305,13 +316,6 @@
                 if destroyed:
                     tracker.define(arg, index, argcell=argcell)
 
-    def _def_use(self, arg, index, tracker, argcell=None):
-        try:
-            def_idx = tracker.definition_index(arg, index, argcell)
-            self._put_edge(index, def_idx, index, arg)
-        except KeyError:
-            pass
-
     def _side_effect_argument(self, op):
         # if an item in array p0 is modified or a call contains an argument
         # it can modify it is returned in the destroyed list.
@@ -396,9 +400,9 @@
             i += 1
         return i
 
-    def provides(self, idx):
-        for dep in self.adjacent_list[idx]:
-            if idx < dep.idx_to:
+    def provides(self, opw):
+        for dep in self.adjacent_list[opw]:
+            if opw.opidx < dep.to.opidx:
                 yield dep
 
     def depends_count(self, idx):
@@ -407,9 +411,12 @@
             i += 1
         return i
 
-    def depends(self, idx):
-        for dep in self.adjacent_list[idx]:
-            if idx > dep.idx_from:
+    def i_depends(self, idx):
+        opw = self.operations[idx]
+        return self.depends(opw)
+    def depends(self, opw):
+        for dep in self.adjacent_list[opw]:
+            if opw.opidx > dep.at.opidx:
                 yield dep
 
     def dependencies(self, idx):
@@ -577,8 +584,8 @@
                 print "sched", dep.idx_to
                 self.schedulable_nodes.append(dep.idx_to)
         #
-        for dep in self.graph.provides(node):
-            candidate = dep.idx_to
+        # TODO for dep in self.graph.provides(node):
+        #    candidate = dep.idx_to
         self.graph.adjacent_list[node] = []
 
     def is_schedulable(self, idx):


More information about the pypy-commit mailing list