hotspot/src/share/vm/opto/machnode.cpp
changeset 762 1b26adb5fea1
parent 360 21d113ecbf6a
child 767 64fb1fd7186d
--- a/hotspot/src/share/vm/opto/machnode.cpp	Fri Jun 20 10:17:09 2008 -0700
+++ b/hotspot/src/share/vm/opto/machnode.cpp	Fri Jun 20 11:10:05 2008 -0700
@@ -262,14 +262,16 @@
     // Now we have collected every part of the ADLC MEMORY_INTER.
     // See if it adds up to a base + offset.
     if (index != NULL) {
-      if (!index->is_Con()) {
-        const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop();
-        if (narrowoop != NULL) {
-          // Memory references through narrow oops have a
-          // funny base so grab the type from the index.
-          adr_type = narrowoop->make_oopptr();
-          return NULL;
-        }
+      const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop();
+      if (narrowoop != NULL) { // EncodeN, LoadN, LoadConN, LoadNKlass.
+        // Memory references through narrow oops have a
+        // funny base so grab the type from the index:
+        // [R12 + narrow_oop_reg<<3 + offset]
+        assert(base == NULL, "Memory references through narrow oops have no base");
+        offset = disp;
+        adr_type = narrowoop->make_oopptr()->add_offset(offset);
+        return NULL;
+      } else if (!index->is_Con()) {
         disp = Type::OffsetBot;
       } else if (disp != Type::OffsetBot) {
         const TypeX* ti = index->bottom_type()->isa_intptr_t();