boolean (Statement stat, HashMap<Integer, Set<Integer>> mapExtPost) { boolean found, success = false; do { found = false; List<Statement> lstStats = stat.getPostReversePostOrderList(); for (Statement st : lstStats) { Statement result = detectStatement(st); if (result != null) { if (stat.type == StatementType.GENERAL && result.getFirst() == stat.getFirst() && stat.getStats().size() == result.getStats().size()) { // mark general statement stat.type = StatementType.PLACEHOLDER; } stat.collapseNodesToStatement(result); // update the postdominator map if (!mapExtPost.isEmpty()) { HashSet<Integer> setOldNodes = new HashSet<>(); for (Statement old : result.getStats()) { setOldNodes.add(old.id); } Integer newid = result.id; for (Integer key : new ArrayList<>(mapExtPost.keySet())) { Set<Integer> set = mapExtPost.get(key); int oldsize = set.size(); set.removeAll(setOldNodes); if (setOldNodes.contains(key)) { mapExtPost.computeIfAbsent(newid, k -> new HashSet<>()).addAll(set); mapExtPost.remove(key); } else { if (set.size() < oldsize) { set.add(newid); } } } } found = true; break; } } if (found) { success = true; } } while (found); return success; }