private void CalculateInOut(ControlFlowGraph cfg, List <BasicBlock> blocks) { if (!Out.ContainsKey(cfg.start)) { Out.Add(cfg.start, AvailableExpressionsTable.NewEmpty()); } foreach (var block in blocks) { CreateGen(block); CreateKill(block); Out.Add(block, AvailableExpressionsTable.NewUniversal()); } var changed = true; while (changed) { changed = false; foreach (var block in blocks) { var prevOuts = new List <AvailableExpressionsTable>(); foreach (var prev in block.In) { prevOuts.Add(Out[prev]); } In[block] = AvailableExpressionsTable.Intersection(prevOuts); var oldOut = Out[block]; Out[block] = CalculateOut(In[block], block); if (!oldOut.Equals(Out[block])) { changed = true; } } } }
public static AvailableExpressionsTable NewEmpty() { var res = new AvailableExpressionsTable(); res.IsEmpty = true; return(res); }
public static AvailableExpressionsTable NewUniversal() { var res = new AvailableExpressionsTable(); res.IsUniversal = true; return(res); }
public AvailableExpressionsTable CalculateOut(AvailableExpressionsTable inTable, BasicBlock block) { var newTable = inTable.Copy(); var kill = kills[block]; foreach (var killVariable in kill.KillVariables) { newTable.RemoveExpressions(killVariable); } newTable.AddExpressions(kill.GenExpressions, kill.GenInstructions); return(newTable); }