src/share/vm/opto/library_call.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/opto/library_call.cpp Tue Oct 21 16:47:08 2014
--- new/src/share/vm/opto/library_call.cpp Tue Oct 21 16:47:08 2014
*** 266,275 ****
--- 266,276 ----
bool inline_unsafe_ordered_store(BasicType type);
bool inline_unsafe_fence(vmIntrinsics::ID id);
bool inline_fp_conversions(vmIntrinsics::ID id);
bool inline_number_methods(vmIntrinsics::ID id);
bool inline_reference_get();
+ bool inline_Class_cast();
bool inline_aescrypt_Block(vmIntrinsics::ID id);
bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id);
Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting);
Node* get_key_start_from_aescrypt_object(Node* aescrypt_object);
Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object);
*** 867,876 ****
--- 868,879 ----
case vmIntrinsics::_getCallerClass: return inline_native_Reflection_getCallerClass();
case vmIntrinsics::_Reference_get: return inline_reference_get();
+ case vmIntrinsics::_class_cast: return inline_Class_cast();
+
case vmIntrinsics::_aescrypt_encryptBlock:
case vmIntrinsics::_aescrypt_decryptBlock: return inline_aescrypt_Block(intrinsic_id());
case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
*** 3544,3553 ****
--- 3547,3599 ----
C->set_has_split_ifs(true); // Has chance for split-if optimization
set_result(region, phi);
return true;
}
+ //-------------------------inline_Class_cast-------------------
+ bool LibraryCallKit::inline_Class_cast() {
+ // See if we can statically collapse isInstance() check in Class.cast();
+ Node* mirror = argument(0); // Class
+ Node* obj = argument(1);
+
+ const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr();
+ if (mirror_con == NULL) {
+ return false; // cannot happen?
+ }
+ const TypeOopPtr* obj_type = _gvn.type(obj)->isa_oopptr();
+ if (obj_type == NULL) {
+ return false; // skip NULL_PTR and TOP
+ }
+
+ assert(mirror_con->klass()->as_instance_klass() == C->env()->Class_klass(), "sanity");
+ // We are loading a special hidden field from a Class mirror object,
+ // the field which points to the VM's Klass metaobject.
+
+ // java_mirror_type returns non-null for compile-time Class constants.
+ ciType* t = mirror_con->java_mirror_type();
+ if (t == NULL || !t->is_klass()) {
+ return false; // non-constant or primitive Class
+ }
+ // constant oop => constant klass
+ const TypeKlassPtr* superklass = TypeKlassPtr::make(t->as_klass());
+
+ if (superklass->singleton()) {
+ ciKlass* superk = superklass->klass();
+ ciKlass* subk = obj_type->klass();
+ if (subk != NULL && subk->is_loaded()) {
+ int static_res = C->static_subtype_check(superk, subk);
+ if (static_res == Compile::SSC_always_true) {
+ // isInstance() is true
+ set_result(obj);
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
//--------------------------inline_native_subtype_check------------------------
// This intrinsic takes the JNI calls out of the heart of
// UnsafeFieldAccessorImpl.set, which improves Field.set, readObject, etc.
bool LibraryCallKit::inline_native_subtype_check() {
// Pull both arguments off the stack.
src/share/vm/opto/library_call.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File