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