示例#1
0
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)
示例#2
0
	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 ())
示例#3
0
    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())
示例#4
0
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