private void RemoveEmptyBlocks() { //HACK: Not the most efficient way of solving this. //-||-: However it works. var lastTimeCount = int.MaxValue; var numberOfVertices = graph.Vertices.Count(); while (numberOfVertices != lastTimeCount) { var toRemove = new List <CFGBlock>(); foreach (var vertex in graph.Vertices) { int inEdgesCount = graph.InEdges(vertex).Count(); int outEdgesCount = graph.OutEdges(vertex).Count(); if (!(vertex.IsLeaf || vertex.IsRoot || vertex.IsSpecialBlock || vertex.AstEntryNode != null)) { if (inEdgesCount == 1 && outEdgesCount == 0) { toRemove.Add(vertex); } else if (inEdgesCount > 0 && outEdgesCount == 1) { foreach (var edge in graph.InEdges(vertex)) { var parent = edge.Source; var child = graph.OutEdge(vertex, 0).Target; graph.AddEdge(new TaggedEdge <CFGBlock, EdgeTag>(parent, child, edge.Tag)); toRemove.Add(vertex); } } } } foreach (var vertex in toRemove) { graph.RemoveVertex(vertex); } lastTimeCount = numberOfVertices; numberOfVertices = graph.Vertices.Count(); } }
public TEdge OutEdge(TVertex v, int index) => _graph.OutEdge(v, index);