private static bool IsVersionToBeReplaced(VarVersionPair usedvar, Dictionary <int , HashSet <VarVersionPair> > mapVars, SSAUConstructorSparseEx ssau, VarVersionPair leftpaar) { VarVersionsGraph ssuversions = ssau.GetSsuversions(); SFormsFastMapDirect mapLiveVars = ssau.GetLiveVarVersionsMap(usedvar); if (mapLiveVars == null) { // dummy version, predecessor of a phi node return(false); } // compare protected ranges if (!InterpreterUtil.EqualObjects(ssau.GetMapVersionFirstRange().GetOrNullable(leftpaar ), ssau.GetMapVersionFirstRange().GetOrNullable(usedvar))) { return(false); } foreach (KeyValuePair <int, HashSet <VarVersionPair> > ent in mapVars) { FastSparseSetFactory <int> .FastSparseSet <int> liveverset = mapLiveVars.Get(ent.Key); if (liveverset == null) { return(false); } HashSet <VarVersionNode> domset = new HashSet <VarVersionNode>(); foreach (VarVersionPair verpaar in ent.Value) { domset.Add(ssuversions.nodes.GetWithKey(verpaar)); } bool isdom = false; foreach (int livever in liveverset) { VarVersionNode node = ssuversions.nodes.GetWithKey(new VarVersionPair(ent.Key, livever )); if (ssuversions.IsDominatorSet(node, domset)) { isdom = true; break; } } if (!isdom) { return(false); } } return(true); }
private static bool GetUsedVersions(SSAUConstructorSparseEx ssa, VarVersionPair var, List <VarVersionNode> res) { VarVersionsGraph ssuversions = ssa.GetSsuversions(); VarVersionNode varnode = ssuversions.nodes.GetWithKey(var); HashSet <VarVersionNode> setVisited = new HashSet <VarVersionNode>(); HashSet <VarVersionNode> setNotDoms = new HashSet <VarVersionNode>(); LinkedList <VarVersionNode> stack = new LinkedList <VarVersionNode>(); stack.AddLast(varnode); while (!(stack.Count == 0)) { VarVersionNode nd = stack.RemoveAtReturningValue(0); setVisited.Add(nd); if (nd != varnode && (nd.flags & VarVersionNode.Flag_Phantom_Finexit) == 0) { res.Add(nd); } foreach (VarVersionEdge edge in nd.succs) { VarVersionNode succ = edge.dest; if (!setVisited.Contains(edge.dest)) { bool isDominated = true; foreach (VarVersionEdge prededge in succ.preds) { if (!setVisited.Contains(prededge.source)) { isDominated = false; break; } } if (isDominated) { stack.AddLast(succ); } else { setNotDoms.Add(succ); } } } } setNotDoms.RemoveAll(setVisited); return(!(setNotDoms.Count == 0)); }