< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page

        

*** 2259,2273 **** if (tary_klass != NULL // can be NULL when at BOTTOM or TOP && tary->offset() == oopDesc::klass_offset_in_bytes()) { ciArrayKlass* ak = tary_klass->as_array_klass(); // Do not fold klass loads from [V?. The runtime type might be [V due to [V <: [V? // and the klass for [V is not equal to the klass for [V?. ! if (!tary->is_known_instance() && ak->is_obj_array_klass() && ! !ak->storage_properties().is_null_free() && ak->element_klass()->is_valuetype()) { ! // Fall back to Object array ! ak = ciArrayKlass::make(phase->C->env()->Object_klass()); ! } else if (tary->klass_is_exact()) { return TypeKlassPtr::make(tary_klass); } // If the klass is an object array, we defer the question to the // array component klass. --- 2259,2269 ---- if (tary_klass != NULL // can be NULL when at BOTTOM or TOP && tary->offset() == oopDesc::klass_offset_in_bytes()) { ciArrayKlass* ak = tary_klass->as_array_klass(); // Do not fold klass loads from [V?. The runtime type might be [V due to [V <: [V? // and the klass for [V is not equal to the klass for [V?. ! if (tary->klass_is_exact()) { return TypeKlassPtr::make(tary_klass); } // If the klass is an object array, we defer the question to the // array component klass.
*** 2275,2285 **** assert(ak->is_loaded(), ""); ciKlass *base_k = ak->as_obj_array_klass()->base_element_klass(); if (base_k->is_loaded() && base_k->is_instance_klass()) { ciInstanceKlass *ik = base_k->as_instance_klass(); // See if we can become precise: no subklasses and no interface ! if (!ik->is_interface() && !ik->has_subklass()) { //assert(!UseExactTypes, "this code should be useless with exact types"); // Add a dependence; if any subclass added we need to recompile if (!ik->is_final()) { phase->C->dependencies()->assert_leaf_type(ik); } --- 2271,2281 ---- assert(ak->is_loaded(), ""); ciKlass *base_k = ak->as_obj_array_klass()->base_element_klass(); if (base_k->is_loaded() && base_k->is_instance_klass()) { ciInstanceKlass *ik = base_k->as_instance_klass(); // See if we can become precise: no subklasses and no interface ! if (!ik->is_interface() && !ik->has_subklass() && (!ik->is_valuetype() || ak->storage_properties().is_null_free())) { //assert(!UseExactTypes, "this code should be useless with exact types"); // Add a dependence; if any subclass added we need to recompile if (!ik->is_final()) { phase->C->dependencies()->assert_leaf_type(ik); }
< prev index next >