removeCondBranch(candBB, candTest, ir);
removeCondBranch(candBB, candTest, ir, poss);
    public final void perform (OPT_IR ir) {      // (1) Remove redundant conditional branches and locally fix the PHIs      OPT_GlobalValueNumberState gvns = ir.HIRInfo.valueNumbers;      OPT_DominatorTree dt = ir.HIRInfo.dominatorTree;      for (OPT_BasicBlockEnumeration bbs = ir.getBasicBlocks();           bbs.hasMoreElements();) {        OPT_BasicBlock candBB = bbs.next();        OPT_Instruction candTest = candBB.firstBranchInstruction();        if (candTest == null) continue;        if (!(IfCmp.conforms(candTest) || InlineGuard.conforms(candTest))) continue;        OPT_GVCongruenceClass cc = gvns.congruenceClass(candTest);        if (cc.size() > 1) {          for (Iterator e = cc.iterator(); e.hasNext();) {            OPT_Instruction poss = (OPT_Instruction)((OPT_ValueGraphVertex)e.next()).name;            if (poss != candTest) {              OPT_BasicBlock notTaken = getNotTakenBlock(poss);              OPT_BasicBlock taken = poss.getBranchTarget();              if (taken == notTaken) continue; // both go to same block, so we don't know anything!              if (notTaken.hasOneIn() && dt.dominates(notTaken, candBB)) {                if (DEBUG) VM.sysWrite(candTest + " is dominated by not-taken branch of "+poss+"\n");                removeCondBranch(candBB, candTest, ir);                cc.removeVertex(gvns.valueGraph.getVertex(candTest));                break;              }              if (taken.hasOneIn() && dt.dominates(taken, candBB)) {                if (DEBUG) VM.sysWrite(candTest + " is dominated by taken branch of "+poss+"\n");                takeCondBranch(candBB, candTest, ir);                cc.removeVertex(gvns.valueGraph.getVertex(candTest));                break;              }            }          }        }      }      // (2) perform a Depth-first search of the control flow graph,      //     and remove any nodes we have made unreachable       removeUnreachableCode(ir);    }