< prev index next >
src/hotspot/share/opto/type.cpp
Print this page
@@ -2362,12 +2362,19 @@
const TypeInstPtr* tinst;
if (_elem->isa_narrowoop())
tinst = _elem->make_ptr()->isa_instptr();
else
tinst = _elem->isa_instptr();
- if (tinst)
- return tklass->as_instance_klass()->is_final();
+ if (tinst) {
+ if (tklass->as_instance_klass()->is_final()) {
+ if (tinst->is_valuetypeptr() && (tinst->ptr() == TypePtr::BotPTR || tinst->ptr() == TypePtr::TopPTR)) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
const TypeAryPtr* tap;
if (_elem->isa_narrowoop())
tap = _elem->make_ptr()->isa_aryptr();
else
tap = _elem->isa_aryptr();
@@ -3447,11 +3454,11 @@
const TypeOopPtr* etype = TypeOopPtr::make_from_klass_common(klass->as_array_klass()->element_klass(), false, try_for_exact);
bool null_free = klass->is_loaded() && klass->as_array_klass()->storage_properties().is_null_free();
if (null_free && etype->is_valuetypeptr()) {
etype = etype->join_speculative(TypePtr::NOTNULL)->is_oopptr();
}
- bool xk = etype->klass_is_exact();
+ bool xk = etype->klass_is_exact() && (!etype->is_valuetypeptr() || null_free);
const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS);
// We used to pass NotNull in here, asserting that the sub-arrays
// are all not-null. This is not true in generally, as code can
// slam NULLs down in the subarrays.
const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::BotPTR, arr0, klass, xk, Offset(0));
< prev index next >