Esempio n. 1
0
        private void GenerateGenExprSets()
        {
            var bblocks = _baseBlockByStart.Select(kp => kp.Value).ToList();

            foreach (var bblock in bblocks)
            {
                _genExprByStart[bblock.StartLabel] = AvaliableExprs.GetGenExprSet(bblock);
            }
        }
Esempio n. 2
0
        public (List <ExprSet>, List <ExprSet>) GenerateInputOutputAvaliableExpr()
        {
            var In  = new List <ExprSet>();
            var Out = new List <ExprSet>();

            var startToId = GetStartToId(_bblocks);


            for (int i = 0; i < _bblocks.Count(); ++i)
            {
                In.Add(null);
                Out.Add(new ExprSet());

                if (i > 0)
                {
                    Out[i] = new ExprSet(_genExprByStart.SelectMany(kv => kv.Value.ToList()));
                }
            }

            bool change = true;

            while (change)
            {
                change = false;

                for (int i = 0; i < _bblocks.Count(); ++i)
                {
                    var st = _bblocks[i].StartLabel;

                    In[i] = null;

                    foreach (var p in Prev[st])
                    {
                        if (In[i] == null)
                        {
                            In[i] = new ExprSet(Out[startToId[p]]);
                        }
                        else
                        {
                            In[i].IntersectWith(Out[startToId[p]]);
                        }
                    }

                    int sz = Out[i].Count;

                    Out[i] = AvaliableExprs.TransferByGenAndKiller(In[i], _genExprByStart[st], _defByStart[st]);

                    change |= sz != Out[i].Count;
                }
            }

            return(In, Out);
        }
        public void IterativeAlgorithm(List <LinkedList <ThreeCode> > blocks)
        {
            var bb = new LinkedList <ThreeCode>();

            bb.AddLast(new ThreeCode("entry", "", ThreeOperator.None, null, null));
            var bs = blocks.ToList();

            // добавление пустого входного блока - необходимо для корректной работы ит. алгоритма
            bs.Insert(0, bb);
            // построение CFG по блокам
            controlFlowGraph = new CFG(bs);
            // создание информации о блоках
            var blocksInfo = new List <BlockInfo <Expr> >();

            for (int i = 0; i < bs.Count; i++)
            {
                blocksInfo.Add(new BlockInfo <Expr>(bs[i]));
            }

            // оператор сбора для доступных выражений
            Func <List <BlockInfo <Expr> >, CFG, int, BlockInfo <Expr> > meetOperator =
                (blocksInfos, graph, index) =>
            {
                var inputIndexes = graph.cfg.GetInputNodes(index);
                var resInfo      = new BlockInfo <Expr>(blocksInfos[index]);
                resInfo.IN = resInfo.OUT;     // универсальное множество
                foreach (var i in inputIndexes)
                {
                    resInfo.IN.IntersectWith(blocksInfos[i].OUT);
                }
                return(resInfo);
            };

            var transferFunction = AvaliableExprsAdaptor.TransferFunction();

            var U = new HashSet <Expr>(blocks.Select(b => b.Where(c =>
                                                                  AvaliableExprs.IsDefinition(c.operation))
                                                     .Select(c => (c.arg1, c.operation, c.arg2)))
                                       .Aggregate((s1, s2) => s1.Union(s2)));

            // создание объекта итерационного алгоритма
            var iterativeAlgorithm = new IterativeAlgorithm <Expr>(blocksInfo,
                                                                   controlFlowGraph, meetOperator, true, new HashSet <Expr>(), U, transferFunction);

            // выполнение алгоритма
            iterativeAlgorithm.Perform();
            Ins  = iterativeAlgorithm.GetINs();
            Outs = iterativeAlgorithm.GetOUTs();
        }
Esempio n. 4
0
        //Фукнция, возвращающая множества выражений, достпуных на входе и на выходе
        public (List <ExprSet>, List <ExprSet>) GenerateInputOutputAvaliableExpr(List <LinkedList <ThreeCode> > _bblocks)
        {
            //Множество выражений, доступных на входе IN[B] для всех ББл B
            var In = new List <ExprSet>();
            //Множество выражений, доступных на выходе OUT[B] для всех ББл B
            var Out = new List <ExprSet>();

            //Экземпляр класса AvaliableExprs для некоторых методов
            var ae = new AvaliableExprs();

            //e_genB
            Dictionary <int, ExprSet> _genExprByStart = new Dictionary <int, ExprSet>();

            Dictionary <int, List <HashSet <ThreeCode> > > _defByStart = new Dictionary <int, List <HashSet <ThreeCode> > >();

            for (int i = 0; i < _bblocks.Count; i++)
            {
                _genExprByStart[i] = AvaliableExprs.GetGenExprSet(_bblocks[i]);
            }

            for (int i = 0; i < _bblocks.Count; i++)
            {
                _defByStart[i] = InstructionGens(_bblocks[i]);
            }

            for (int i = 0; i < _bblocks.Count(); ++i)
            {
                In.Add(null);
                Out.Add(new ExprSet());

                if (i > 0)
                {
                    Out[i] = new ExprSet(_genExprByStart.SelectMany(kv => kv.Value.ToList()));
                }
            }

            //Внесены ли изменения в Out
            bool change = true;

            while (change)
            {
                change = false;

                //Каждый ББ отличный от входного
                for (int B = 1; B < _bblocks.Count(); ++B)
                {
                    In[B] = null;
                    var cfg          = new ControlFlowGraph(_bblocks);
                    var inputIndexes = cfg.cfg.GetInputNodes(B);
                    foreach (var P in inputIndexes)
                    {
                        //Проверяем, что коллекция еще не создана
                        if (In[B] == null)
                        {
                            In[B] = new ExprSet(Out[P]);
                        }
                        else
                        {
                            In[B].IntersectWith(Out[P]);
                        }
                    }

                    int sz = Out[B].Count;

                    Out[B] = AvaliableExprs.TransferByGenAndKiller(In[B],
                                                                   AvaliableExprs.GetGenExprSet(_bblocks[B]), AvaliableExprs.GetKillerSet(_bblocks[B]));

                    change |= sz != Out[B].Count;
                }
            }
            return(In, Out);
        }