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);
        }
示例#3
0
        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);