< prev index next >
src/hotspot/share/opto/library_call.cpp
Print this page
*** 183,193 ****
}
Node* generate_access_flags_guard(Node* kls,
int modifier_mask, int modifier_bits,
RegionNode* region);
Node* generate_interface_guard(Node* kls, RegionNode* region);
- Node* generate_value_guard(Node* kls, RegionNode* region);
enum ArrayKind {
AnyArray,
NonArray,
ObjectArray,
--- 183,192 ----
*** 3413,3426 ****
}
Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) {
return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region);
}
- Node* LibraryCallKit::generate_value_guard(Node* kls, RegionNode* region) {
- return generate_access_flags_guard(kls, JVM_ACC_VALUE, 0, region);
- }
-
//-------------------------inline_native_Class_query-------------------
bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
const Type* return_type = TypeInt::BOOL;
Node* prim_return_value = top(); // what happens if it's a primitive class?
bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
--- 3412,3421 ----
*** 4345,4361 ****
// We only go to the fast case code if we pass a number of guards. The
// paths which do not pass are accumulated in the slow_region.
RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
- const TypeOopPtr* obj_type = _gvn.type(obj)->is_oopptr();
- assert(!obj_type->isa_valuetype() || !obj_type->is_valuetypeptr(), "no value type here");
- if (is_static && obj_type->can_be_value_type()) {
- Node* obj_klass = load_object_klass(obj);
- generate_value_guard(obj_klass, slow_region);
- }
-
// If this is a virtual call, we generate a funny guard. We pull out
// the vtable entry corresponding to hashCode() from the target object.
// If the target method which we are calling happens to be the native
// Object hashCode() method, we pass the guard. We do not need this
// guard for non-virtual calls -- the caller is known to be the native
--- 4340,4349 ----
*** 4372,4381 ****
--- 4360,4370 ----
// the null check after castPP removal.
Node* no_ctrl = NULL;
Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
// Test the header to see if it is unlocked.
+ // This also serves as guard against value types (they have the always_locked_pattern set).
Node *lock_mask = _gvn.MakeConX(markWord::biased_lock_mask_in_place);
Node *lmasked_header = _gvn.transform(new AndXNode(header, lock_mask));
Node *unlocked_val = _gvn.MakeConX(markWord::unlocked_value);
Node *chk_unlocked = _gvn.transform(new CmpXNode( lmasked_header, unlocked_val));
Node *test_unlocked = _gvn.transform(new BoolNode( chk_unlocked, BoolTest::ne));
< prev index next >