src/share/vm/opto/memnode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8049105 Cdiff src/share/vm/opto/memnode.cpp

src/share/vm/opto/memnode.cpp

Print this page

        

*** 1797,1813 **** ciKlass *ss = klass->super_of_depth(depth); return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR; } const Type* aift = load_array_final_field(tkls, klass); if (aift != NULL) return aift; - if (tkls->offset() == in_bytes(ArrayKlass::component_mirror_offset()) - && klass->is_array_klass()) { - // The field is ArrayKlass::_component_mirror. Return its (constant) value. - // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.) - assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror"); - return TypeInstPtr::make(klass->as_array_klass()->component_mirror()); - } if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) { // The field is Klass::_java_mirror. Return its (constant) value. // (Folds up the 2nd indirection in anObjConstant.getClass().) assert(Opcode() == Op_LoadP, "must load an oop from _java_mirror"); return TypeInstPtr::make(klass->java_mirror()); --- 1797,1806 ----
*** 2198,2219 **** return allocated_klass; } } // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*. - // Simplify ak.component_mirror.array_klass to plain ak, ak an ArrayKlass. // See inline_native_Class_query for occurrences of these patterns. // Java Example: x.getClass().isAssignableFrom(y) - // Java Example: Array.newInstance(x.getClass().getComponentType(), n) // // This improves reflective code, often making the Class // mirror go completely dead. (Current exception: Class // mirrors may appear in debug info, but we could clean them out by // introducing a new debug info operator for Klass*.java_mirror). if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass() ! && (offset == java_lang_Class::klass_offset_in_bytes() || ! offset == java_lang_Class::array_klass_offset_in_bytes())) { // We are loading a special hidden field from a Class mirror, // the field which points to its Klass or ArrayKlass metaobject. if (base->is_Load()) { Node* adr2 = base->in(MemNode::Address); const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr(); --- 2191,2209 ---- return allocated_klass; } } // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*. // See inline_native_Class_query for occurrences of these patterns. // Java Example: x.getClass().isAssignableFrom(y) // // This improves reflective code, often making the Class // mirror go completely dead. (Current exception: Class // mirrors may appear in debug info, but we could clean them out by // introducing a new debug info operator for Klass*.java_mirror). if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass() ! && offset == java_lang_Class::klass_offset_in_bytes()) { // We are loading a special hidden field from a Class mirror, // the field which points to its Klass or ArrayKlass metaobject. if (base->is_Load()) { Node* adr2 = base->in(MemNode::Address); const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr();
*** 2221,2233 **** && (tkls->klass()->is_instance_klass() || tkls->klass()->is_array_klass()) && adr2->is_AddP() ) { int mirror_field = in_bytes(Klass::java_mirror_offset()); - if (offset == java_lang_Class::array_klass_offset_in_bytes()) { - mirror_field = in_bytes(ArrayKlass::component_mirror_offset()); - } if (tkls->offset() == mirror_field) { return adr2->in(AddPNode::Base); } } } --- 2211,2220 ----
src/share/vm/opto/memnode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File