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);
        }
Example #2
0
 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);
 }