private String getCommaSeparatedPath(DFANode node, DFAGraph graph, List<DFANode> pdtNodeList) {
   LinkedList<DFANode> list = new LinkedList<DFANode>();
   list.add(node);
   Set<DFANode> preds = node.getPreds();
   while (preds != null && preds.size() > 0) {
     DFANode parent = preds.iterator().next();
     list.addFirst(parent);
     preds = parent.getPreds();
   }
   StringBuffer retStr = new StringBuffer();
   for (DFANode dfa : list) {
     retStr.append(pdtNodeList.indexOf(dfa));
     retStr.append(",");
   }
   if (PrintTools.getVerbosity() > 1)
     System.out.println(
         "String: "
             + retStr.toString()
             + ", for node: "
             + ((DFANode) ((DFANode) node.getData("revNode")).getData("cfgNode")).getData("ir")
             + "("
             + ((DFANode) ((DFANode) node.getData("revNode")).getData("cfgNode")).getData("tag")
             + ")");
   return retStr.toString();
 }
 private Set<CFGEdge> extractNonPostdominatingEdges(
     DFAGraph reverseCFG, DFAGraph postDomTree, Procedure proc) {
   if (PrintTools.getVerbosity() > 1)
     System.out.println("[extractNonPostdominatingEdges]Proc: " + proc.getSymbolName());
   Set<CFGEdge> retSet = new HashSet<CFGEdge>();
   // extract all the edges from CFG
   Set<CFGEdge> allEdgeList = new HashSet<CFGEdge>();
   Iterator<DFANode> iter = reverseCFG.iterator();
   while (iter.hasNext()) {
     DFANode currentNode = iter.next();
     Set<DFANode> predSet = currentNode.getPreds();
     for (DFANode pred : predSet) {
       // In the reversed cfg, pred is succ in CFG
       allEdgeList.add(new CFGEdge(currentNode, pred));
     }
   }
   List<DFANode> entryNodes = postDomTree.getEntryNodes();
   if (entryNodes.size() != 1) {
     throw new RuntimeException(
         "Size of Entry node on PD Tree is not 1. Size: " + entryNodes.size());
   }
   DFANode entryNode = entryNodes.get(0);
   // extract edge which head does not postdominate tail
   // (head is not parent of tail on PostDomTree)
   for (CFGEdge edge : allEdgeList) {
     //
     DFANode pdtTail = (DFANode) edge.tail.getData("pdtNode");
     DFANode pdtHead = (DFANode) edge.head.getData("pdtNode");
     Set<DFANode> predSet = pdtTail.getPreds();
     boolean postDom = false;
     while (predSet.size() != 0) {
       if (predSet.size() > 1) {
         throw new RuntimeException("The size of predecessor is expected to be less than 2");
       }
       DFANode pdtNode = predSet.iterator().next();
       if (pdtNode.equals(pdtHead)) {
         postDom = true;
         break;
       }
       predSet = pdtNode.getPreds();
     }
     if (postDom == false) {
       retSet.add(edge);
       if (PrintTools.getVerbosity() > 1)
         System.out.println(
             "Found Edge: "
                 + ((DFANode) edge.tail.getData("cfgNode")).getData("ir")
                 + " --> "
                 + ((DFANode) edge.head.getData("cfgNode")).getData("ir")
                 + "("
                 + ((DFANode) edge.head.getData("cfgNode")).getData("tag")
                 + ")");
     }
   }
   return retSet;
 }
 private Set<DFANode> getControlDependentSet(CFGEdge edge, DFANode commonAncestor) {
   Set<DFANode> retSet = new HashSet<DFANode>();
   DFANode pdtHead = edge.head.getData("pdtNode");
   Set<DFANode> preds = pdtHead.getPreds();
   retSet.add(pdtHead);
   while (preds != null && preds.size() > 0) {
     DFANode parent = preds.iterator().next();
     if (parent.equals(commonAncestor)) {
       break;
     }
     retSet.add(parent);
     preds = parent.getPreds();
   }
   return retSet;
 }