Esempio n. 1
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);
        }
Esempio n. 2
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);
        }