< prev index next >

src/hotspot/share/c1/c1_Instruction.cpp

Print this page

*** 112,131 **** --- 112,172 ---- return t->as_klass()->exact_klass(); } return NULL; } + + // FIXME -- make this obsolete. Use maybe_flattened_array() or check_flattened_array() instead. bool Instruction::is_flattened_array() const { if (ValueArrayFlatten) { ciType* type = declared_type(); if (type != NULL && type->is_value_array_klass()) { ciValueKlass* element_klass = type->as_value_array_klass()->element_klass()->as_value_klass(); if (!element_klass->is_loaded() || element_klass->flatten_array()) { // Assume that all unloaded value arrays are not flattenable. If they // turn out to be flattenable, we deoptimize on aaload/aastore. + // ^^^^ uugh -- this is ugly! + return true; + } + } + } + + return false; + } + + bool Instruction::is_loaded_flattened_array() const { + if (ValueArrayFlatten) { + ciType* type = declared_type(); + if (type != NULL && type->is_value_array_klass()) { + ciValueKlass* element_klass = type->as_value_array_klass()->element_klass()->as_value_klass(); + if (element_klass->is_loaded() && element_klass->flatten_array()) { + return true; + } + } + } + + return false; + } + + bool Instruction::maybe_flattened_array() const { + if (ValueArrayFlatten) { + ciType* type = declared_type(); + if (type != NULL) { + if (type->is_value_array_klass()) { + ciValueKlass* element_klass = type->as_value_array_klass()->element_klass()->as_value_klass(); + if (!element_klass->is_loaded() || element_klass->flatten_array()) { + // For unloaded value arrays, we will add a runtime check for flat-ness. return true; } + } else if (type->is_obj_array_klass()) { + ciKlass* element_klass = type->as_obj_array_klass()->element_klass(); + if (element_klass->is_java_lang_Object()) { + // Array covariance (ValueType[] <: Object[]) + // We will add a runtime check for flat-ness. + return true; + } + } } } return false; }
< prev index next >