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