Exemple #1
0
        public void EmptyGraph()
        {
            var graph     = BuildCFG(@"
var a;
");
            var backEdges = new BackEdges(graph).BackEdgesFromGraph;

            Assert.AreEqual(0, backEdges.Count);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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);
                    }
                }
            }
        }