private void buildDominatorTree() { VBStyleCollection<Integer, Integer> orderedIDoms = domEngine.getOrderedIDoms(); List<Integer> lstKeys = orderedIDoms.getLstKeys(); for (int index = lstKeys.size() - 1; index >= 0; index--) { Integer key = lstKeys.get(index); Integer idom = orderedIDoms.get(index); mapTreeBranches.computeIfAbsent(idom, k -> new HashSet<>()).add(key); } Integer firstid = statement.getFirst().id; mapTreeBranches.get(firstid).remove(firstid); }
private void calcIDoms() { orderNodes(); List<IGraphNode> lstNodes = colOrderedIDoms.getLstKeys(); while (true) { boolean changed = false; for (IGraphNode node : lstNodes) { IGraphNode idom = null; if (!setRoots.contains(node)) { for (IGraphNode pred : node.getPredecessors()) { if (colOrderedIDoms.getWithKey(pred) != null) { idom = getCommonIDom(idom, pred, colOrderedIDoms); if (idom == null) { break; // no idom found: merging point of two trees } } } } if (idom == null) { idom = node; } IGraphNode oldidom = colOrderedIDoms.putWithKey(idom, node); if (!idom.equals(oldidom)) { // oldidom is null iff the node is touched for the first time changed = true; } } if (!changed) { break; } } }
private void calcIDoms() { orderStatements(); colOrderedIDoms.putWithKey(statement.getFirst().id, statement.getFirst().id); // exclude first statement List<Integer> lstIds = colOrderedIDoms.getLstKeys().subList(1, colOrderedIDoms.getLstKeys().size()); while (true) { boolean changed = false; for (Integer id : lstIds) { Statement stat = statement.getStats().getWithKey(id); Integer idom = null; for (StatEdge edge : stat.getAllPredecessorEdges()) { if (colOrderedIDoms.getWithKey(edge.getSource().id) != null) { idom = getCommonIDom(idom, edge.getSource().id, colOrderedIDoms); } } Integer oldidom = colOrderedIDoms.putWithKey(idom, id); if (!idom.equals(oldidom)) { changed = true; } } if (!changed) { break; } } }
private void buildDominatorTree() { VBStyleCollection<Integer, Integer> orderedIDoms = domEngine.getOrderedIDoms(); List<Integer> lstKeys = orderedIDoms.getLstKeys(); for (int index = lstKeys.size() - 1; index >= 0; index--) { Integer key = lstKeys.get(index); Integer idom = orderedIDoms.get(index); Set<Integer> set = mapTreeBranches.get(idom); if (set == null) { mapTreeBranches.put(idom, set = new HashSet<>()); } set.add(key); } Integer firstid = statement.getFirst().id; mapTreeBranches.get(firstid).remove(firstid); }
private void calcIDoms() { orderNodes(); List<IGraphNode> lstNodes = colOrderedIDoms.getLstKeys(); while (true) { boolean changed = false; for (IGraphNode node : lstNodes) { IGraphNode idom = null; if (!setRoots.contains(node)) { for (IGraphNode pred : node.getPredecessors()) { if (colOrderedIDoms.getWithKey(pred) != null) { idom = getCommonIDom(idom, pred, colOrderedIDoms); if (idom == null) { break; // no idom found: merging point of two trees } } } } if (idom == null) { idom = node; } IGraphNode oldidom = colOrderedIDoms.putWithKey(idom, node); if (!idom.equals(oldidom)) { // oldidom is null iff the node is touched for the first time changed = true; } } if (!changed) { break; } } }
private void calcIDoms() { orderStatements(); colOrderedIDoms.putWithKey(statement.getFirst().id, statement.getFirst().id); // exclude first statement List<Integer> lstIds = colOrderedIDoms.getLstKeys().subList(1, colOrderedIDoms.getLstKeys().size()); while (true) { boolean changed = false; for (Integer id : lstIds) { Statement stat = statement.getStats().getWithKey(id); Integer idom = null; for (StatEdge edge : stat.getAllPredecessorEdges()) { if (colOrderedIDoms.getWithKey(edge.getSource().id) != null) { idom = getCommonIDom(idom, edge.getSource().id, colOrderedIDoms); } } Integer oldidom = colOrderedIDoms.putWithKey(idom, id); if (!idom.equals(oldidom)) { changed = true; } } if (!changed) { break; } } }