void (IReachabilityAction action, EdgeType edgetype) { while (true) { boolean iterate = false; HashMap<Integer, FastFixedSet<Integer>> mapSets = new HashMap<>(); for (Statement stat : lstReversePostOrderList) { FastFixedSet<Integer> set = factory.spawnEmptySet(); set.add(stat.id); for (StatEdge prededge : stat.getAllPredecessorEdges()) { if ((prededge.getType().mask() & edgetype.mask()) != 0) { Statement pred = prededge.getSource(); FastFixedSet<Integer> setPred = mapSets.get(pred.id); if (setPred == null) { setPred = mapSupportPoints.get(pred.id); } if (setPred != null) { set.union(setPred); } } } mapSets.put(stat.id, set); if (action != null) { iterate |= action.action(stat, mapSets); } // remove reachability information of fully processed nodes (saves memory) for (StatEdge prededge : stat.getAllPredecessorEdges()) { if ((prededge.getType().mask() & edgetype.mask()) != 0) { Statement pred = prededge.getSource(); if (mapSets.containsKey(pred.id)) { boolean remstat = true; for (StatEdge sucedge : pred.getAllSuccessorEdges()) { if ((sucedge.getType().mask() & edgetype.mask()) != 0) { if (!mapSets.containsKey(sucedge.getDestination().id)) { remstat = false; break; } } } if (remstat) { mapSets.put(pred.id, null); } } } } } if (!iterate) { break; } } }