< prev index next >
src/hotspot/share/opto/parse2.cpp
Print this page
*** 65,75 ****
const TypeOopPtr* elemptr = elemtype->make_oopptr();
const TypeAryPtr* ary_t = _gvn.type(ary)->is_aryptr();
if (elemtype->isa_valuetype() != NULL) {
// Load from flattened value type array
ciValueKlass* vk = elemtype->is_valuetype()->value_klass();
! ValueTypeNode* vt = ValueTypeNode::make_from_flattened(this, vk, ary, adr);
push(vt);
return;
} else if (elemptr != NULL && elemptr->is_valuetypeptr()) {
// Load from non-flattened value type array (elements can never be null)
bt = T_VALUETYPE;
--- 65,75 ----
const TypeOopPtr* elemptr = elemtype->make_oopptr();
const TypeAryPtr* ary_t = _gvn.type(ary)->is_aryptr();
if (elemtype->isa_valuetype() != NULL) {
// Load from flattened value type array
ciValueKlass* vk = elemtype->is_valuetype()->value_klass();
! Node* vt = ValueTypeNode::make_from_flattened(this, vk, ary, adr);
push(vt);
return;
} else if (elemptr != NULL && elemptr->is_valuetypeptr()) {
// Load from non-flattened value type array (elements can never be null)
bt = T_VALUETYPE;
*** 152,164 ****
const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(bt);
Node* ld = access_load_at(ary, adr, adr_type, elemtype, bt,
IN_HEAP | IS_ARRAY | C2_CONTROL_DEPENDENT_LOAD);
if (bt == T_VALUETYPE) {
// Loading a non-flattened (but flattenable) value type from an array
! assert(!gvn().type(ld)->is_ptr()->maybe_null(), "value type array elements should never be null");
ld = ValueTypeNode::make_from_oop(this, ld, elemptr->value_klass());
}
push_node(bt, ld);
}
--- 152,166 ----
const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(bt);
Node* ld = access_load_at(ary, adr, adr_type, elemtype, bt,
IN_HEAP | IS_ARRAY | C2_CONTROL_DEPENDENT_LOAD);
if (bt == T_VALUETYPE) {
// Loading a non-flattened (but flattenable) value type from an array
! assert(!gvn().type(ld)->maybe_null(), "value type array elements should never be null");
! if (elemptr->value_klass()->is_scalarizable()) {
ld = ValueTypeNode::make_from_oop(this, ld, elemptr->value_klass());
}
+ }
push_node(bt, ld);
}
*** 180,201 ****
if (bt == T_OBJECT) {
const TypeOopPtr* elemptr = elemtype->make_oopptr();
const Type* val_t = _gvn.type(val);
if (elemtype->isa_valuetype() != NULL) {
// Store to flattened value type array
! if (!val->is_ValueType() && val_t == TypePtr::NULL_PTR) {
// Can not store null into a value type array
inc_sp(3);
uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
return;
}
cast_val->as_ValueType()->store_flattened(this, ary, adr);
return;
} else if (elemptr->is_valuetypeptr()) {
// Store to non-flattened value type array
! if (!val->is_ValueType() && val_t == TypePtr::NULL_PTR) {
// Can not store null into a value type array
inc_sp(3);
uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
return;
}
} else if (elemptr->can_be_value_type() && !ary_t->klass_is_exact() &&
--- 182,211 ----
if (bt == T_OBJECT) {
const TypeOopPtr* elemptr = elemtype->make_oopptr();
const Type* val_t = _gvn.type(val);
if (elemtype->isa_valuetype() != NULL) {
// Store to flattened value type array
! val_t = _gvn.type(cast_val);
! if (!cast_val->is_ValueType()) {
! if (val_t->maybe_null()) {
// Can not store null into a value type array
+ assert(val_t == TypePtr::NULL_PTR, "Anything other than null?");
inc_sp(3);
uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
return;
}
+ assert(!val_t->maybe_null(), "should never be null");
+ cast_val = ValueTypeNode::make_from_oop(this, cast_val, elemtype->is_valuetype()->value_klass());
+ }
cast_val->as_ValueType()->store_flattened(this, ary, adr);
return;
} else if (elemptr->is_valuetypeptr()) {
// Store to non-flattened value type array
! val_t = _gvn.type(cast_val);
! if (!cast_val->is_ValueType() && val_t->maybe_null()) {
// Can not store null into a value type array
+ assert(val_t == TypePtr::NULL_PTR, "Anything other than null?");
inc_sp(3);
uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
return;
}
} else if (elemptr->can_be_value_type() && !ary_t->klass_is_exact() &&
*** 229,247 ****
val->as_ValueType()->store_flattened(this, ary, adr);
ideal.sync_kit(this);
} else {
if (TypePtr::NULL_PTR->higher_equal(val_t)) {
sync_kit(ideal);
- Node* null_ctl = top();
- val = null_check_oop(val, &null_ctl);
- {
- assert(null_ctl != top(), "expected to possibly be null");
- PreserveJVMState pjvms(this);
- set_control(null_ctl);
inc_sp(3);
! uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
! }
ideal.sync_kit(this);
}
if (!ideal.ctrl()->is_top()) {
ideal.make_leaf_call(OptoRuntime::store_unknown_value_Type(),
--- 239,251 ----
val->as_ValueType()->store_flattened(this, ary, adr);
ideal.sync_kit(this);
} else {
if (TypePtr::NULL_PTR->higher_equal(val_t)) {
sync_kit(ideal);
inc_sp(3);
! val = filter_null(val);
! dec_sp(3);
ideal.sync_kit(this);
}
if (!ideal.ctrl()->is_top()) {
ideal.make_leaf_call(OptoRuntime::store_unknown_value_Type(),
< prev index next >