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;
                }
            }
        }
Пример #2
0
        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;
                }
            }
        }