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).
|