@@ -167,19 +167,10 @@ bool SubTypeCheckNode::verify(PhaseGVN* phase) {
167167 const TypeKlassPtr* subk = sub_t ->isa_klassptr () ? sub_t ->is_klassptr () : sub_t ->is_oopptr ()->as_klass_type ();
168168
169169 if (super_t ->singleton () && subk != NULL ) {
170- Node* subklass = NULL ;
171- if (sub_t ->isa_oopptr ()) {
172- Node* adr = phase->transform (new AddPNode (obj_or_subklass, obj_or_subklass, phase->MakeConX (oopDesc::klass_offset_in_bytes ())));
173- subklass = phase->transform (LoadKlassNode::make (*phase, NULL , C->immutable_memory (), adr, TypeInstPtr::KLASS));
174- record_for_cleanup (subklass, phase);
175- } else {
176- subklass = obj_or_subklass;
177- }
178-
179170 const Type* cached_t = Value (phase); // cache the type to validate consistency
180171 switch (C->static_subtype_check (superk, subk)) {
181172 case Compile::SSC_easy_test: {
182- return verify_helper (phase, subklass , cached_t );
173+ return verify_helper (phase, load_klass (phase) , cached_t );
183174 }
184175 case Compile::SSC_full_test: {
185176 Node* p1 = phase->transform (new AddPNode (superklass, superklass, phase->MakeConX (in_bytes (Klass::super_check_offset_offset ()))));
@@ -189,6 +180,7 @@ bool SubTypeCheckNode::verify(PhaseGVN* phase) {
189180 int cacheoff_con = in_bytes (Klass::secondary_super_cache_offset ());
190181 bool might_be_cache = (phase->find_int_con (chk_off, cacheoff_con) == cacheoff_con);
191182 if (!might_be_cache) {
183+ Node* subklass = load_klass (phase);
192184 Node* chk_off_X = chk_off;
193185#ifdef _LP64
194186 chk_off_X = phase->transform (new ConvI2LNode (chk_off_X));
@@ -210,4 +202,19 @@ bool SubTypeCheckNode::verify(PhaseGVN* phase) {
210202
211203 return true ;
212204}
205+
206+ Node* SubTypeCheckNode::load_klass (PhaseGVN* phase) const {
207+ Node* obj_or_subklass = in (ObjOrSubKlass);
208+ const Type* sub_t = phase->type (obj_or_subklass);
209+ Node* subklass = NULL ;
210+ if (sub_t ->isa_oopptr ()) {
211+ Node* adr = phase->transform (new AddPNode (obj_or_subklass, obj_or_subklass, phase->MakeConX (oopDesc::klass_offset_in_bytes ())));
212+ subklass = phase->transform (LoadKlassNode::make (*phase, NULL , phase->C ->immutable_memory (), adr, TypeInstPtr::KLASS));
213+ record_for_cleanup (subklass, phase);
214+ } else {
215+ subklass = obj_or_subklass;
216+ }
217+ return subklass;
218+ }
219+
213220#endif
0 commit comments