public static void CalculateLiveVariables(ControlFlowGraph cfg, SharedData data) { //First, generate lists of what is used in each node Dictionary<ControlFlowGraph.Node, List<AALocalDecl>> usedVars = new Dictionary<ControlFlowGraph.Node, List<AALocalDecl>>(); foreach (ControlFlowGraph.Node node in cfg.Nodes) { node.LiveVariables.Clear(); PExp exp = node.Expression; if (exp == null) usedVars[node] = new List<AALocalDecl>(); else { GetUsedVariables variableFinder = new GetUsedVariables(data); exp.Apply(variableFinder); usedVars[node] = variableFinder.UsedLocals; } } bool changed = true; while (changed) { changed = false; foreach (ControlFlowGraph.Node node in cfg.Nodes) { int count = node.LiveVariables.Count; Join(node); node.LiveVariables.Subtract(GetAssignedTo(node, data)); node.LiveVariables.Union(usedVars[node]); changed |= count != node.LiveVariables.Count; } } }
public static void CalculateLiveVariables(ControlFlowGraph cfg, SharedData data) { //First, generate lists of what is used in each node Dictionary <ControlFlowGraph.Node, List <AALocalDecl> > usedVars = new Dictionary <ControlFlowGraph.Node, List <AALocalDecl> >(); foreach (ControlFlowGraph.Node node in cfg.Nodes) { node.LiveVariables.Clear(); PExp exp = node.Expression; if (exp == null) { usedVars[node] = new List <AALocalDecl>(); } else { GetUsedVariables variableFinder = new GetUsedVariables(data); exp.Apply(variableFinder); usedVars[node] = variableFinder.UsedLocals; } } bool changed = true; while (changed) { changed = false; foreach (ControlFlowGraph.Node node in cfg.Nodes) { int count = node.LiveVariables.Count; Join(node); node.LiveVariables.Subtract(GetAssignedTo(node, data)); node.LiveVariables.Union(usedVars[node]); changed |= count != node.LiveVariables.Count; } } }