src/share/vm/opto/memnode.cpp

changeset 4142
d8ce2825b193
parent 4115
e626685e9f6c
child 4164
d804e148cff8
equal deleted inserted replaced
4122:1b582b1bf7cb 4142:d8ce2825b193
1669 ciKlass *ss = klass->super_of_depth(depth); 1669 ciKlass *ss = klass->super_of_depth(depth);
1670 return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR; 1670 return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR;
1671 } 1671 }
1672 const Type* aift = load_array_final_field(tkls, klass); 1672 const Type* aift = load_array_final_field(tkls, klass);
1673 if (aift != NULL) return aift; 1673 if (aift != NULL) return aift;
1674 if (tkls->offset() == in_bytes(arrayKlass::component_mirror_offset()) 1674 if (tkls->offset() == in_bytes(ArrayKlass::component_mirror_offset())
1675 && klass->is_array_klass()) { 1675 && klass->is_array_klass()) {
1676 // The field is arrayKlass::_component_mirror. Return its (constant) value. 1676 // The field is ArrayKlass::_component_mirror. Return its (constant) value.
1677 // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.) 1677 // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.)
1678 assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror"); 1678 assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror");
1679 return TypeInstPtr::make(klass->as_array_klass()->component_mirror()); 1679 return TypeInstPtr::make(klass->as_array_klass()->component_mirror());
1680 } 1680 }
1681 if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) { 1681 if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) {
2012 if (tkls != NULL && !StressReflectiveCode) { 2012 if (tkls != NULL && !StressReflectiveCode) {
2013 ciKlass* klass = tkls->klass(); 2013 ciKlass* klass = tkls->klass();
2014 if( !klass->is_loaded() ) 2014 if( !klass->is_loaded() )
2015 return _type; // Bail out if not loaded 2015 return _type; // Bail out if not loaded
2016 if( klass->is_obj_array_klass() && 2016 if( klass->is_obj_array_klass() &&
2017 tkls->offset() == in_bytes(objArrayKlass::element_klass_offset())) { 2017 tkls->offset() == in_bytes(ObjArrayKlass::element_klass_offset())) {
2018 ciKlass* elem = klass->as_obj_array_klass()->element_klass(); 2018 ciKlass* elem = klass->as_obj_array_klass()->element_klass();
2019 // // Always returning precise element type is incorrect, 2019 // // Always returning precise element type is incorrect,
2020 // // e.g., element type could be object and array may contain strings 2020 // // e.g., element type could be object and array may contain strings
2021 // return TypeKlassPtr::make(TypePtr::Constant, elem, 0); 2021 // return TypeKlassPtr::make(TypePtr::Constant, elem, 0);
2022 2022
2065 return allocated_klass; 2065 return allocated_klass;
2066 } 2066 }
2067 } 2067 }
2068 2068
2069 // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*. 2069 // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*.
2070 // Simplify ak.component_mirror.array_klass to plain ak, ak an arrayKlass. 2070 // Simplify ak.component_mirror.array_klass to plain ak, ak an ArrayKlass.
2071 // See inline_native_Class_query for occurrences of these patterns. 2071 // See inline_native_Class_query for occurrences of these patterns.
2072 // Java Example: x.getClass().isAssignableFrom(y) 2072 // Java Example: x.getClass().isAssignableFrom(y)
2073 // Java Example: Array.newInstance(x.getClass().getComponentType(), n) 2073 // Java Example: Array.newInstance(x.getClass().getComponentType(), n)
2074 // 2074 //
2075 // This improves reflective code, often making the Class 2075 // This improves reflective code, often making the Class
2078 // introducing a new debug info operator for Klass*.java_mirror). 2078 // introducing a new debug info operator for Klass*.java_mirror).
2079 if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass() 2079 if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass()
2080 && (offset == java_lang_Class::klass_offset_in_bytes() || 2080 && (offset == java_lang_Class::klass_offset_in_bytes() ||
2081 offset == java_lang_Class::array_klass_offset_in_bytes())) { 2081 offset == java_lang_Class::array_klass_offset_in_bytes())) {
2082 // We are loading a special hidden field from a Class mirror, 2082 // We are loading a special hidden field from a Class mirror,
2083 // the field which points to its Klass or arrayKlass metaobject. 2083 // the field which points to its Klass or ArrayKlass metaobject.
2084 if (base->is_Load()) { 2084 if (base->is_Load()) {
2085 Node* adr2 = base->in(MemNode::Address); 2085 Node* adr2 = base->in(MemNode::Address);
2086 const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr(); 2086 const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr();
2087 if (tkls != NULL && !tkls->empty() 2087 if (tkls != NULL && !tkls->empty()
2088 && (tkls->klass()->is_instance_klass() || 2088 && (tkls->klass()->is_instance_klass() ||
2089 tkls->klass()->is_array_klass()) 2089 tkls->klass()->is_array_klass())
2090 && adr2->is_AddP() 2090 && adr2->is_AddP()
2091 ) { 2091 ) {
2092 int mirror_field = in_bytes(Klass::java_mirror_offset()); 2092 int mirror_field = in_bytes(Klass::java_mirror_offset());
2093 if (offset == java_lang_Class::array_klass_offset_in_bytes()) { 2093 if (offset == java_lang_Class::array_klass_offset_in_bytes()) {
2094 mirror_field = in_bytes(arrayKlass::component_mirror_offset()); 2094 mirror_field = in_bytes(ArrayKlass::component_mirror_offset());
2095 } 2095 }
2096 if (tkls->offset() == mirror_field) { 2096 if (tkls->offset() == mirror_field) {
2097 return adr2->in(AddPNode::Base); 2097 return adr2->in(AddPNode::Base);
2098 } 2098 }
2099 } 2099 }

mercurial