if (bb == null) return false;
  private boolean hasCMTaboo(OPT_BasicBlock bb) {    // Note: it is taboo to assign more than once to any register in the    // block.    HashSet defined = new HashSet();    for (Enumeration e = bb.forwardRealInstrEnumerator();         e.hasMoreElements(); ) {      OPT_Instruction s = (OPT_Instruction)e.nextElement();      if (s.isBranch()) continue;      // for now, only the following opcodes are legal.      switch (s.operator.opcode) {        case INT_MOVE_opcode:        case REF_MOVE_opcode:        case MATERIALIZE_CONSTANT_opcode:        case INT_ADD_opcode:        case INT_SUB_opcode:        case INT_MUL_opcode:        case INT_NEG_opcode:        case INT_SHL_opcode:        case INT_SHR_opcode:        case INT_USHR_opcode:        case INT_AND_opcode:        case INT_OR_opcode:        case INT_XOR_opcode:        case INT_NOT_opcode:        case INT_2BYTE_opcode:        case INT_2USHORT_opcode:        case INT_2SHORT_opcode:          // these are OK.          break;        default:          return true;      }                  // make sure no register is defined more than once in this block.      for (Enumeration defs = s.getDefs(); defs.hasMoreElements(); ) {        OPT_Operand def = (OPT_Operand)defs.nextElement();        if (VM.VerifyAssertions) VM.assert(def.isRegister());        OPT_Register r = def.asRegister().register;        if (defined.contains(r)) return true;        defined.add(r);      }    }    return false;  }