public void EmptyGraph() { var graph = BuildCFG(@" var a; "); var backEdges = new BackEdges(graph).BackEdgesFromGraph; Assert.AreEqual(0, backEdges.Count); }
public void SimpleTestBackEdges() { var graph = BuildCFG(@" var a, b; 2: a = 1; goto 1; 1: b = 2; goto 2; "); var backEdges = new BackEdges(graph).BackEdgesFromGraph; Assert.AreEqual(1, backEdges.Count); }
public void CheckIfGraphIsNotReducible2() { var graph = BuildCFG(@"var a, b, c, d, x, u, e,g, y,zz,i; for i = 1, 10 { a = b; 1: c = d; goto 2; } 2: x = u; goto 1;"); var backEdges = new BackEdges(graph); Assert.AreEqual(false, backEdges.GraphIsReducible); }
public void CheckIfGraphIsReducible2() { var graph = BuildCFG(@"var a, b, c, d, i, j, p, x; a = b + 2; if a < b { c = d + a; } else { a = d + c; } for i = 1, 5 { b = b + a * a; a = a + 1; } while (c < b) { a = a + 1; b = b + 1; } while (a < b) { x = a + b; goto 2; } 2: for i = 1, 5 { d = d + b * a; b = b + 1; goto 3; while (a < b) { x = a + b; goto 2; } 3: for i = 1, 5 { d = d + b * a; b = b + 1; } }"); var backEdges = new BackEdges(graph); Assert.AreEqual(true, backEdges.GraphIsReducible); }
public void SimpleNoBackEdgesWithGoTo() { var graph = BuildCFG(@"var a, b, c, d, e, f; 1: a = 1; b = 2; goto 2; 2: c = 3; d = 4; goto 3; 3: e = 5; goto 4; 4: f = 6;"); var backEdges = new BackEdges(graph).BackEdgesFromGraph; Assert.AreEqual(0, backEdges.Count); }
public void ProgramWithLoop() { var graph = BuildCFG(@"var a, b, i, j, p, x; input(a); 1: for i = 1, 5 { b = b + a * a; a = a + 1; } 2: for j = 1, 5 { p = b + a * a; x = a + 1; }"); var backEdges = new BackEdges(graph).BackEdgesFromGraph; Assert.AreEqual(2, backEdges.Count); }
public void CheckIfGraphIsNotReducible1() { var graph = BuildCFG(@"var a, b, c, d, x, u, e,g, y,zz,i; if a > b { c = d; 1: x = e; goto 2; } else { e = g; 2: a = d; goto 1; }"); var backEdges = new BackEdges(graph); Assert.AreEqual(false, backEdges.GraphIsReducible); }
public void TrashProgram() { var graph = BuildCFG(@"var a, b, c, d, e, y; input(a); b = 5 + a; c = 6 + a; 5: y = 7; 1: if a == 4 c = b; 2: if a == 5 goto 5; 3: d = c + b; goto 4; 4: if d > c goto 6; 6: e = a + d;"); var backEdges = new BackEdges(graph).BackEdgesFromGraph; Assert.AreEqual(1, backEdges.Count); }
public void CheckIfGraphIsReducible1() { var graph = BuildCFG(@"var a, b, i, j, p, x; input(a); 1: for i = 1, 5 { b = b + a * a; a = a + 1; } goto 1; 2: for j = 1, 5 { p = b + a * a; x = a + 1; } goto 2; "); var backEdges = new BackEdges(graph); Assert.AreEqual(true, backEdges.GraphIsReducible); }
public void SimpleNoBackEdgesWithoutGoTo() { var graph = BuildCFG(@"var a, b, c, d, f; a = 1; b = 5; c = a + b; d = 7; f = 0; if d > c { a = 0; c = d + 1; } else { f = 5; } a = f + c;"); var backEdges = new BackEdges(graph).BackEdgesFromGraph; Assert.AreEqual(0, backEdges.Count); }
public void AddBackInnerVertexes(IEnumerable <LabeledVertex> innerVertexes) { var groupedVertexes = innerVertexes.Concat(new[] { FirstMostVertex }); foreach (var innerVertex in groupedVertexes) { innerVertex.BackEdges.RemoveAll(x => x.EdgeType != EdgeType.SingleUnit && groupedVertexes.Contains(x.SourceVertex)); innerVertex.ForwardEdges.RemoveAll(x => x.EdgeType != EdgeType.SingleUnit && groupedVertexes.Contains(x.DestinationVertex)); var outGroupBackEdges = innerVertex.BackEdges.Where(x => x.EdgeType != EdgeType.SingleUnit); foreach (var outBackEdge in outGroupBackEdges.ToArray()) { outBackEdge.DestinationVertex = this; innerVertex.BackEdges.Remove(outBackEdge); foreach (var backForwardEdge in outBackEdge.SourceVertex.ForwardEdges.Where(x => x.DestinationVertex == innerVertex)) { backForwardEdge.DestinationVertex = this; } if (!BackEdges.Any(x => x.SourceVertex == outBackEdge.SourceVertex && x.EdgeType == outBackEdge.EdgeType && x.Index == outBackEdge.Index)) { BackEdges.Add(outBackEdge); } } var outGroupForwardEdges = innerVertex.ForwardEdges.Where(x => x.EdgeType != EdgeType.SingleUnit); foreach (var outForwardEdge in outGroupForwardEdges.ToArray()) { outForwardEdge.SourceVertex = this; innerVertex.ForwardEdges.Remove(outForwardEdge); foreach (var forwardBackEdge in outForwardEdge.SourceVertex.BackEdges.Where(x => x.SourceVertex == innerVertex)) { forwardBackEdge.SourceVertex = this; } if (!ForwardEdges.Any(x => x.SourceVertex == outForwardEdge.SourceVertex && x.EdgeType == outForwardEdge.EdgeType && x.Index == outForwardEdge.Index)) { ForwardEdges.Add(outForwardEdge); } } } }