boolean (SSAUConstructorSparseEx ssa, VarVersionPair var, List<? super VarVersionNode> res) { VarVersionsGraph ssuversions = ssa.getSsuversions(); VarVersionNode varnode = ssuversions.nodes.getWithKey(var); Set<VarVersionNode> setVisited = new HashSet<>(); Set<VarVersionNode> setNotDoms = new HashSet<>(); LinkedList<VarVersionNode> stack = new LinkedList<>(); stack.add(varnode); while (!stack.isEmpty()) { VarVersionNode nd = stack.remove(0); setVisited.add(nd); if (nd != varnode && (nd.flags & VarVersionNode.FLAG_PHANTOM_FIN_EXIT) == 0) { res.add(nd); } for (VarVersionEdge edge : nd.successors) { VarVersionNode succ = edge.dest; if (!setVisited.contains(edge.dest)) { boolean isDominated = true; for (VarVersionEdge prededge : succ.predecessors) { if (!setVisited.contains(prededge.source)) { isDominated = false; break; } } if (isDominated) { stack.add(succ); } else { setNotDoms.add(succ); } } } } setNotDoms.removeAll(setVisited); return !setNotDoms.isEmpty(); }