private List <(List <OneExpression>, List <OneExpression>)> GetActualInOutData(List <Instruction> TAC) { cfg = new ControlFlowGraph(BasicBlockLeader.DivideLeaderToLeader(TAC)); availableExpressions = new AvailableExpressions(); resAvailableExpressions = availableExpressions.Execute(cfg); In = new List <OneExpression>(); Out = new List <OneExpression>(); var actual = new List <(List <OneExpression>, List <OneExpression>)>(); foreach (var block in resAvailableExpressions) { foreach (var expr in block.Value.In) { In.Add(expr); } foreach (var expr in block.Value.Out) { Out.Add(expr); } actual.Add((new List <OneExpression>(In), new List <OneExpression>(Out))); In.Clear(); Out.Clear(); } return(actual); }
public InOutData <Dictionary <Guid, VarValue> > Analyze(ControlFlowGraph graph, ILatticeOperations <Dictionary <Guid, VarValue> > ops, ITransferFunction <Dictionary <Guid, VarValue> > f) { var data = new InOutData <Dictionary <Guid, VarValue> >(); foreach (var node in graph.CFGNodes) { data[node] = (ops.Lower, ops.Lower); } var outChanged = true; while (outChanged) { outChanged = false; foreach (var block in graph.CFGNodes) { var inset = block.Parents.Aggregate(ops.Lower, (x, y) => ops.Operator(x, data[y].Item2)); var outset = f.Transfer(block, inset, ops); if (outset.Count == data[block].Item2.Count && !outset.Except(data[block].Item2).Any()) { outChanged = true; data[block] = (inset, outset); } } } return(data); }
private void Optimize(InOutData <Dictionary <string, SemilatticeValue> > insOuts) { var blocks = Cfg.blocks; foreach (var b in blocks) { var curIn = insOuts[b].Item1; foreach (var i in b.Instructions) { if (curIn.ContainsKey(i.Argument1) && curIn[i.Argument1].Type == SemilatticeData.CONST) { i.Argument1 = curIn[i.Argument1].ConstValue; } if (curIn.ContainsKey(i.Argument2) && curIn[i.Argument2].Type == SemilatticeData.CONST) { i.Argument2 = curIn[i.Argument2].ConstValue; } if (curIn.ContainsKey(i.Result) && (curIn[i.Result].Type == SemilatticeData.CONST || curIn[i.Result].Type == SemilatticeData.UNDEF)) { if (i.Argument2 == "" && int.TryParse(i.Argument1, out var temp)) { curIn[i.Result] = new SemilatticeValue(SemilatticeData.CONST, temp); } else { curIn[i.Result] = new SemilatticeValue(SemilatticeData.NAC); } } } } }
/// <summary> /// Применение оптимизации /// </summary> /// <param name="controlFlowGraph">Граф потока управления</param> /// <param name="inOutData">In Out - данные о доступных выражениях</param> public static void Execute(ControlFlowGraph controlFlowGraph, InOutData <List <OneExpression> > inOutData) { if (!controlFlowGraph.IsReducibleGraph()) { return; } GraphTraversing(controlFlowGraph, inOutData); }
public AvailableExpressionRun(ControlFlowGraph cfg, InOutData <List <OneExpression> > inOutData) { graph = cfg; this.inOutData = inOutData; if (!graph.IsReducibleGraph()) { return; } GraphTraversing(); }
/// <summary> /// Применение оптимизации /// </summary> /// <param name="controlFlowGraph">Граф потока управления</param> /// <param name="inOutData">In Out - данные о доступных выражениях</param> public static void Execute(ControlFlowGraph controlFlowGraph, InOutData <List <OneExpression> > inOutData) => new AvailableExpressionRun(controlFlowGraph, inOutData);