if (op != NEWARRAY)
if (!(op == NEWARRAY || op == NEWARRAY_UNRESOLVED))
  static void arrayPropagation (OPT_IR ir) {    // Use register list to enumerate register objects (FAST)    OPT_Register elemNext;    for (OPT_Register reg = ir.regpool.getFirstRegister(); reg != null;         reg = elemNext) {      elemNext = (OPT_Register)reg.getNext();      if (reg.useList == null)        continue;      if (reg.defList == null)        continue;      if (!reg.isSSA())        continue;      // Now reg has exactly one definition      OPT_RegisterOperand lhs = reg.defList;      OPT_Instruction instr = lhs.instruction;      OPT_Operator op = instr.operator();      if (op != NEWARRAY)        continue;      OPT_Operand sizeOp = NewArray.getSize(instr);      // check for an array whose length is a compile-time constant      // or an SSA register      boolean boundsCheckOK = false;      boolean arraylengthOK = false;      int size = -1;      if (sizeOp instanceof OPT_IntConstantOperand) {        size = ((OPT_IntConstantOperand)sizeOp).value;        boundsCheckOK = true;        arraylengthOK = true;      } else if (sizeOp instanceof OPT_RegisterOperand) {        if (sizeOp.asRegister().register.isSSA())          arraylengthOK = true;      }      // Now propagate      for (OPT_RegisterOperand use = reg.useList; use != null;           use = (OPT_RegisterOperand)use.getNext()) {        OPT_Instruction i = use.instruction;        // bounds-check elimination        if (boundsCheckOK && i.getOpcode() == BOUNDS_CHECK_opcode) {          OPT_Operand indexOp = BoundsCheck.getIndex(i);          if (indexOp instanceof OPT_IntConstantOperand) {            if (((OPT_IntConstantOperand)indexOp).value <= size) {              OPT_Instruction s = Move.create(GUARD_MOVE,                   BoundsCheck.getGuardResult(i).copyD2D(),                   new OPT_TrueGuardOperand());              s.position = i.position;              s.bcIndex = i.bcIndex;              i.insertAfter(s);              OPT_DefUse.updateDUForNewInstruction(s);              OPT_DefUse.removeInstructionAndUpdateDU(i);            }          }        } else if (arraylengthOK && i.getOpcode() == ARRAYLENGTH_opcode) {          OPT_Operand newSizeOp = sizeOp.copy();          OPT_RegisterOperand result = (OPT_RegisterOperand)              GuardedUnary.getResult(i).copy();          OPT_Instruction s = Move.create(INT_MOVE, result, newSizeOp);          s.position = i.position;          s.bcIndex = i.bcIndex;          i.insertAfter(s);          OPT_DefUse.updateDUForNewInstruction(s);          OPT_DefUse.removeInstructionAndUpdateDU(i);        }      }    }  }