Beispiel #1
0
 private DominatorGraph<Region> BuildPostDoms()
 {
     var revGraph = new ReverseGraph(regionGraph);
     var exitNode = new Region(new Block(proc, "DummyExitBlock")) { Type = RegionType.Tail };
     revGraph.Nodes.Add(exitNode);
     var tailRegions = regionGraph.Nodes.Where(n => n.Type == RegionType.Tail);
     foreach (var r in tailRegions)
     {
         revGraph.AddEdge(exitNode, r);
     }
     return new DominatorGraph<Region>(revGraph, exitNode);
 }
        public DominatorGraph <StructureNode> AnalyzeGraph()
        {
            var graph         = new StructureGraphAdapter(curProc.Nodes);
            var reverseGraph  = new ReverseGraph(curProc.Nodes);
            var infiniteLoops = FindInfiniteLoops(graph, curProc.EntryNode);

            AddPseudoEdgeFromInfiniteLoopsToExitNode(graph, infiniteLoops, curProc.ExitNode, reverseGraph);

            var pdg = new DominatorGraph <StructureNode>(reverseGraph, curProc.ExitNode);

            SetImmediatePostDominators(pdg);

            RemovePseudoEdgeFromInfiniteLoopsToExitNode(graph, infiniteLoops, curProc.ExitNode);
            return(pdg);
        }