< prev index next >

src/share/vm/opto/compile.cpp

Print this page

        

@@ -1755,31 +1755,36 @@
     // but the base pointer type is not distinctive enough to identify
     // references into JavaThread.)
 
     // Check for final fields.
     const TypeInstPtr* tinst = flat->isa_instptr();
+    const TypeValueTypePtr* vtptr = flat->isa_valuetypeptr();
+    ciField* field = NULL;
     if (tinst && tinst->offset() >= instanceOopDesc::base_offset_in_bytes()) {
-      ciField* field;
       if (tinst->const_oop() != NULL &&
           tinst->klass() == ciEnv::current()->Class_klass() &&
           tinst->offset() >= (tinst->klass()->as_instance_klass()->size_helper() * wordSize)) {
         // static field
         ciInstanceKlass* k = tinst->const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass();
         field = k->get_field_by_offset(tinst->offset(), true);
       } else {
         ciInstanceKlass *k = tinst->klass()->as_instance_klass();
         field = k->get_field_by_offset(tinst->offset(), false);
       }
+    } else if (vtptr) {
+      // Value type field
+      ciValueKlass* vk = vtptr->klass()->as_value_klass();
+      field = vk->get_field_by_offset(vtptr->offset(), false);
+    }
       assert(field == NULL ||
              original_field == NULL ||
              (field->holder() == original_field->holder() &&
               field->offset() == original_field->offset() &&
               field->is_static() == original_field->is_static()), "wrong field?");
       // Set field() and is_rewritable() attributes.
       if (field != NULL)  alias_type(idx)->set_field(field);
     }
-  }
 
   // Fill the cache for next time.
   ace->_adr_type = adr_type;
   ace->_index    = idx;
   assert(alias_type(adr_type) == alias_type(idx),  "type must be installed");
< prev index next >