public (List <VarsSet>, List <VarsSet>) GenerateInputOutputActiveDefs() { var In = new List <VarsSet>(); var Out = new List <VarsSet>(); var startToId = GetStartToId(_bblocks); for (int i = 0; i < _bblocks.Count(); ++i) { In.Add(new VarsSet()); Out.Add(new VarsSet()); } bool change = true; while (change) { change = false; for (int i = 0; i < _bblocks.Count(); ++i) { var st = _bblocks[i].StartLabel; Out[i] = new VarsSet(Next[st].SelectMany(p => In[startToId[p]])); int sz = In[i].Count; In[i] = ActiveDefinitions.TransferByUseAndDef(Out[i], _useByStart[st], _defByStart[st]); change |= sz != In[i].Count; } } return(In, Out); }
public static VarsSet TransferByUseAndDef(VarsSet X, VarsSet use, VarsSet def) { if (X == null) { return(use); } return(new VarsSet(X.Except(def).Union(use))); }
public static VarsSet GetUseSet(BaseBlock bblock) { var ret = new VarsSet(); foreach (var line in bblock.Code) { if (line.LeftOp != null && !IsConst(line.LeftOp)) { ret.Add(line.LeftOp); } if (line.RightOp != null && !IsConst(line.RightOp)) { ret.Add(line.RightOp); } } return(ret); }