private void GenerateGenExprSets() { var bblocks = _baseBlockByStart.Select(kp => kp.Value).ToList(); foreach (var bblock in bblocks) { _genExprByStart[bblock.StartLabel] = AvaliableExprs.GetGenExprSet(bblock); } }
public (List <ExprSet>, List <ExprSet>) GenerateInputOutputAvaliableExpr() { var In = new List <ExprSet>(); var Out = new List <ExprSet>(); var startToId = GetStartToId(_bblocks); for (int i = 0; i < _bblocks.Count(); ++i) { In.Add(null); Out.Add(new ExprSet()); if (i > 0) { Out[i] = new ExprSet(_genExprByStart.SelectMany(kv => kv.Value.ToList())); } } bool change = true; while (change) { change = false; for (int i = 0; i < _bblocks.Count(); ++i) { var st = _bblocks[i].StartLabel; In[i] = null; foreach (var p in Prev[st]) { if (In[i] == null) { In[i] = new ExprSet(Out[startToId[p]]); } else { In[i].IntersectWith(Out[startToId[p]]); } } int sz = Out[i].Count; Out[i] = AvaliableExprs.TransferByGenAndKiller(In[i], _genExprByStart[st], _defByStart[st]); change |= sz != Out[i].Count; } } return(In, Out); }
public void IterativeAlgorithm(List <LinkedList <ThreeCode> > blocks) { var bb = new LinkedList <ThreeCode>(); bb.AddLast(new ThreeCode("entry", "", ThreeOperator.None, null, null)); var bs = blocks.ToList(); // добавление пустого входного блока - необходимо для корректной работы ит. алгоритма bs.Insert(0, bb); // построение CFG по блокам controlFlowGraph = new CFG(bs); // создание информации о блоках var blocksInfo = new List <BlockInfo <Expr> >(); for (int i = 0; i < bs.Count; i++) { blocksInfo.Add(new BlockInfo <Expr>(bs[i])); } // оператор сбора для доступных выражений Func <List <BlockInfo <Expr> >, CFG, int, BlockInfo <Expr> > meetOperator = (blocksInfos, graph, index) => { var inputIndexes = graph.cfg.GetInputNodes(index); var resInfo = new BlockInfo <Expr>(blocksInfos[index]); resInfo.IN = resInfo.OUT; // универсальное множество foreach (var i in inputIndexes) { resInfo.IN.IntersectWith(blocksInfos[i].OUT); } return(resInfo); }; var transferFunction = AvaliableExprsAdaptor.TransferFunction(); var U = new HashSet <Expr>(blocks.Select(b => b.Where(c => AvaliableExprs.IsDefinition(c.operation)) .Select(c => (c.arg1, c.operation, c.arg2))) .Aggregate((s1, s2) => s1.Union(s2))); // создание объекта итерационного алгоритма var iterativeAlgorithm = new IterativeAlgorithm <Expr>(blocksInfo, controlFlowGraph, meetOperator, true, new HashSet <Expr>(), U, transferFunction); // выполнение алгоритма iterativeAlgorithm.Perform(); Ins = iterativeAlgorithm.GetINs(); Outs = iterativeAlgorithm.GetOUTs(); }
//Фукнция, возвращающая множества выражений, достпуных на входе и на выходе public (List <ExprSet>, List <ExprSet>) GenerateInputOutputAvaliableExpr(List <LinkedList <ThreeCode> > _bblocks) { //Множество выражений, доступных на входе IN[B] для всех ББл B var In = new List <ExprSet>(); //Множество выражений, доступных на выходе OUT[B] для всех ББл B var Out = new List <ExprSet>(); //Экземпляр класса AvaliableExprs для некоторых методов var ae = new AvaliableExprs(); //e_genB Dictionary <int, ExprSet> _genExprByStart = new Dictionary <int, ExprSet>(); Dictionary <int, List <HashSet <ThreeCode> > > _defByStart = new Dictionary <int, List <HashSet <ThreeCode> > >(); for (int i = 0; i < _bblocks.Count; i++) { _genExprByStart[i] = AvaliableExprs.GetGenExprSet(_bblocks[i]); } for (int i = 0; i < _bblocks.Count; i++) { _defByStart[i] = InstructionGens(_bblocks[i]); } for (int i = 0; i < _bblocks.Count(); ++i) { In.Add(null); Out.Add(new ExprSet()); if (i > 0) { Out[i] = new ExprSet(_genExprByStart.SelectMany(kv => kv.Value.ToList())); } } //Внесены ли изменения в Out bool change = true; while (change) { change = false; //Каждый ББ отличный от входного for (int B = 1; B < _bblocks.Count(); ++B) { In[B] = null; var cfg = new ControlFlowGraph(_bblocks); var inputIndexes = cfg.cfg.GetInputNodes(B); foreach (var P in inputIndexes) { //Проверяем, что коллекция еще не создана if (In[B] == null) { In[B] = new ExprSet(Out[P]); } else { In[B].IntersectWith(Out[P]); } } int sz = Out[B].Count; Out[B] = AvaliableExprs.TransferByGenAndKiller(In[B], AvaliableExprs.GetGenExprSet(_bblocks[B]), AvaliableExprs.GetKillerSet(_bblocks[B])); change |= sz != Out[B].Count; } } return(In, Out); }