/// <summary>
        /// Определение живых/мертвых переменных для участка кода
        /// </summary>
        /// <param name="listNode"></param>
        private void DetectionLiveAndDeadVariables(List <Node> listNode, Guid idx, IEnumerable <BasicBlock> parents)
        {
            // Определение живых мертвых переменных для блока
            var       LDV      = new LiveAndDeadVariables(listNode);
            var       deadVars = LDV.DeadVars;
            var       liveVars = LDV.LiveVars;
            ActiveVar vars     = OUT[idx];

            // Для каждой out переменной
            foreach (var v in vars)
            {
                // Если она есть в списке мертвых переменных
                var dVars = deadVars.FindAll(x => x.Name == v);
                if (dVars.Count != 0)
                {
                    // Находим самую последнюю переменную
                    var max = dVars.Max(x => x.StringId);
                    var j   = deadVars.FindIndex(x => x.Name == v && x.StringId == max);

                    // Перемещаем переменную в список живых переменных
                    liveVars.Add(new DUVar(deadVars[j].Name, deadVars[j].StringId));
                    deadVars.RemoveAt(j);
                }
            }

            // Для каждой in переменной
            foreach (var v in LDV.UListNotValid)
            {
                var IsExist = false;

                // Если существует определение переменной в родительском блоке
                foreach (var p in parents)
                {
                    IsExist |= OUT[p.BlockId].Contains(v.Name);
                }

                // Если она есть в списке неопределенных переменных
                if (IsExist)
                {
                    // Добавляем переменнцю в списко живых
                    liveVars.Add(new DUVar(v.Name, v.StringId));
                }
                else
                {
                    // Добавляем переменнцю в списко мертвых
                    deadVars.Add(new DUVar(v.Name, v.StringId));
                }
            }

            foreach (var dV in deadVars)
            {
                removeVars.Add(dV.StringId);
            }

            removeVars = removeVars.Distinct().ToList();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// ---- Test 1
        /// </summary>
        /// <returns></returns>
        public bool Test1()
        {
            // -------------------------------------------------------------------
            // Создание базового блока
            // -------------------------------------------------------------------
            var a = new Var("a");
            var y = new Var("y");
            var x = new Var("x");

            BasicBlock B = new BasicBlock(new List <Node> {
                AssignC(a, new IntConst(5)),                     // 0: a = 5
                AssignC(x, a),                                   // 1: x = a
                AssignC(a, new IntConst(4)),                     // 2: a = 4
                AssignC(x, new IntConst(3)),                     // 3: x = 3
                AssignC(y, x, new IntConst(5), OpCode.Plus),     // 4: y = x + 7
                PrintC(y),                                       // 5: print(y)
                PrintC(x)                                        // 6: print(x)
            });

            // -------------------------------------------------------------------
            // Тест для DefUse цепочек
            // -------------------------------------------------------------------

            DULists DL = new DULists(B);

            // -------------------------------------------------------------------
            // Тест для LiveAndDeadVariables
            // -------------------------------------------------------------------

            LiveAndDeadVariables LDV = new LiveAndDeadVariables(B);

            // -------------------------------------------------------------------
            // Тест для удаление мертвого кода
            // -------------------------------------------------------------------

            var B1 = LDV.BlockNew;

            BasicBlock B2 = new BasicBlock(new List <Node> {
                B.CodeList.ElementAt(3),                         // 0: x = 3
                B.CodeList.ElementAt(4),                         // 1: y = x + 5
                B.CodeList.ElementAt(5),                         // 2: print(y)
                B.CodeList.ElementAt(6)                          // 3: print(x)
            });

            var IsEqBlocks = B1.CodeList.Count() == B2.CodeList.Count();

            foreach (var command in B2.CodeList)
            {
                IsEqBlocks &= B1.CodeList.Contains(command);
            }

            // Должна получиться истина
            return(true);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// ---- Test 2
        /// </summary>
        /// <returns></returns>
        public bool Test2()
        {
            // -------------------------------------------------------------------
            // Создание базового блока
            // -------------------------------------------------------------------
            var a = new Var("a");
            var y = new Var("y");
            var x = new Var("x");

            BasicBlock B = new BasicBlock(new List <Node> {
                AssignC(a, new IntConst(5)),                     // 0: a = 5
                AssignC(x, a, new IntConst(4), OpCode.Plus),     // 1: x = a + 4
                AssignC(y, new IntConst(4), x, OpCode.Plus),     // 2: y = 4 + x
                AssignC(a, x, a, OpCode.Plus),                   // 3: a = x + a
                PrintC(y),                                       // 4: print(y)
                IfGotoC(a)                                       // 5: if (a) goto somewere
            });

            // -------------------------------------------------------------------
            // Тест для DefUse цепочек
            // -------------------------------------------------------------------

            DULists DL = new DULists(B);

            // -------------------------------------------------------------------
            // Тест для LiveAndDeadVariables
            // -------------------------------------------------------------------

            LiveAndDeadVariables LDV = new LiveAndDeadVariables(B);

            // -------------------------------------------------------------------
            // Тест для удаление мертвого кода
            // -------------------------------------------------------------------

            var B1 = LDV.BlockNew;

            var IsEqBlocks = B1.CodeList.Count() == B.CodeList.Count();

            foreach (var command in B.CodeList)
            {
                IsEqBlocks &= B1.CodeList.Contains(command);
            }

            // Должна получиться истина
            return(true);
        }