OPT_RegisterOperand t = ir.regpool.makeTemp(VM_Type.BooleanType);
OPT_RegisterOperand t = ir.regpool.makeTemp(OPT_ClassLoaderProxy.BooleanType);
  private boolean generateBooleanCompare (OPT_IR ir, 					  OPT_BasicBlock bb, 					  OPT_Instruction cb, 					  OPT_BasicBlock tb) {        if ((cb.operator() != INT_IFCMP) && (cb.operator() != REF_IFCMP))      return false;    // make sure this is the last branch in the block    if (cb.getNext().operator() != BBEND)      return false;    OPT_Operand val1 = IfCmp.getVal1(cb);    OPT_Operand val2 = IfCmp.getVal2(cb);    OPT_ConditionOperand condition = IfCmp.getCond(cb);    // "not taken" path    OPT_BasicBlock fb = getNotTakenNextBlock(cb.getBasicBlock());    // make sure it's a diamond    if (tb.getNumberOfNormalOut() != 1)      return false;    if (fb.getNumberOfNormalOut() != 1)      return false;    OPT_BasicBlock jb = fb.getNormalOut().next();               // join block    // make sure it's a diamond    if (!tb.pointsOut(jb))      return false;    OPT_Instruction ti = tb.firstRealInstruction();    OPT_Instruction fi = fb.firstRealInstruction();    // make sure the instructions in target blocks are either both moves    // or both returns    if (ti == null || fi == null)      return false;    if (ti.operator() != fi.operator())      return false;    if (ti.operator != RETURN && ti.operator() != INT_MOVE)      return false;    //    // WARNING: This code is currently NOT exercised!    //    if (ti.operator() == RETURN) {      // make sure each of the target blocks contains only one instruction      if (ti != tb.lastRealInstruction())        return false;      if (fi != fb.lastRealInstruction())        return false;      OPT_Operand tr = Return.getVal(ti);      OPT_Operand fr = Return.getVal(fi);      // make sure we're returning constants      if (!(tr instanceof OPT_IntConstantOperand) ||           !(fr instanceof OPT_IntConstantOperand))        return false;      int tv = ((OPT_IntConstantOperand)tr).value;      int fv = ((OPT_IntConstantOperand)fr).value;      if (!((tv == 1 && fv == 0) || (tv == 1 && fv == 0)))        return false;      OPT_RegisterOperand t = ir.regpool.makeTemp(VM_Type.BooleanType);      // Cases 1) and 2)      if (tv == 0)        condition = condition.flipCode();      booleanCompareHelper(cb, t, val1, val2, condition);      cb.insertAfter(Return.create(RETURN, t.copyD2U()));    } else {      // (ti.operator() == INT_MOVE)      // make sure each of the target blocks only does the move      if (ti != tb.lastRealInstruction() &&           ti.nextInstructionInCodeOrder().operator()          != GOTO) return false;      if (fi != fb.lastRealInstruction() &&           fi.nextInstructionInCodeOrder().operator() != GOTO)        return false;      OPT_RegisterOperand t = Move.getResult(ti);      // make sure both moves are to the same register      if (t.register != Move.getResult(fi).register)        return false;      OPT_Operand tr = Move.getVal(ti);      OPT_Operand fr = Move.getVal(fi);      // make sure we're assigning constants      if (!(tr instanceof OPT_IntConstantOperand) ||           !(fr instanceof OPT_IntConstantOperand)) return false;      int tv = ((OPT_IntConstantOperand)tr).value;      int fv = ((OPT_IntConstantOperand)fr).value;      if (!((tv == 1 && fv == 0) || (tv == 0 && fv == 1)))        return false;      // Cases 3) and 4)      if (tv == 0)        condition = condition.flipCode();      booleanCompareHelper(cb, t, val1, val2, condition);      OPT_Instruction next = cb.nextInstructionInCodeOrder();      if (next.operator() == GOTO)        Goto.setTarget(next, jb.makeJumpTarget());       else         cb.insertAfter(jb.makeGOTO());    }    // fixup CFG    bb.deleteOut(tb);    bb.deleteOut(fb);    bb.insertOut(jb);           // Note: if we processed returns,                                 // jb is the exit node.    return true;  }