public static void Compile(BlockNode prog, Options opt) { var threeAddressGenerationVisitor = new ThreeAddressGenerationVisitor(); prog.Visit(threeAddressGenerationVisitor); var code = threeAddressGenerationVisitor.Data; var codeSz = code.Count; var codeBlocks = BaseBlockHelper.GenBaseBlocks(threeAddressGenerationVisitor.Data); foreach (var block in codeBlocks) { Console.Write(block); } codeBlocks = BaseBlockHelper.GenBaseBlocks(code); Optimize(codeBlocks); var JoindCode = BaseBlockHelper.JoinBaseBlocks(codeBlocks); CodeIO CP = new CodeIO(opt.OutputFile, opt.OutBinary); CP.Write(JoindCode); foreach (var block in codeBlocks) { Console.Write(block); } }
public override bool Optimize(List <BaseBlock> codeBlocks) { //var CFG = new ControlFlowGraph(codeBlocks); //неиспользую //var active = CFG.GenerateInputOutputActiveDefs(codeBlocks).Item1; //var active1 = CFG.GenerateInputOutputActiveDefs(codeBlocks).Item2; HashSet <String> bInit = new HashSet <String>(); HashSet <String> bNotInit = new HashSet <string>(); foreach (var l in BaseBlockHelper.JoinBaseBlocks(codeBlocks)) { if ((l.LeftOp != null) && (l.LeftOp.Contains("v")) && (!bInit.Contains(l.LeftOp))) { bNotInit.Add(l.LeftOp); } if ((l.RightOp != null) && (l.RightOp.Contains("v")) && (!bInit.Contains(l.RightOp))) { bNotInit.Add(l.RightOp); } if (ThreeAddrOpType.IsDefinition(l.OpType)) { bInit.Add(l.Accum); } } if (bNotInit.Count() > 0) { throw new NotInitVariableException(bNotInit.ToList(), "Ошибка"); } return(false); }
public override bool Optimize(List <BaseBlock> codeBlocks) { var CFG = new ControlFlowGraph(codeBlocks); var(InExprs, OutExpr) = CFG.GenerateInputOutputAvaliableExpr(); var startToId = new Dictionary <int, int>(); for (int i = 0; i < codeBlocks.Count; ++i) { startToId[codeBlocks[i].StartLabel] = i; } for (int i = 0; i < codeBlocks.Count; ++i) { if (TryOptimize(codeBlocks[i], InExprs[i], CFG.PrevBlocks(codeBlocks[i]))) { var code = BaseBlockHelper.JoinBaseBlocks(codeBlocks); BaseBlockHelper.FixLabelsNumeration(code); codeBlocks.Clear(); codeBlocks.InsertRange(0, BaseBlockHelper.GenBaseBlocks(code)); return(true); } } return(false); }
public static void Compile(BlockNode prog, Options opt) { var threeAddressGenerationVisitor = new ThreeAddressGenerationVisitor(); prog.Visit(threeAddressGenerationVisitor); var code = threeAddressGenerationVisitor.Data; var codeSz = code.Count; var codeBlocks = BaseBlockHelper.GenBaseBlocks(threeAddressGenerationVisitor.Data); foreach (var block in codeBlocks) { Console.Write(block); } codeBlocks = BaseBlockHelper.GenBaseBlocks(code); Optimize(codeBlocks); var JoindCode = BaseBlockHelper.JoinBaseBlocks(codeBlocks); CodeIO CP = new CodeIO(opt.OutputFile, opt.OutBinary); CP.Write(JoindCode); // Блоки с нумерацией Console.WriteLine(); Console.WriteLine(); // SSA var CFG = new ControlFlowGraph(codeBlocks); Console.WriteLine("Original"); Console.Write(CFG); Console.Write(CFG.FindDommBlocks()); var FOD = new FrontOnDominance(CFG); // Модифицирует CFG Console.Write(FOD); Console.Write(FOD.globalsToString()); Console.WriteLine("Phi"); Console.Write(CFG); Console.ReadLine(); }
public (List <ValueSet>, List <ValueSet>) GenerateInputOutputValues() { var In = new List <ValueSet>(); var Out = new List <ValueSet>(); var startToId = GetStartToId(_bblocks); var code = BaseBlockHelper.JoinBaseBlocks(_bblocks); for (int i = 0; i < _bblocks.Count(); ++i) { In.Add(GenFullValueSet(code)); Out.Add(GenFullValueSet(code)); } bool change = true; while (change) { change = false; for (int i = 0; i < _bblocks.Count; ++i) { var st = _bblocks[i].StartLabel; if (Prev[st].Count() != 0) { In[i] = ReachingValues.Combine(Prev[st].Select(l => Out[startToId[l]])); } var nOut = ReachingValues.TransferByBBlock(In[i], _bblocks[i]); foreach (var vk in nOut) { if (vk.Value != Out[i][vk.Key]) { change = true; break; } } Out[i] = nOut; } } return(In, Out); }
public override bool Optimize(List <BaseBlock> codeBlocks) { var code = BaseBlockHelper.JoinBaseBlocks(codeBlocks); int startsz = code.Count; BaseBlockHelper.FixLabelsNumeration(code); var ncodeBlocks = BaseBlockHelper.GenBaseBlocks(code); var CFG = new ControlFlowGraph(ncodeBlocks); ncodeBlocks = CFG.GetAliveBlocks(); code = BaseBlockHelper.JoinBaseBlocks(ncodeBlocks); BaseBlockHelper.FixLabelsNumeration(code); codeBlocks.Clear(); codeBlocks.InsertRange(0, BaseBlockHelper.GenBaseBlocks(code)); return(startsz != code.Count); }
public List <ThreeAddrLine> getJoinCode() { return(BaseBlockHelper.JoinBaseBlocks(_bblocks)); }