--- old/src/share/vm/opto/type.cpp Thu Sep 17 16:09:09 2009 +++ new/src/share/vm/opto/type.cpp Thu Sep 17 16:09:09 2009 @@ -296,7 +296,7 @@ false, 0, oopDesc::mark_offset_in_bytes()); TypeInstPtr::KLASS = TypeInstPtr::make(TypePtr::BotPTR, current->env()->Object_klass(), false, 0, oopDesc::klass_offset_in_bytes()); - TypeOopPtr::BOTTOM = TypeOopPtr::make(TypePtr::BotPTR, OffsetBot); + TypeOopPtr::BOTTOM = TypeOopPtr::make(TypePtr::BotPTR, OffsetBot, TypeOopPtr::InstanceBot); TypeNarrowOop::NULL_PTR = TypeNarrowOop::make( TypePtr::NULL_PTR ); TypeNarrowOop::BOTTOM = TypeNarrowOop::make( TypeInstPtr::BOTTOM ); @@ -492,8 +492,13 @@ bool Type::interface_vs_oop(const Type *t) const { bool result = false; - const TypeInstPtr* this_inst = this->isa_instptr(); - const TypeInstPtr* t_inst = t->isa_instptr(); + const TypePtr* this_ptr = this->make_ptr(); // In case it is narrow_oop + const TypePtr* t_ptr = t->make_ptr(); + if( this_ptr == NULL || t_ptr == NULL ) + return result; + + const TypeInstPtr* this_inst = this_ptr->isa_instptr(); + const TypeInstPtr* t_inst = t_ptr->isa_instptr(); if( this_inst && this_inst->is_loaded() && t_inst && t_inst->is_loaded() ) { bool this_interface = this_inst->klass()->is_interface(); bool t_interface = t_inst->klass()->is_interface(); @@ -2249,7 +2254,7 @@ const Type *TypeOopPtr::cast_to_ptr_type(PTR ptr) const { assert(_base == OopPtr, "subclass must override cast_to_ptr_type"); if( ptr == _ptr ) return this; - return make(ptr, _offset); + return make(ptr, _offset, _instance_id); } //-----------------------------cast_to_instance_id---------------------------- @@ -2319,8 +2324,10 @@ if (ptr == Null) return TypePtr::make(AnyPtr, ptr, offset); // else fall through: case TopPTR: - case AnyNull: - return make(ptr, offset); + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); + return make(ptr, offset, instance_id); + } case BotPTR: case NotNull: return TypePtr::make(AnyPtr, ptr, offset); @@ -2593,7 +2600,7 @@ //------------------------------add_offset------------------------------------- const TypePtr *TypeOopPtr::add_offset( intptr_t offset ) const { - return make( _ptr, xadd_offset(offset) ); + return make( _ptr, xadd_offset(offset), _instance_id); } //------------------------------meet_instance_id-------------------------------- @@ -2696,6 +2703,7 @@ const TypeInstPtr *TypeInstPtr::xmeet_unloaded(const TypeInstPtr *tinst) const { int off = meet_offset(tinst->offset()); PTR ptr = meet_ptr(tinst->ptr()); + int instance_id = meet_instance_id(tinst->instance_id()); const TypeInstPtr *loaded = is_loaded() ? this : tinst; const TypeInstPtr *unloaded = is_loaded() ? tinst : this; @@ -2716,7 +2724,7 @@ assert(loaded->ptr() != TypePtr::Null, "insanity check"); // if( loaded->ptr() == TypePtr::TopPTR ) { return unloaded; } - else if (loaded->ptr() == TypePtr::AnyNull) { return TypeInstPtr::make( ptr, unloaded->klass() ); } + else if (loaded->ptr() == TypePtr::AnyNull) { return TypeInstPtr::make( ptr, unloaded->klass(), false, NULL, off, instance_id ); } else if (loaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; } else if (loaded->ptr() == TypePtr::Constant || loaded->ptr() == TypePtr::NotNull) { if (unloaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; } --- old/src/share/vm/opto/type.hpp Thu Sep 17 16:09:10 2009 +++ new/src/share/vm/opto/type.hpp Thu Sep 17 16:09:10 2009 @@ -717,7 +717,7 @@ static const TypeOopPtr* make_from_constant(ciObject* o, bool require_constant = false); // Make a generic (unclassed) pointer to an oop. - static const TypeOopPtr* make(PTR ptr, int offset, int instance_id = InstanceBot); + static const TypeOopPtr* make(PTR ptr, int offset, int instance_id); ciObject* const_oop() const { return _const_oop; } virtual ciKlass* klass() const { return _klass; }