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

            foreach (var bblock in bblocks)
            {
                _genExprByStart[bblock.StartLabel] = AvaliableExprs.GetGenExprSet(bblock);
            }
        }
Example #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);
        }