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); }