equal
deleted
inserted
replaced
65 const TypeAryPtr* arytype = _gvn.type(ary)->is_aryptr(); |
65 const TypeAryPtr* arytype = _gvn.type(ary)->is_aryptr(); |
66 const TypeInt* sizetype = arytype->size(); |
66 const TypeInt* sizetype = arytype->size(); |
67 const Type* elemtype = arytype->elem(); |
67 const Type* elemtype = arytype->elem(); |
68 |
68 |
69 if (UseUniqueSubclasses && result2 != NULL) { |
69 if (UseUniqueSubclasses && result2 != NULL) { |
70 const TypeInstPtr* toop = elemtype->isa_instptr(); |
70 const Type* el = elemtype; |
|
71 if (elemtype->isa_narrowoop()) { |
|
72 el = elemtype->is_narrowoop()->make_oopptr(); |
|
73 } |
|
74 const TypeInstPtr* toop = el->isa_instptr(); |
71 if (toop) { |
75 if (toop) { |
72 if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) { |
76 if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) { |
73 // If we load from "AbstractClass[]" we must see "ConcreteSubClass". |
77 // If we load from "AbstractClass[]" we must see "ConcreteSubClass". |
74 const Type* subklass = Type::get_const_type(toop->klass()); |
78 const Type* subklass = Type::get_const_type(toop->klass()); |
75 elemtype = subklass->join(elemtype); |
79 elemtype = subklass->join(el); |
76 } |
80 } |
77 } |
81 } |
78 } |
82 } |
79 |
83 |
80 // Check for big class initializers with all constant offsets |
84 // Check for big class initializers with all constant offsets |