< prev index next >
src/hotspot/share/opto/compile.cpp
Print this page
*** 4302,4316 ****
}
ciType* superelem = superk;
if (superelem->is_array_klass()) {
ciArrayKlass* ak = superelem->as_array_klass();
- // Do not fold the subtype check to an array klass pointer comparison for [V? arrays.
- // [V is a subtype of [V? but the klass for [V is not equal to the klass for [V?. Perform a full test.
- if (ak->is_obj_array_klass() && !ak->storage_properties().is_null_free() && ak->element_klass()->is_valuetype()) {
- return SSC_full_test;
- }
superelem = superelem->as_array_klass()->base_element_type();
}
if (!subk->is_interface()) { // cannot trust static interface types yet
if (subk->is_subtype_of(superk)) {
--- 4302,4311 ----
*** 4320,4329 ****
--- 4315,4329 ----
!superk->is_subtype_of(subk)) {
return SSC_always_false;
}
}
+ // Do not fold the subtype check to an array klass pointer comparison for [V? arrays.
+ // [V is a subtype of [V? but the klass for [V is not equal to the klass for [V?. Perform a full test.
+ if (superk->is_obj_array_klass() && !superk->as_array_klass()->storage_properties().is_null_free() && superk->as_array_klass()->element_klass()->is_valuetype()) {
+ return SSC_full_test;
+ }
// If casting to an instance klass, it must have no subtypes
if (superk->is_interface()) {
// Cannot trust interfaces yet.
// %%% S.B. superk->nof_implementors() == 1
} else if (superelem->is_instance_klass()) {
< prev index next >