public void naturalCycleTest() { var root = Parser.ParseString(Samples.SampleProgramText.sample1); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); var cfg = ListBlocksToCFG.Build(blocks); cfg.ShowCompact = true; Console.WriteLine(cfg); var ncg = new NaturalCycleGraph(cfg); var res = ncg.findBetween(6, 4); res.Sort(); var expected = new List <int>() { 4, 6 }; CollectionAssert.AreEqual(res, expected); var res1 = ncg.findBetween(13, 8); res1.Sort(); Console.Write("Cycle btw 13, 8: " + string.Join(", ", res1)); var expected1 = new List <int>() { 8, 10, 11, 12, 13 }; CollectionAssert.AreEqual(res1, expected1); }
static void Main(string[] args) { string inp = File.ReadAllText("a.txt"); var root = Parser.ParseString(inp); // Генерация и получение трёхзначного кода var linearCode = new LinearCodeVisitor(); root?.AcceptVisit(linearCode); var code = linearCode.code; // Get blocks and print it var blocks = LinearToBaseBlock.Build(code); foreach (var block in blocks) { Console.WriteLine(block.ToString()); } // Get graph and made DepthSpanningTree var cfg = new CFGraph(blocks); var dst = new DepthSpanningTree(cfg); string dst_viz = dst.ToString(); Console.WriteLine(dst_viz); Console.ReadLine(); }
public void RegionSequenceTest() { var root = Parser.ParseString(Samples.SampleProgramText.regionSqeuenceSample); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); var cfg = ListBlocksToCFG.Build(blocks); var regSeq = new RegionSequence(cfg); var natCycles = cfg.getNaturalCyclesForBackwardEdges(); Assert.AreEqual(regSeq.Regions.Count, 24); Assert.AreEqual(regSeq.Regions.Last().Header, cfg.GetVertices().ToList()[0]); Assert.IsTrue(regSeq.Regions.Exists(r => natCycles[0][0] == r.Header)); }
public void SsaConstructionTest() { var root = Parser.ParseString(Samples.SampleProgramText.ssaoptimizationSample2); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); var cfg = new CFGraph(blocks); Console.WriteLine("###--------- Input CF Graph ---------###"); Console.WriteLine(cfg.ToString()); SsaConstruction ssa = new SsaConstruction(cfg); Console.WriteLine("###--------- Output SSA Graph ---------###"); Console.WriteLine(ssa.SsaForm.ToString()); }
public void CFGraphTest() { var root = Parser.ParseString(Samples.SampleProgramText.sample2); var linearCode = new LinearCodeVisitor(); root.AcceptVisit(linearCode); var code = linearCode.code; var blocks = LinearToBaseBlock.Build(code); var cfg = new CFGraph(blocks); Console.WriteLine(cfg.ToString()); }
public void ConstantPropagationTest() { var root = Parser.ParseString(Samples.SampleProgramText.constantPropagationSample); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); ConstantPropagation constProp = new ConstantPropagation(); Console.WriteLine(blocks[0]); var resBlock = constProp.OptimizeBlock(blocks[0] as BaseBlock); string res = resBlock.ToString(); Console.WriteLine(res); }
public void DSTTest() { var root = Parser.ParseString(Samples.SampleProgramText.sample2); var linearCode = new LinearCodeVisitor(); root.AcceptVisit(linearCode); var code = linearCode.code; var blocks = LinearToBaseBlock.Build(code); var cfg = new CFGraph(blocks); var dst = new DepthSpanningTree(cfg); cfg.ShowCompact = true; Console.WriteLine(cfg.ToString()); Console.WriteLine(dst.ToString()); }
public void AvailableExpressionsTest() { Console.Write("----------- Available Expressions Analyzer ---------- \n"); var root = Parser.ParseString(Samples.SampleProgramText.AvailableExprsSample); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); var cfg = ListBlocksToCFG.Build(blocks); var exprsAnalizer = new AvailableExprAnalyzer(cfg); exprsAnalizer.analyze(); Assert.IsTrue(exprsAnalizer.OutBlocks[blocks[0]].Count == 1); Assert.IsTrue(exprsAnalizer.InBlocks[blocks[2]].Count == 1); Assert.IsTrue(exprsAnalizer.OutBlocks[blocks[2]].Count == 0); }
public void allRetreatingEdgesAreBackwardsTest() { var root = Parser.ParseString(Samples.SampleProgramText.sample1); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); var cfg = ListBlocksToCFG.Build(blocks); cfg.ShowCompact = true; Console.WriteLine(cfg); Console.WriteLine("allRetreatingEdgesAreBackwards: " + cfg.allRetreatingEdgesAreBackwards()); Assert.AreEqual(cfg.allRetreatingEdgesAreBackwards(), true); root = Parser.ParseString(Samples.SampleProgramText.veryStrangeCode); code = ProgramTreeToLinear.Build(root); blocks = LinearToBaseBlock.Build(code); cfg = ListBlocksToCFG.Build(blocks); cfg.ShowCompact = true; Console.WriteLine(cfg); Console.WriteLine("allRetreatingEdgesAreBackwards: " + cfg.allRetreatingEdgesAreBackwards()); Assert.AreEqual(cfg.allRetreatingEdgesAreBackwards(), false); }
public void SsaCopyPropagationTest() { var root = Parser.ParseString(Samples.SampleProgramText.ssaoptimizationSample3); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); var cfg = new CFGraph(blocks); Console.WriteLine("###--------- Input CF Graph ---------###"); Console.WriteLine(cfg.ToString()); SsaConstruction ssa = new SsaConstruction(cfg); CFGraph ssaGraph = ssa.SsaForm; Console.WriteLine("###--------- Constructed SSA Graph ---------###"); Console.WriteLine(ssaGraph.ToString()); SsaCopyPropagation ssaCopyPropagation = new SsaCopyPropagation(ssaGraph); ssaCopyPropagation.Launch(); Console.WriteLine("###--------- Output SSA Graph after copy propagation ---------###"); Console.WriteLine(ssaCopyPropagation.OptimizedSsaGraph); }
public void SymbolicAnalysisTest() { var root = Parser.ParseString(Samples.SampleProgramText.symbolicAnalysisSample); var code = ProgramTreeToLinear.Build(root); var blocks = LinearToBaseBlock.Build(code); SymbolicAnalysis syman = new SymbolicAnalysis(); var map = syman.createMap(blocks[0] as BaseBlock); Console.WriteLine("baseblock1"); Console.WriteLine("------"); foreach (var b in code) { Console.Write(b.ToString() + " "); Console.WriteLine(b.Operation.ToString()); } Console.WriteLine("------"); root = Parser.ParseString(Samples.SampleProgramText.symbolicAnalysisSample2); code = ProgramTreeToLinear.Build(root); blocks = LinearToBaseBlock.Build(code); var map2 = syman.createMap(blocks[0] as BaseBlock); Console.WriteLine("baseblock2"); Console.WriteLine("------"); foreach (var b in code) { Console.Write(b.ToString() + " "); Console.WriteLine(b.Operation.ToString()); } Console.WriteLine("------"); Console.WriteLine("symbolic map for block1"); Console.WriteLine("------"); foreach (var m in map.variableTable) { if (m.Key != null) { Console.Write(m.Key.ToString() + " "); } if (m.Value.type != null) { Console.WriteLine(m.Value.type.ToString()); } Console.Write("Constants: "); if (m.Value.value.constants != null) { foreach (var v in m.Value.value.constants) { Console.Write(v.ToString() + " "); } } Console.Write("Variables: "); if (m.Value.value.variables != null) { foreach (var v in m.Value.value.variables) { Console.Write(v.ToString() + " "); } } Console.WriteLine(); } Console.WriteLine("------"); Console.WriteLine("symbolic map for block2"); Console.WriteLine("------"); foreach (var m in map2.variableTable) { if (m.Key != null) { Console.Write(m.Key.ToString() + " "); } if (m.Value.type != null) { Console.WriteLine(m.Value.type.ToString()); } Console.Write("Constants: "); if (m.Value.value.constants != null) { foreach (var v in m.Value.value.constants) { Console.Write(v.ToString() + " "); } } Console.Write("Variables: "); if (m.Value.value.variables != null) { foreach (var v in m.Value.value.variables) { Console.Write(v.ToString() + " "); } } Console.WriteLine(); } Console.WriteLine("------"); Console.WriteLine("Composition of map1 and map2 on x = 4 + 3*y + z; instruction"); var compmap = syman.Composition(code[code.Count - 1], map2, map); Console.WriteLine("------"); foreach (var m in compmap.variableTable) { if (m.Key != null) { Console.Write(m.Key.ToString() + " "); } if (m.Value.type != null) { Console.WriteLine(m.Value.type.ToString()); } Console.Write("Constants: "); if (m.Value.value.constants != null) { foreach (var v in m.Value.value.constants) { Console.Write(v.ToString() + " "); } } Console.Write("Variables: "); if (m.Value.value.variables != null) { foreach (var v in m.Value.value.variables) { Console.Write(v.ToString() + " "); } } Console.WriteLine(); } Console.WriteLine("------"); }
static void Main(string[] args) { var text = File.ReadAllText("a.txt"); //text = "n = 0;" + // "if n {" + // "custom_label1:" + // "goto custom_label2;" + // "}" + // "else {" + // "custom_label2:" + // "goto custom_label1;" + // "}"; var root = Parser.ParseString(text); if (root == null) { Console.WriteLine("Error"); return; } // Генерация и получение трёхзначного кода var linearCode = new LinearCodeVisitor(); root.AcceptVisit(linearCode); var code = linearCode.code; // Get blocks and print it var blocks = LinearToBaseBlock.Build(code); foreach (var block in blocks) { Console.WriteLine(block.ToString()); } // Get graph and made DepthSpanningTree var cfg = new CFGraph(blocks); Console.WriteLine(cfg.ToString()); var exprsAnalizer = new AvailableExprAnalyzer(cfg); exprsAnalizer.analyze(); var dst = new DepthSpanningTree(cfg); string dst_viz = dst.ToString(); Console.WriteLine(dst_viz); Console.WriteLine(""); Console.WriteLine(cfg.EdgeTypes.ToString()); var f = cfg.allRetreatingEdgesAreBackwards(); var r = cfg.getNaturalCyclesForBackwardEdges(); var rs = new RegionSequence(cfg); Console.ReadLine(); }