1797 ciKlass *ss = klass->super_of_depth(depth); |
1797 ciKlass *ss = klass->super_of_depth(depth); |
1798 return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR; |
1798 return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR; |
1799 } |
1799 } |
1800 const Type* aift = load_array_final_field(tkls, klass); |
1800 const Type* aift = load_array_final_field(tkls, klass); |
1801 if (aift != NULL) return aift; |
1801 if (aift != NULL) return aift; |
1802 if (tkls->offset() == in_bytes(ArrayKlass::component_mirror_offset()) |
|
1803 && klass->is_array_klass()) { |
|
1804 // The field is ArrayKlass::_component_mirror. Return its (constant) value. |
|
1805 // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.) |
|
1806 assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror"); |
|
1807 return TypeInstPtr::make(klass->as_array_klass()->component_mirror()); |
|
1808 } |
|
1809 if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) { |
1802 if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) { |
1810 // The field is Klass::_java_mirror. Return its (constant) value. |
1803 // The field is Klass::_java_mirror. Return its (constant) value. |
1811 // (Folds up the 2nd indirection in anObjConstant.getClass().) |
1804 // (Folds up the 2nd indirection in anObjConstant.getClass().) |
1812 assert(Opcode() == Op_LoadP, "must load an oop from _java_mirror"); |
1805 assert(Opcode() == Op_LoadP, "must load an oop from _java_mirror"); |
1813 return TypeInstPtr::make(klass->java_mirror()); |
1806 return TypeInstPtr::make(klass->java_mirror()); |
2198 return allocated_klass; |
2191 return allocated_klass; |
2199 } |
2192 } |
2200 } |
2193 } |
2201 |
2194 |
2202 // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*. |
2195 // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*. |
2203 // Simplify ak.component_mirror.array_klass to plain ak, ak an ArrayKlass. |
|
2204 // See inline_native_Class_query for occurrences of these patterns. |
2196 // See inline_native_Class_query for occurrences of these patterns. |
2205 // Java Example: x.getClass().isAssignableFrom(y) |
2197 // Java Example: x.getClass().isAssignableFrom(y) |
2206 // Java Example: Array.newInstance(x.getClass().getComponentType(), n) |
|
2207 // |
2198 // |
2208 // This improves reflective code, often making the Class |
2199 // This improves reflective code, often making the Class |
2209 // mirror go completely dead. (Current exception: Class |
2200 // mirror go completely dead. (Current exception: Class |
2210 // mirrors may appear in debug info, but we could clean them out by |
2201 // mirrors may appear in debug info, but we could clean them out by |
2211 // introducing a new debug info operator for Klass*.java_mirror). |
2202 // introducing a new debug info operator for Klass*.java_mirror). |
2212 if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass() |
2203 if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass() |
2213 && (offset == java_lang_Class::klass_offset_in_bytes() || |
2204 && offset == java_lang_Class::klass_offset_in_bytes()) { |
2214 offset == java_lang_Class::array_klass_offset_in_bytes())) { |
|
2215 // We are loading a special hidden field from a Class mirror, |
2205 // We are loading a special hidden field from a Class mirror, |
2216 // the field which points to its Klass or ArrayKlass metaobject. |
2206 // the field which points to its Klass or ArrayKlass metaobject. |
2217 if (base->is_Load()) { |
2207 if (base->is_Load()) { |
2218 Node* adr2 = base->in(MemNode::Address); |
2208 Node* adr2 = base->in(MemNode::Address); |
2219 const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr(); |
2209 const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr(); |
2221 && (tkls->klass()->is_instance_klass() || |
2211 && (tkls->klass()->is_instance_klass() || |
2222 tkls->klass()->is_array_klass()) |
2212 tkls->klass()->is_array_klass()) |
2223 && adr2->is_AddP() |
2213 && adr2->is_AddP() |
2224 ) { |
2214 ) { |
2225 int mirror_field = in_bytes(Klass::java_mirror_offset()); |
2215 int mirror_field = in_bytes(Klass::java_mirror_offset()); |
2226 if (offset == java_lang_Class::array_klass_offset_in_bytes()) { |
|
2227 mirror_field = in_bytes(ArrayKlass::component_mirror_offset()); |
|
2228 } |
|
2229 if (tkls->offset() == mirror_field) { |
2216 if (tkls->offset() == mirror_field) { |
2230 return adr2->in(AddPNode::Base); |
2217 return adr2->in(AddPNode::Base); |
2231 } |
2218 } |
2232 } |
2219 } |
2233 } |
2220 } |