boolean (IfNode rtnode) { if (rtnode.edgetypes.get(0) == 0) { IfNode ifbranch = rtnode.succs.get(0); if (ifbranch.succs.size() == 2) { // if-if branch if (ifbranch.succs.get(1).value == rtnode.succs.get(1).value) { IfStatement ifparent = (IfStatement)rtnode.value; IfStatement ifchild = (IfStatement)ifbranch.value; Statement ifinner = ifbranch.succs.get(0).value; if (ifchild.getFirst().getExprents().isEmpty()) { ifparent.getFirst().removeSuccessor(ifparent.getIfEdge()); ifchild.removeSuccessor(ifchild.getAllSuccessorEdges().get(0)); ifparent.getStats().removeWithKey(ifchild.id); if (ifbranch.edgetypes.get(0) == 1) { // target null ifparent.setIfstat(null); StatEdge ifedge = ifchild.getIfEdge(); ifchild.getFirst().removeSuccessor(ifedge); ifedge.setSource(ifparent.getFirst()); if (ifedge.closure == ifchild) { ifedge.closure = null; } ifparent.getFirst().addSuccessor(ifedge); ifparent.setIfEdge(ifedge); } else { ifchild.getFirst().removeSuccessor(ifchild.getIfEdge()); StatEdge ifedge = new StatEdge(EdgeType.REGULAR, ifparent.getFirst(), ifinner); ifparent.getFirst().addSuccessor(ifedge); ifparent.setIfEdge(ifedge); ifparent.setIfstat(ifinner); ifparent.getStats().addWithKey(ifinner, ifinner.id); ifinner.setParent(ifparent); if (!ifinner.getAllSuccessorEdges().isEmpty()) { StatEdge edge = ifinner.getAllSuccessorEdges().get(0); if (edge.closure == ifchild) { edge.closure = null; } } } // merge if conditions IfExprent statexpr = ifparent.getHeadexprent(); List<Exprent> lstOperands = new ArrayList<>(); lstOperands.add(statexpr.getCondition()); lstOperands.add(ifchild.getHeadexprent().getCondition()); statexpr.setCondition(new FunctionExprent(FunctionExprent.FUNCTION_CADD, lstOperands, null)); statexpr.addBytecodeOffsets(ifchild.getHeadexprent().bytecode); return true; } } } } return false; }