public void Apply(ref List <LinkedList <ThreeCode> > res) { // Добавление фиктивных узлов var entry = new LinkedList <ThreeCode>(); entry.AddFirst(new ThreeCode("entry", "", ThreeOperator.None, null, null)); var exit = new LinkedList <ThreeCode>(); exit.AddFirst(new ThreeCode("exit", "", ThreeOperator.None, null, null)); res.Insert(0, entry); res.Add(exit); // построение CFG по блокам CFG controlFlowGraph = new CFG(res); // вычисление множеств Def и Use для всего графа потоков данных var DefUse = new DefUseBlocks(controlFlowGraph); // вычисление множеств IN, OUT на основе DefUse var Out = new InOutActiveVariables(DefUse, controlFlowGraph).OutBlocks; // Выполнение оптимизации controlFlowGraph = ControlFlowOptimisations.DeadOrAliveOnGraph(Out, controlFlowGraph); // Удаление фиктивных узлов res = controlFlowGraph.blocks; res.RemoveAt(0); res.RemoveAt(res.Count - 1); }
public static CFG DeadOrAliveOptimization(List <LinkedList <ThreeCode> > blocks) { // построение CFG по блокам CFG controlFlowGraph = new CFG(blocks); // вычисление множеств Def и Use для всего графа потоков данных var DefUse = new DefUseBlocks(controlFlowGraph); // создание информации о блоках var blocksInfo = new List <BlockInfo <string> >(); for (int i = 0; i < DefUse.DefBs.Count; i++) { blocksInfo.Add(new BlockInfo <string>(DefUse.DefBs[i], DefUse.UseBs[i])); } // оператор сбора для анализа активных переменных Func <List <BlockInfo <string> >, CFG, int, BlockInfo <string> > meetOperator = (blocksInfos, graph, index) => { var successorIndexes = graph.cfg.GetOutputNodes(index); var resInfo = new BlockInfo <string>(blocksInfos[index]); foreach (var i in successorIndexes) { resInfo.OUT.UnionWith(blocksInfos[i].IN); } return(resInfo); }; // делегат передаточной функции для анализа активных переменных Func <BlockInfo <string>, BlockInfo <string> > tFunc = (blockInfo) => { blockInfo.IN = new HashSet <string>(); blockInfo.IN.UnionWith(blockInfo.OUT); blockInfo.IN.ExceptWith(blockInfo.HelpFirst); blockInfo.IN.UnionWith(blockInfo.HelpSecond); return(blockInfo); }; var transferFunction = new GenericTransferFunction.TransferFunction <BlockInfo <string> >(tFunc); // создание объекта итерационного алгоритма var iterativeAlgorithm = new IterativeAlgorithm <string>(blocksInfo, controlFlowGraph, meetOperator, false, new HashSet <string>(), new HashSet <string>(), transferFunction); // выполнение алгоритма iterativeAlgorithm.Perform(); controlFlowGraph = ControlFlowOptimisations.DeadOrAliveOnGraph( iterativeAlgorithm.GetOUTs(), controlFlowGraph); return(controlFlowGraph); }