< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com
rev 58567 : [mq]: rename-isHidden


 169                                       RegionNode* region, int null_path,
 170                                       int offset);
 171   Node* load_klass_from_mirror(Node* mirror, bool never_see_null,
 172                                RegionNode* region, int null_path) {
 173     int offset = java_lang_Class::klass_offset_in_bytes();
 174     return load_klass_from_mirror_common(mirror, never_see_null,
 175                                          region, null_path,
 176                                          offset);
 177   }
 178   Node* load_array_klass_from_mirror(Node* mirror, bool never_see_null,
 179                                      RegionNode* region, int null_path) {
 180     int offset = java_lang_Class::array_klass_offset_in_bytes();
 181     return load_klass_from_mirror_common(mirror, never_see_null,
 182                                          region, null_path,
 183                                          offset);
 184   }
 185   Node* generate_access_flags_guard(Node* kls,
 186                                     int modifier_mask, int modifier_bits,
 187                                     RegionNode* region);
 188   Node* generate_interface_guard(Node* kls, RegionNode* region);

 189   Node* generate_array_guard(Node* kls, RegionNode* region) {
 190     return generate_array_guard_common(kls, region, false, false);
 191   }
 192   Node* generate_non_array_guard(Node* kls, RegionNode* region) {
 193     return generate_array_guard_common(kls, region, false, true);
 194   }
 195   Node* generate_objArray_guard(Node* kls, RegionNode* region) {
 196     return generate_array_guard_common(kls, region, true, false);
 197   }
 198   Node* generate_non_objArray_guard(Node* kls, RegionNode* region) {
 199     return generate_array_guard_common(kls, region, true, true);
 200   }
 201   Node* generate_array_guard_common(Node* kls, RegionNode* region,
 202                                     bool obj_array, bool not_array);
 203   Node* generate_virtual_guard(Node* obj_klass, RegionNode* slow_region);
 204   CallJavaNode* generate_method_call(vmIntrinsics::ID method_id,
 205                                      bool is_virtual = false, bool is_static = false);
 206   CallJavaNode* generate_method_call_static(vmIntrinsics::ID method_id) {
 207     return generate_method_call(method_id, false, true);
 208   }


 766   case vmIntrinsics::_allocateInstance:         return inline_unsafe_allocate();
 767   case vmIntrinsics::_copyMemory:               return inline_unsafe_copyMemory();
 768   case vmIntrinsics::_getLength:                return inline_native_getLength();
 769   case vmIntrinsics::_copyOf:                   return inline_array_copyOf(false);
 770   case vmIntrinsics::_copyOfRange:              return inline_array_copyOf(true);
 771   case vmIntrinsics::_equalsB:                  return inline_array_equals(StrIntrinsicNode::LL);
 772   case vmIntrinsics::_equalsC:                  return inline_array_equals(StrIntrinsicNode::UU);
 773   case vmIntrinsics::_Preconditions_checkIndex: return inline_preconditions_checkIndex();
 774   case vmIntrinsics::_clone:                    return inline_native_clone(intrinsic()->is_virtual());
 775 
 776   case vmIntrinsics::_allocateUninitializedArray: return inline_unsafe_newArray(true);
 777   case vmIntrinsics::_newArray:                   return inline_unsafe_newArray(false);
 778 
 779   case vmIntrinsics::_isAssignableFrom:         return inline_native_subtype_check();
 780 
 781   case vmIntrinsics::_isInstance:
 782   case vmIntrinsics::_getModifiers:
 783   case vmIntrinsics::_isInterface:
 784   case vmIntrinsics::_isArray:
 785   case vmIntrinsics::_isPrimitive:

 786   case vmIntrinsics::_getSuperclass:
 787   case vmIntrinsics::_getClassAccessFlags:      return inline_native_Class_query(intrinsic_id());
 788 
 789   case vmIntrinsics::_floatToRawIntBits:
 790   case vmIntrinsics::_floatToIntBits:
 791   case vmIntrinsics::_intBitsToFloat:
 792   case vmIntrinsics::_doubleToRawLongBits:
 793   case vmIntrinsics::_doubleToLongBits:
 794   case vmIntrinsics::_longBitsToDouble:         return inline_fp_conversions(intrinsic_id());
 795 
 796   case vmIntrinsics::_numberOfLeadingZeros_i:
 797   case vmIntrinsics::_numberOfLeadingZeros_l:
 798   case vmIntrinsics::_numberOfTrailingZeros_i:
 799   case vmIntrinsics::_numberOfTrailingZeros_l:
 800   case vmIntrinsics::_bitCount_i:
 801   case vmIntrinsics::_bitCount_l:
 802   case vmIntrinsics::_reverseBytes_i:
 803   case vmIntrinsics::_reverseBytes_l:
 804   case vmIntrinsics::_reverseBytes_s:
 805   case vmIntrinsics::_reverseBytes_c:           return inline_number_methods(intrinsic_id());


