private static List <BasicBlock> GetReachableBlocksRestricted(BasicBlock start, ExceptionRangeCFG range, GenericDominatorEngine engine) { List <BasicBlock> lstRes = new List <BasicBlock>(); LinkedList <BasicBlock> stack = new LinkedList <BasicBlock>(); HashSet <BasicBlock> setVisited = new HashSet <BasicBlock>(); stack.AddFirst(start); while (!(stack.Count == 0)) { BasicBlock block = Sharpen.Collections.RemoveFirst(stack); setVisited.Add(block); if (range.GetProtectedRange().Contains(block) && engine.IsDominator(block, start)) { lstRes.Add(block); List <BasicBlock> lstSuccs = new List <BasicBlock>(block.GetSuccs()); Sharpen.Collections.AddAll(lstSuccs, block.GetSuccExceptions()); foreach (BasicBlock succ in lstSuccs) { if (!setVisited.Contains(succ)) { stack.AddLast(succ); } } } } return(lstRes); }
public virtual bool IsDominatorSet(VarVersionNode node, HashSet <VarVersionNode> domnodes ) { if (domnodes.Count == 1) { var enumerator = domnodes.GetEnumerator(); enumerator.MoveNext(); return(engine.IsDominator(node, enumerator.Current)); } else { HashSet <VarVersionNode> marked = new HashSet <VarVersionNode>(); if (domnodes.Contains(node)) { return(true); } LinkedList <VarVersionNode> lstNodes = new LinkedList <VarVersionNode>(); lstNodes.AddLast(node); while (!(lstNodes.Count == 0)) { VarVersionNode nd = lstNodes.RemoveAtReturningValue(0); if (marked.Contains(nd)) { continue; } else { marked.Add(nd); } if ((nd.preds.Count == 0)) { return(false); } foreach (VarVersionEdge edge in nd.preds) { VarVersionNode pred = edge.source; if (!marked.Contains(pred) && !domnodes.Contains(pred)) { lstNodes.AddLast(pred); } } } } return(true); }