def compute_var_flows (nodes, outputs, preds, override_lvals_rvals = {}): # compute a graph of reverse var flows to pass to tarjan's algorithm graph = {} entries = ['Ret'] for (n, node) in nodes.iteritems (): if node.kind == 'Basic': for (lv, rv) in node.upds: graph[(n, 'Post', lv)] = [(n, 'Pre', v) for v in syntax.get_expr_var_set (rv)] elif node.is_noop (): pass else: if n in override_lvals_rvals: (lvals, rvals) = override_lvals_rvals[n] else: rvals = syntax.get_node_rvals (node) rvals = set (rvals.iteritems ()) lvals = set (node.get_lvals ()) if node.kind != 'Basic': lvals = list (lvals) + ['PC'] entries.append ((n, 'Post', 'PC')) for lv in lvals: graph[(n, 'Post', lv)] = [(n, 'Pre', rv) for rv in rvals] graph['Ret'] = [(n, 'Post', v) for n in preds['Ret'] for v in outputs (n)] vs = set ([v for k in graph for (_, _, v) in graph[k]]) for v in vs: for n in nodes: graph.setdefault ((n, 'Post', v), [(n, 'Pre', v)]) graph[(n, 'Pre', v)] = [(n2, 'Post', v) for n2 in preds[n]] comps = tarjan (graph, entries) return (graph, comps)
def process_node (n, created): if p.nodes[n].is_noop (): lvals = set ([]) else: vs = syntax.get_node_rvals (p.nodes[n]) for rv in vs.iteritems (): if rv not in created: used_vs.add (rv) lvals = set (p.nodes[n].get_lvals ()) created = set.union (created, lvals) created_vs_at[n] = created visit.extend (p.nodes[n].get_conts ())
def process_node(n, created): if p.nodes[n].is_noop(): lvals = set([]) else: vs = syntax.get_node_rvals(p.nodes[n]) for rv in vs.iteritems(): if rv not in created: used_vs.add(rv) lvals = set(p.nodes[n].get_lvals()) created = set.union(created, lvals) created_vs_at[n] = created visit.extend(p.nodes[n].get_conts())
def compute_var_deps (nodes, outputs, preds, override_lvals_rvals = {}): # outs = list of (outname, retvars) var_deps = {} visit = set () visit.update (preds['Ret']) visit.update (preds['Err']) nodes = contextual_cond_simps (nodes, preds) while visit: n = visit.pop () node = simplify_node_elementary (nodes[n]) if n in override_lvals_rvals: (lvals, rvals) = override_lvals_rvals[n] lvals = set (lvals) rvals = set (rvals) elif node.is_noop (): lvals = set ([]) rvals = set ([]) else: rvals = syntax.get_node_rvals (node) rvals = set (rvals.iteritems ()) lvals = set (node.get_lvals ()) cont_vs = set () for c in node.get_conts (): if c == 'Ret': cont_vs.update (outputs (n)) elif c == 'Err': pass else: cont_vs.update (var_deps.get (c, [])) vs = set.union(rvals, cont_vs - lvals) if n in var_deps and vs <= var_deps[n]: continue var_deps[n] = vs visit.update (preds[n]) return var_deps