--- old/src/share/vm/c1/c1_Canonicalizer.cpp 2016-02-18 12:24:43.186776778 +0300 +++ new/src/share/vm/c1/c1_Canonicalizer.cpp 2016-02-18 12:24:43.134777009 +0300 @@ -222,29 +222,31 @@ } void Canonicalizer::do_ArrayLength (ArrayLength* x) { - NewArray* array = x->array()->as_NewArray(); - if (array != NULL && array->length() != NULL) { - Constant* length = array->length()->as_Constant(); - if (length != NULL) { - // do not use the Constant itself, but create a new Constant - // with same value Otherwise a Constant is live over multiple - // blocks without being registered in a state array. + NewArray* na; + LoadField* lf; + Constant* ct; + + if ((na = x->array()->as_NewArray()) != NULL) { + // New arrays might have the known length. + // Do not use the Constant itself, but create a new Constant + // with same value Otherwise a Constant is live over multiple + // blocks without being registered in a state array. + Constant* length; + if (na->length() != NULL && + (length = na->length()->as_Constant()) != NULL) { assert(length->type()->as_IntConstant() != NULL, "array length must be integer"); set_constant(length->type()->as_IntConstant()->value()); } - } else { - LoadField* lf = x->array()->as_LoadField(); - if (lf != NULL) { - ciField* field = lf->field(); - if (field->is_constant() && field->is_static()) { - // final static field - ciObject* c = field->constant_value().as_object(); - if (c->is_array()) { - ciArray* array = (ciArray*) c; - set_constant(array->length()); - } - } - } + + } else if ((ct = x->array()->as_Constant()) != NULL) { + // Constant arrays have constant lengths. + set_constant(ct->type()->as_ArrayConstant()->value()->length()); + + } else if ((lf = x->array()->as_LoadField()) != NULL) { + // GraphBuilder should emit Constants in static final case, let's assert that. + ciField* field = lf->field(); + assert (!(field->is_constant() && field->is_static()), + "Array loads from static final fields should be handled as Constants"); } }