public static bool Parse(AMethodDecl method, SharedData data)
        {
            RemoveSelfAssignments remover = new RemoveSelfAssignments(data);

            method.GetBlock().Apply(remover);
            return(remover.changedSomething);
        }
Ejemplo n.º 2
0
        public override void CaseAMethodDecl(AMethodDecl node)
        {
            if (data.AllowPrintouts)
            {
                Form1.Form.SetStatusText(prefix + " [" + ++methodNr + "/" + methodCount + " " + node.GetName().Text + "]");
            }
            if (node.GetName().Text.Contains("t2"))
            {
                node = node;
            }
            //Move locals to the start
            node.Apply(new MoveLocalsToStart(finalTrans.data));
            bool changes = true;

            while (changes)
            {
                changes = false;

                //Remove foo = foo
                RemoveSelfAssignments.Parse(node, data);

                //Create cfg
                ControlFlowGraph cfg = ControlFlowGraph.Create(node);
                RemoveDeadCode.Parse(cfg);
                LivenessAnalysis.CalculateLiveVariables(cfg, data);
                bool redoLivenessAnalysis;
                changes |= RemoveUnusedAssignments.Parse(cfg, data, out redoLivenessAnalysis);
                if (redoLivenessAnalysis)
                {
                    LivenessAnalysis.CalculateLiveVariables(cfg, data);
                }
                changes |= VariableJoiner.Parse(cfg, data);
                //This phase doesn't use liveness analysis
                changes |= RemoveUnusedLocals.Parse(cfg, data);


                while (true)
                {
                    bool changed = RemoveSingleUsedAssignments.Parse(cfg, data);
                    if (changed)
                    {
                        changes = true;
                        LivenessAnalysis.CalculateLiveVariables(cfg, data);
                        continue;
                    }
                    break;
                }


                changes |= StatementRemover.Parse(node);
            }
        }
 public static bool Parse(AMethodDecl method, SharedData data)
 {
     RemoveSelfAssignments remover = new RemoveSelfAssignments(data);
     method.GetBlock().Apply(remover);
     return remover.changedSomething;
 }