3067 }
3068 
3069 //--------------------(inline_native_Class_query helpers)---------------------
3070 // Use this for JVM_ACC_INTERFACE, JVM_ACC_IS_CLONEABLE_FAST, JVM_ACC_HAS_FINALIZER.
3071 // Fall through if (mods & mask) == bits, take the guard otherwise.
3072 Node* LibraryCallKit::generate_access_flags_guard(Node* kls, int modifier_mask, int modifier_bits, RegionNode* region) {
3073   // Branch around if the given klass has the given modifier bit set.
3074   // Like generate_guard, adds a new path onto the region.
3075   Node* modp = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset()));
3076   Node* mods = make_load(NULL, modp, TypeInt::INT, T_INT, MemNode::unordered);
3077   Node* mask = intcon(modifier_mask);
3078   Node* bits = intcon(modifier_bits);
3079   Node* mbit = _gvn.transform(new AndINode(mods, mask));
3080   Node* cmp  = _gvn.transform(new CmpINode(mbit, bits));
3081   Node* bol  = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
3082   return generate_fair_guard(bol, region);
3083 }
3084 Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) {
3085   return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region);
3086 }



3087 
3088 //-------------------------inline_native_Class_query-------------------
3089 bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
3090   const Type* return_type = TypeInt::BOOL;
3091   Node* prim_return_value = top();  // what happens if it's a primitive class?
3092   bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
3093   bool expect_prim = false;     // most of these guys expect to work on refs
3094 
3095   enum { _normal_path = 1, _prim_path = 2, PATH_LIMIT };
3096 
3097   Node* mirror = argument(0);
3098   Node* obj    = top();
3099 
3100   switch (id) {
3101   case vmIntrinsics::_isInstance:
3102     // nothing is an instance of a primitive type
3103     prim_return_value = intcon(0);
3104     obj = argument(1);
3105     break;
3106   case vmIntrinsics::_getModifiers:
3107     prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
3108     assert(is_power_of_2((int)JVM_ACC_WRITTEN_FLAGS+1), "change next line");
3109     return_type = TypeInt::make(0, JVM_ACC_WRITTEN_FLAGS, Type::WidenMin);
3110     break;
3111   case vmIntrinsics::_isInterface:
3112     prim_return_value = intcon(0);
3113     break;
3114   case vmIntrinsics::_isArray:
3115     prim_return_value = intcon(0);
3116     expect_prim = true;  // cf. ObjectStreamClass.getClassSignature
3117     break;
3118   case vmIntrinsics::_isPrimitive:
3119     prim_return_value = intcon(1);
3120     expect_prim = true;  // obviously
3121     break;



3122   case vmIntrinsics::_getSuperclass:
3123     prim_return_value = null();
3124     return_type = TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR);
3125     break;
3126   case vmIntrinsics::_getClassAccessFlags:
3127     prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
3128     return_type = TypeInt::INT;  // not bool!  6297094
3129     break;
3130   default:
3131     fatal_unexpected_iid(id);
3132     break;
3133   }
3134 
3135   const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr();
3136   if (mirror_con == NULL)  return false;  // cannot happen?
3137 
3138 #ifndef PRODUCT
3139   if (C->print_intrinsics() || C->print_inlining()) {
3140     ciType* k = mirror_con->java_mirror_type();
3141     if (k) {


3194     if (generate_interface_guard(kls, region) != NULL)
3195       // A guard was added.  If the guard is taken, it was an interface.
3196       phi->add_req(intcon(1));
3197     // If we fall through, it's a plain class.
3198     query_value = intcon(0);
3199     break;
3200 
3201   case vmIntrinsics::_isArray:
3202     // (To verify this code sequence, check the asserts in JVM_IsArrayClass.)
3203     if (generate_array_guard(kls, region) != NULL)
3204       // A guard was added.  If the guard is taken, it was an array.
3205       phi->add_req(intcon(1));
3206     // If we fall through, it's a plain class.
3207     query_value = intcon(0);
3208     break;
3209 
3210   case vmIntrinsics::_isPrimitive:
3211     query_value = intcon(0); // "normal" path produces false
3212     break;
3213 










3214   case vmIntrinsics::_getSuperclass:
3215     // The rules here are somewhat unfortunate, but we can still do better
3216     // with random logic than with a JNI call.
3217     // Interfaces store null or Object as _super, but must report null.
3218     // Arrays store an intermediate super as _super, but must report Object.
3219     // Other types can report the actual _super.
3220     // (To verify this code sequence, check the asserts in JVM_IsInterface.)
3221     if (generate_interface_guard(kls, region) != NULL)
3222       // A guard was added.  If the guard is taken, it was an interface.
3223       phi->add_req(null());
3224     if (generate_array_guard(kls, region) != NULL)
3225       // A guard was added.  If the guard is taken, it was an array.
3226       phi->add_req(makecon(TypeInstPtr::make(env()->Object_klass()->java_mirror())));
3227     // If we fall through, it's a plain class.  Get its _super.
3228     p = basic_plus_adr(kls, in_bytes(Klass::super_offset()));
3229     kls = _gvn.transform(LoadKlassNode::make(_gvn, NULL, immutable_memory(), p, TypeRawPtr::BOTTOM, TypeKlassPtr::OBJECT_OR_NULL));
3230     null_ctl = top();
3231     kls = null_check_oop(kls, &null_ctl);
3232     if (null_ctl != top()) {
3233       // If the guard is taken, Object.superClass is null (both klass and mirror).




 169                                       RegionNode* region, int null_path,
 170                                       int offset);
 171   Node* load_klass_from_mirror(Node* mirror, bool never_see_null,
 172                                RegionNode* region, int null_path) {
 173     int offset = java_lang_Class::klass_offset_in_bytes();
 174     return load_klass_from_mirror_common(mirror, never_see_null,
 175                                          region, null_path,
 176                                          offset);
 177   }
 178   Node* load_array_klass_from_mirror(Node* mirror, bool never_see_null,
 179                                      RegionNode* region, int null_path) {
 180     int offset = java_lang_Class::array_klass_offset_in_bytes();
 181     return load_klass_from_mirror_common(mirror, never_see_null,
 182                                          region, null_path,
 183                                          offset);
 184   }
 185   Node* generate_access_flags_guard(Node* kls,
 186                                     int modifier_mask, int modifier_bits,
 187                                     RegionNode* region);
 188   Node* generate_interface_guard(Node* kls, RegionNode* region);
 189   Node* generate_hidden_class_guard(Node* kls, RegionNode* region);
 190   Node* generate_array_guard(Node* kls, RegionNode* region) {
 191     return generate_array_guard_common(kls, region, false, false);
 192   }
 193   Node* generate_non_array_guard(Node* kls, RegionNode* region) {
 194     return generate_array_guard_common(kls, region, false, true);
 195   }
 196   Node* generate_objArray_guard(Node* kls, RegionNode* region) {
 197     return generate_array_guard_common(kls, region, true, false);
 198   }
 199   Node* generate_non_objArray_guard(Node* kls, RegionNode* region) {
 200     return generate_array_guard_common(kls, region, true, true);
 201   }
 202   Node* generate_array_guard_common(Node* kls, RegionNode* region,
 203                                     bool obj_array, bool not_array);
 204   Node* generate_virtual_guard(Node* obj_klass, RegionNode* slow_region);
 205   CallJavaNode* generate_method_call(vmIntrinsics::ID method_id,
 206                                      bool is_virtual = false, bool is_static = false);
 207   CallJavaNode* generate_method_call_static(vmIntrinsics::ID method_id) {
 208     return generate_method_call(method_id, false, true);
 209   }


 767   case vmIntrinsics::_allocateInstance:         return inline_unsafe_allocate();
 768   case vmIntrinsics::_copyMemory:               return inline_unsafe_copyMemory();
 769   case vmIntrinsics::_getLength:                return inline_native_getLength();
 770   case vmIntrinsics::_copyOf:                   return inline_array_copyOf(false);
 771   case vmIntrinsics::_copyOfRange:              return inline_array_copyOf(true);
 772   case vmIntrinsics::_equalsB:                  return inline_array_equals(StrIntrinsicNode::LL);
 773   case vmIntrinsics::_equalsC:                  return inline_array_equals(StrIntrinsicNode::UU);
 774   case vmIntrinsics::_Preconditions_checkIndex: return inline_preconditions_checkIndex();
 775   case vmIntrinsics::_clone:                    return inline_native_clone(intrinsic()->is_virtual());
 776 
 777   case vmIntrinsics::_allocateUninitializedArray: return inline_unsafe_newArray(true);
 778   case vmIntrinsics::_newArray:                   return inline_unsafe_newArray(false);
 779 
 780   case vmIntrinsics::_isAssignableFrom:         return inline_native_subtype_check();
 781 
 782   case vmIntrinsics::_isInstance:
 783   case vmIntrinsics::_getModifiers:
 784   case vmIntrinsics::_isInterface:
 785   case vmIntrinsics::_isArray:
 786   case vmIntrinsics::_isPrimitive:
 787   case vmIntrinsics::_isHidden:
 788   case vmIntrinsics::_getSuperclass:
 789   case vmIntrinsics::_getClassAccessFlags:      return inline_native_Class_query(intrinsic_id());
 790 
 791   case vmIntrinsics::_floatToRawIntBits:
 792   case vmIntrinsics::_floatToIntBits:
 793   case vmIntrinsics::_intBitsToFloat:
 794   case vmIntrinsics::_doubleToRawLongBits:
 795   case vmIntrinsics::_doubleToLongBits:
 796   case vmIntrinsics::_longBitsToDouble:         return inline_fp_conversions(intrinsic_id());
 797 
 798   case vmIntrinsics::_numberOfLeadingZeros_i:
 799   case vmIntrinsics::_numberOfLeadingZeros_l:
 800   case vmIntrinsics::_numberOfTrailingZeros_i:
 801   case vmIntrinsics::_numberOfTrailingZeros_l:
 802   case vmIntrinsics::_bitCount_i:
 803   case vmIntrinsics::_bitCount_l:
 804   case vmIntrinsics::_reverseBytes_i:
 805   case vmIntrinsics::_reverseBytes_l:
 806   case vmIntrinsics::_reverseBytes_s:
 807   case vmIntrinsics::_reverseBytes_c:           return inline_number_methods(intrinsic_id());


3069 }
3070 
3071 //--------------------(inline_native_Class_query helpers)---------------------
3072 // Use this for JVM_ACC_INTERFACE, JVM_ACC_IS_CLONEABLE_FAST, JVM_ACC_HAS_FINALIZER.
3073 // Fall through if (mods & mask) == bits, take the guard otherwise.
3074 Node* LibraryCallKit::generate_access_flags_guard(Node* kls, int modifier_mask, int modifier_bits, RegionNode* region) {
3075   // Branch around if the given klass has the given modifier bit set.
3076   // Like generate_guard, adds a new path onto the region.
3077   Node* modp = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset()));
3078   Node* mods = make_load(NULL, modp, TypeInt::INT, T_INT, MemNode::unordered);
3079   Node* mask = intcon(modifier_mask);
3080   Node* bits = intcon(modifier_bits);
3081   Node* mbit = _gvn.transform(new AndINode(mods, mask));
3082   Node* cmp  = _gvn.transform(new CmpINode(mbit, bits));
3083   Node* bol  = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
3084   return generate_fair_guard(bol, region);
3085 }
3086 Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) {
3087   return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region);
3088 }
3089 Node* LibraryCallKit::generate_hidden_class_guard(Node* kls, RegionNode* region) {
3090   return generate_access_flags_guard(kls, JVM_ACC_IS_HIDDEN_CLASS, 0, region);
3091 }
3092 
3093 //-------------------------inline_native_Class_query-------------------
3094 bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) {
3095   const Type* return_type = TypeInt::BOOL;
3096   Node* prim_return_value = top();  // what happens if it's a primitive class?
3097   bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
3098   bool expect_prim = false;     // most of these guys expect to work on refs
3099 
3100   enum { _normal_path = 1, _prim_path = 2, PATH_LIMIT };
3101 
3102   Node* mirror = argument(0);
3103   Node* obj    = top();
3104 
3105   switch (id) {
3106   case vmIntrinsics::_isInstance:
3107     // nothing is an instance of a primitive type
3108     prim_return_value = intcon(0);
3109     obj = argument(1);
3110     break;
3111   case vmIntrinsics::_getModifiers:
3112     prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
3113     assert(is_power_of_2((int)JVM_ACC_WRITTEN_FLAGS+1), "change next line");
3114     return_type = TypeInt::make(0, JVM_ACC_WRITTEN_FLAGS, Type::WidenMin);
3115     break;
3116   case vmIntrinsics::_isInterface:
3117     prim_return_value = intcon(0);
3118     break;
3119   case vmIntrinsics::_isArray:
3120     prim_return_value = intcon(0);
3121     expect_prim = true;  // cf. ObjectStreamClass.getClassSignature
3122     break;
3123   case vmIntrinsics::_isPrimitive:
3124     prim_return_value = intcon(1);
3125     expect_prim = true;  // obviously
3126     break;
3127   case vmIntrinsics::_isHidden:
3128     prim_return_value = intcon(0);
3129     break;
3130   case vmIntrinsics::_getSuperclass:
3131     prim_return_value = null();
3132     return_type = TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR);
3133     break;
3134   case vmIntrinsics::_getClassAccessFlags:
3135     prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
3136     return_type = TypeInt::INT;  // not bool!  6297094
3137     break;
3138   default:
3139     fatal_unexpected_iid(id);
3140     break;
3141   }
3142 
3143   const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr();
3144   if (mirror_con == NULL)  return false;  // cannot happen?
3145 
3146 #ifndef PRODUCT
3147   if (C->print_intrinsics() || C->print_inlining()) {
3148     ciType* k = mirror_con->java_mirror_type();
3149     if (k) {


3202     if (generate_interface_guard(kls, region) != NULL)
3203       // A guard was added.  If the guard is taken, it was an interface.
3204       phi->add_req(intcon(1));
3205     // If we fall through, it's a plain class.
3206     query_value = intcon(0);
3207     break;
3208 
3209   case vmIntrinsics::_isArray:
3210     // (To verify this code sequence, check the asserts in JVM_IsArrayClass.)
3211     if (generate_array_guard(kls, region) != NULL)
3212       // A guard was added.  If the guard is taken, it was an array.
3213       phi->add_req(intcon(1));
3214     // If we fall through, it's a plain class.
3215     query_value = intcon(0);
3216     break;
3217 
3218   case vmIntrinsics::_isPrimitive:
3219     query_value = intcon(0); // "normal" path produces false
3220     break;
3221 
3222   case vmIntrinsics::_isHidden:
3223     // (To verify this code sequence, check the asserts in JVM_IsHiddenClass.)
3224     if (generate_hidden_class_guard(kls, region) != NULL)
3225       // A guard was added.  If the guard is taken, it was an hidden class.
3226       phi->add_req(intcon(1));
3227     // If we fall through, it's a plain class.
3228     query_value = intcon(0);
3229     break;
3230 
3231 
3232   case vmIntrinsics::_getSuperclass:
3233     // The rules here are somewhat unfortunate, but we can still do better
3234     // with random logic than with a JNI call.
3235     // Interfaces store null or Object as _super, but must report null.
3236     // Arrays store an intermediate super as _super, but must report Object.
3237     // Other types can report the actual _super.
3238     // (To verify this code sequence, check the asserts in JVM_IsInterface.)
3239     if (generate_interface_guard(kls, region) != NULL)
3240       // A guard was added.  If the guard is taken, it was an interface.
3241       phi->add_req(null());
3242     if (generate_array_guard(kls, region) != NULL)
3243       // A guard was added.  If the guard is taken, it was an array.
3244       phi->add_req(makecon(TypeInstPtr::make(env()->Object_klass()->java_mirror())));
3245     // If we fall through, it's a plain class.  Get its _super.
3246     p = basic_plus_adr(kls, in_bytes(Klass::super_offset()));
3247     kls = _gvn.transform(LoadKlassNode::make(_gvn, NULL, immutable_memory(), p, TypeRawPtr::BOTTOM, TypeKlassPtr::OBJECT_OR_NULL));
3248     null_ctl = top();
3249     kls = null_check_oop(kls, &null_ctl);
3250     if (null_ctl != top()) {
3251       // If the guard is taken, Object.superClass is null (both klass and mirror).


< prev index next >