< prev index next >
src/hotspot/share/opto/library_call.cpp
Print this page
rev 55127 : 8223351: [lworld] Primary mirror and nullable mirror for inline type
Reviewed-by: tbd
*** 793,804 ****
case vmIntrinsics::_isArray:
case vmIntrinsics::_isPrimitive:
case vmIntrinsics::_getSuperclass:
case vmIntrinsics::_getClassAccessFlags: return inline_native_Class_query(intrinsic_id());
! case vmIntrinsics::_asValueType:
! case vmIntrinsics::_asBoxType: return inline_value_Class_conversion(intrinsic_id());
case vmIntrinsics::_floatToRawIntBits:
case vmIntrinsics::_floatToIntBits:
case vmIntrinsics::_intBitsToFloat:
case vmIntrinsics::_doubleToRawLongBits:
--- 793,804 ----
case vmIntrinsics::_isArray:
case vmIntrinsics::_isPrimitive:
case vmIntrinsics::_getSuperclass:
case vmIntrinsics::_getClassAccessFlags: return inline_native_Class_query(intrinsic_id());
! case vmIntrinsics::_asPrimaryType:
! case vmIntrinsics::_asNullableType: return inline_value_Class_conversion(intrinsic_id());
case vmIntrinsics::_floatToRawIntBits:
case vmIntrinsics::_floatToIntBits:
case vmIntrinsics::_intBitsToFloat:
case vmIntrinsics::_doubleToRawLongBits:
*** 3490,3501 ****
set_result(region, phi);
return true;
}
//-------------------------inline_value_Class_conversion-------------------
! // public Class<T> java.lang.Class.asBoxType();
! // public Class<T> java.lang.Class.asValueType()
bool LibraryCallKit::inline_value_Class_conversion(vmIntrinsics::ID id) {
Node* mirror = argument(0); // Receiver Class
const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr();
if (mirror_con == NULL) {
return false;
--- 3490,3501 ----
set_result(region, phi);
return true;
}
//-------------------------inline_value_Class_conversion-------------------
! // public Class<T> java.lang.Class.asPrimaryType();
! // public Class<T> java.lang.Class.asNullableType()
bool LibraryCallKit::inline_value_Class_conversion(vmIntrinsics::ID id) {
Node* mirror = argument(0); // Receiver Class
const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr();
if (mirror_con == NULL) {
return false;
*** 3503,3516 ****
bool is_val_type = false;
ciType* tm = mirror_con->java_mirror_type(&is_val_type);
if (tm != NULL && tm->is_valuetype()) {
Node* result = mirror;
! if (id == vmIntrinsics::_asValueType && !is_val_type) {
result = _gvn.makecon(TypeInstPtr::make(tm->as_value_klass()->value_mirror_instance()));
! } else if (id == vmIntrinsics::_asBoxType && is_val_type) {
! result = _gvn.makecon(TypeInstPtr::make(tm->as_value_klass()->box_mirror_instance()));
}
set_result(result);
return true;
}
return false;
--- 3503,3516 ----
bool is_val_type = false;
ciType* tm = mirror_con->java_mirror_type(&is_val_type);
if (tm != NULL && tm->is_valuetype()) {
Node* result = mirror;
! if (id == vmIntrinsics::_asPrimaryType && !is_val_type) {
result = _gvn.makecon(TypeInstPtr::make(tm->as_value_klass()->value_mirror_instance()));
! } else if (id == vmIntrinsics::_asNullableType && is_val_type) {
! result = _gvn.makecon(TypeInstPtr::make(tm->as_value_klass()->nullable_mirror_instance()));
}
set_result(result);
return true;
}
return false;
*** 3591,3605 ****
Node* res = top();
if (!stopped()) {
// TODO move this into do_checkcast?
if (EnableValhalla && !obj->is_ValueType() && !is_val_type) {
! // Check if (mirror == value_mirror && obj == null)
RegionNode* r = new RegionNode(3);
! Node* p = basic_plus_adr(mirror, java_lang_Class::value_mirror_offset_in_bytes());
! Node* value_mirror = access_load_at(mirror, p, _gvn.type(p)->is_ptr(), TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR), T_OBJECT, IN_HEAP);
! Node* cmp = _gvn.transform(new CmpPNode(mirror, value_mirror));
Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
Node* if_ne = generate_fair_guard(bol, NULL);
r->init_req(1, if_ne);
// Casting to .val, check for null
--- 3591,3605 ----
Node* res = top();
if (!stopped()) {
// TODO move this into do_checkcast?
if (EnableValhalla && !obj->is_ValueType() && !is_val_type) {
! // Check if (mirror == inline_mirror && obj == null)
RegionNode* r = new RegionNode(3);
! Node* p = basic_plus_adr(mirror, java_lang_Class::inline_mirror_offset_in_bytes());
! Node* inline_mirror = access_load_at(mirror, p, _gvn.type(p)->is_ptr(), TypeInstPtr::MIRROR, T_OBJECT, IN_HEAP);
! Node* cmp = _gvn.transform(new CmpPNode(mirror, inline_mirror));
Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
Node* if_ne = generate_fair_guard(bol, NULL);
r->init_req(1, if_ne);
// Casting to .val, check for null
< prev index next >