--- a/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Wed Jan 25 19:26:35 2012 -0500
+++ b/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Wed Jan 25 21:30:53 2012 -0800
@@ -472,7 +472,7 @@
__ load_klass(src_reg, tmp_reg);
Address ref_type_adr(tmp_reg, instanceKlass::reference_type_offset());
- __ ld(ref_type_adr, tmp_reg);
+ __ ldub(ref_type_adr, tmp_reg);
// _reference_type field is of type ReferenceType (enum)
assert(REF_NONE == 0, "check this code");
--- a/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp Wed Jan 25 19:26:35 2012 -0500
+++ b/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp Wed Jan 25 21:30:53 2012 -0800
@@ -520,7 +520,7 @@
__ load_klass(tmp_reg, src_reg);
Address ref_type_adr(tmp_reg, instanceKlass::reference_type_offset());
- __ cmpl(ref_type_adr, REF_NONE);
+ __ cmpb(ref_type_adr, REF_NONE);
__ jcc(Assembler::equal, _continuation);
// Is marking active?
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Wed Jan 25 19:26:35 2012 -0500
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Wed Jan 25 21:30:53 2012 -0800
@@ -240,7 +240,6 @@
Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization)
int _vtable_len; // length of Java vtable (in words)
int _itable_len; // length of Java itable (in words)
- ReferenceType _reference_type; // reference type
OopMapCache* volatile _oop_map_cache; // OopMapCache for all methods in the klass (allocated lazily)
JNIid* _jni_ids; // First JNI identifier for static fields in this class
jmethodID* _methods_jmethod_ids; // jmethodIDs corresponding to method_idnum, or NULL if none
@@ -265,6 +264,8 @@
// _idnum_allocated_count.
u1 _init_state; // state of class
+ u1 _reference_type; // reference type
+
// embedded Java vtable follows here
// embedded Java itables follows here
// embedded static fields follows here
@@ -407,8 +408,11 @@
void eager_initialize(Thread *thread);
// reference type
- ReferenceType reference_type() const { return _reference_type; }
- void set_reference_type(ReferenceType t) { _reference_type = t; }
+ ReferenceType reference_type() const { return (ReferenceType)_reference_type; }
+ void set_reference_type(ReferenceType t) {
+ assert(t == (u1)t, "overflow");
+ _reference_type = (u1)t;
+ }
static ByteSize reference_type_offset() { return in_ByteSize(sizeof(klassOopDesc) + offset_of(instanceKlass, _reference_type)); }
--- a/hotspot/src/share/vm/opto/library_call.cpp Wed Jan 25 19:26:35 2012 -0500
+++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jan 25 21:30:53 2012 -0800
@@ -2153,7 +2153,7 @@
//
// if (offset == java_lang_ref_Reference::_reference_offset) {
// if (base != null) {
- // if (klass(base)->reference_type() != REF_NONE)) {
+ // if (instance_of(base, java.lang.ref.Reference)) {
// pre_barrier(_, pre_val, ...);
// }
// }
@@ -2165,8 +2165,6 @@
IdealKit ideal(this);
#define __ ideal.
- const int reference_type_offset = in_bytes(instanceKlass::reference_type_offset());
-
Node* referent_off = __ ConX(java_lang_ref_Reference::referent_offset);
__ if_then(offset, BoolTest::eq, referent_off, unlikely); {
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jan 25 19:26:35 2012 -0500
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jan 25 21:30:53 2012 -0800
@@ -314,7 +314,7 @@
nonstatic_field(instanceKlass, _init_thread, Thread*) \
nonstatic_field(instanceKlass, _vtable_len, int) \
nonstatic_field(instanceKlass, _itable_len, int) \
- nonstatic_field(instanceKlass, _reference_type, ReferenceType) \
+ nonstatic_field(instanceKlass, _reference_type, u1) \
volatile_nonstatic_field(instanceKlass, _oop_map_cache, OopMapCache*) \
nonstatic_field(instanceKlass, _jni_ids, JNIid*) \
nonstatic_field(instanceKlass, _osr_nmethods_head, nmethod*) \