Exemple #1
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);
        }
        /// <summary>
        /// Создает Def и Use множества для базового блока
        /// </summary>
        private void BuildDUSets()
        {
            var duLists = new DULists(Block);

            foreach (var d in duLists.DList)
            {
                DSet.Add(d.DefVariable.Name);
            }

            foreach (var u in duLists.UListNotValid)
            {
                USet.Add(u.Name);
            }
        }
Exemple #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);
        }