hotspot/src/share/vm/opto/library_call.cpp
changeset 13728 882756847a04
parent 13486 4f0635e148c1
child 13886 8d82c4dfa722
equal deleted inserted replaced
13727:caf5eb7dd4a7 13728:882756847a04
  2902   if (stopped())  return true;  // argument was like int.class
  2902   if (stopped())  return true;  // argument was like int.class
  2903 
  2903 
  2904   // Note:  The argument might still be an illegal value like
  2904   // Note:  The argument might still be an illegal value like
  2905   // Serializable.class or Object[].class.   The runtime will handle it.
  2905   // Serializable.class or Object[].class.   The runtime will handle it.
  2906   // But we must make an explicit check for initialization.
  2906   // But we must make an explicit check for initialization.
  2907   Node* insp = basic_plus_adr(kls, in_bytes(instanceKlass::init_state_offset()));
  2907   Node* insp = basic_plus_adr(kls, in_bytes(InstanceKlass::init_state_offset()));
  2908   // Use T_BOOLEAN for instanceKlass::_init_state so the compiler
  2908   // Use T_BOOLEAN for InstanceKlass::_init_state so the compiler
  2909   // can generate code to load it as unsigned byte.
  2909   // can generate code to load it as unsigned byte.
  2910   Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN);
  2910   Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN);
  2911   Node* bits = intcon(instanceKlass::fully_initialized);
  2911   Node* bits = intcon(InstanceKlass::fully_initialized);
  2912   Node* test = _gvn.transform( new (C, 3) SubINode(inst, bits) );
  2912   Node* test = _gvn.transform( new (C, 3) SubINode(inst, bits) );
  2913   // The 'test' is non-zero if we need to take a slow path.
  2913   // The 'test' is non-zero if we need to take a slow path.
  2914 
  2914 
  2915   Node* obj = new_instance(kls, test);
  2915   Node* obj = new_instance(kls, test);
  2916   push(obj);
  2916   push(obj);
  3473   jint  layout_con = 0;
  3473   jint  layout_con = 0;
  3474   Node* layout_val = get_layout_helper(kls, layout_con);
  3474   Node* layout_val = get_layout_helper(kls, layout_con);
  3475   if (layout_val == NULL) {
  3475   if (layout_val == NULL) {
  3476     bool query = (obj_array
  3476     bool query = (obj_array
  3477                   ? Klass::layout_helper_is_objArray(layout_con)
  3477                   ? Klass::layout_helper_is_objArray(layout_con)
  3478                   : Klass::layout_helper_is_javaArray(layout_con));
  3478                   : Klass::layout_helper_is_array(layout_con));
  3479     if (query == not_array) {
  3479     if (query == not_array) {
  3480       return NULL;                       // never a branch
  3480       return NULL;                       // never a branch
  3481     } else {                             // always a branch
  3481     } else {                             // always a branch
  3482       Node* always_branch = control();
  3482       Node* always_branch = control();
  3483       if (region != NULL)
  3483       if (region != NULL)
  3708 // Helper for hashCode and clone.  Peeks inside the vtable to avoid a call.
  3708 // Helper for hashCode and clone.  Peeks inside the vtable to avoid a call.
  3709 Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass,
  3709 Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass,
  3710                                              RegionNode* slow_region) {
  3710                                              RegionNode* slow_region) {
  3711   ciMethod* method = callee();
  3711   ciMethod* method = callee();
  3712   int vtable_index = method->vtable_index();
  3712   int vtable_index = method->vtable_index();
  3713   // Get the methodOop out of the appropriate vtable entry.
  3713   // Get the Method* out of the appropriate vtable entry.
  3714   int entry_offset  = (instanceKlass::vtable_start_offset() +
  3714   int entry_offset  = (InstanceKlass::vtable_start_offset() +
  3715                      vtable_index*vtableEntry::size()) * wordSize +
  3715                      vtable_index*vtableEntry::size()) * wordSize +
  3716                      vtableEntry::method_offset_in_bytes();
  3716                      vtableEntry::method_offset_in_bytes();
  3717   Node* entry_addr  = basic_plus_adr(obj_klass, entry_offset);
  3717   Node* entry_addr  = basic_plus_adr(obj_klass, entry_offset);
  3718   Node* target_call = make_load(NULL, entry_addr, TypeInstPtr::NOTNULL, T_OBJECT);
  3718   Node* target_call = make_load(NULL, entry_addr, TypeInstPtr::NOTNULL, T_OBJECT);
  3719 
  3719 
  3720   // Compare the target method with the expected method (e.g., Object.hashCode).
  3720   // Compare the target method with the expected method (e.g., Object.hashCode).
  3721   const TypeInstPtr* native_call_addr = TypeInstPtr::make(method);
  3721   const TypePtr* native_call_addr = TypeMetadataPtr::make(method);
  3722 
  3722 
  3723   Node* native_call = makecon(native_call_addr);
  3723   Node* native_call = makecon(native_call_addr);
  3724   Node* chk_native  = _gvn.transform( new(C, 3) CmpPNode(target_call, native_call) );
  3724   Node* chk_native  = _gvn.transform( new(C, 3) CmpPNode(target_call, native_call) );
  3725   Node* test_native = _gvn.transform( new(C, 2) BoolNode(chk_native, BoolTest::ne) );
  3725   Node* test_native = _gvn.transform( new(C, 2) BoolNode(chk_native, BoolTest::ne) );
  3726 
  3726 
  3751     slow_call = new(C, tfdc) CallStaticJavaNode(tf,
  3751     slow_call = new(C, tfdc) CallStaticJavaNode(tf,
  3752                                 SharedRuntime::get_resolve_static_call_stub(),
  3752                                 SharedRuntime::get_resolve_static_call_stub(),
  3753                                 method, bci());
  3753                                 method, bci());
  3754   } else if (is_virtual) {
  3754   } else if (is_virtual) {
  3755     null_check_receiver(method);
  3755     null_check_receiver(method);
  3756     int vtable_index = methodOopDesc::invalid_vtable_index;
  3756     int vtable_index = Method::invalid_vtable_index;
  3757     if (UseInlineCaches) {
  3757     if (UseInlineCaches) {
  3758       // Suppress the vtable call
  3758       // Suppress the vtable call
  3759     } else {
  3759     } else {
  3760       // hashCode and clone are not a miranda methods,
  3760       // hashCode and clone are not a miranda methods,
  3761       // so the vtable index is fixed.
  3761       // so the vtable index is fixed.
  4264   // Can't use base_offset_in_bytes(bt) since basic type is unknown.
  4264   // Can't use base_offset_in_bytes(bt) since basic type is unknown.
  4265   int base_off = is_array ? arrayOopDesc::length_offset_in_bytes() :
  4265   int base_off = is_array ? arrayOopDesc::length_offset_in_bytes() :
  4266                             instanceOopDesc::base_offset_in_bytes();
  4266                             instanceOopDesc::base_offset_in_bytes();
  4267   // base_off:
  4267   // base_off:
  4268   // 8  - 32-bit VM
  4268   // 8  - 32-bit VM
  4269   // 12 - 64-bit VM, compressed oops
  4269   // 12 - 64-bit VM, compressed klass
  4270   // 16 - 64-bit VM, normal oops
  4270   // 16 - 64-bit VM, normal klass
  4271   if (base_off % BytesPerLong != 0) {
  4271   if (base_off % BytesPerLong != 0) {
  4272     assert(UseCompressedOops, "");
  4272     assert(UseCompressedOops, "");
  4273     if (is_array) {
  4273     if (is_array) {
  4274       // Exclude length to copy by 8 bytes words.
  4274       // Exclude length to copy by 8 bytes words.
  4275       base_off += sizeof(int);
  4275       base_off += sizeof(int);
  4897     // If they are not, we will use checked_oop_disjoint_arraycopy,
  4897     // If they are not, we will use checked_oop_disjoint_arraycopy,
  4898     // which performs a fast optimistic per-oop check, and backs off
  4898     // which performs a fast optimistic per-oop check, and backs off
  4899     // further to JVM_ArrayCopy on the first per-oop check that fails.
  4899     // further to JVM_ArrayCopy on the first per-oop check that fails.
  4900     // (Actually, we don't move raw bits only; the GC requires card marks.)
  4900     // (Actually, we don't move raw bits only; the GC requires card marks.)
  4901 
  4901 
  4902     // Get the klassOop for both src and dest
  4902     // Get the Klass* for both src and dest
  4903     Node* src_klass  = load_object_klass(src);
  4903     Node* src_klass  = load_object_klass(src);
  4904     Node* dest_klass = load_object_klass(dest);
  4904     Node* dest_klass = load_object_klass(dest);
  4905 
  4905 
  4906     // Generate the subtype check.
  4906     // Generate the subtype check.
  4907     // This might fold up statically, or then again it might not.
  4907     // This might fold up statically, or then again it might not.