/// <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); } }
/// <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); }