--- old/src/share/vm/opto/callnode.cpp	Mon May 19 21:08:27 2008
+++ new/src/share/vm/opto/callnode.cpp	Mon May 19 21:08:27 2008
@@ -678,8 +678,7 @@
           !at_k->is_interface()) {
         // If we have found an argument matching addr_t, check if the field
         // at the specified offset is modified.
-        int at_idx = C->get_alias_index(at_ptr->add_offset(offset)->isa_oopptr());
-        if (base_idx == at_idx &&
+        if ((adr_k->is_subclass_of(at_k) || at_k->is_subclass_of(adr_k)) &&
             (bcea == NULL ||
              bcea->is_arg_modified(i - TypeFunc::Parms, offset, size))) {
           return true;
