Author: Richard Plangger <r...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit