< prev index next >

src/share/vm/c1/c1_Canonicalizer.cpp

Print this page

        

*** 220,252 **** } } 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. 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()); } } ! } } } void Canonicalizer::do_LoadIndexed (LoadIndexed* x) {} void Canonicalizer::do_StoreIndexed (StoreIndexed* x) { --- 220,262 ---- } } void Canonicalizer::do_ArrayLength (ArrayLength* x) { ! 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 if ((lf = x->array()->as_LoadField()) != NULL) { ! // Arrays loaded from static final fields have statically known ! // length. Many static final loads can come in Constant form, ! // that are handled below. 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()); } } void Canonicalizer::do_LoadIndexed (LoadIndexed* x) {} void Canonicalizer::do_StoreIndexed (StoreIndexed* x) {
< prev index next >