comparison src/share/vm/opto/type.cpp @ 992:6a8ccac44f41

6820514: meet not symmetric failure in ctw Summary: Add missing instance_id meet. Reviewed-by: never
author kvn
date Fri, 18 Sep 2009 09:57:47 -0700
parents 148e5441d916
children 03b336640699
comparison
equal deleted inserted replaced
991:3a2aa26bdc58 992:6a8ccac44f41
294 TypeInstPtr::MIRROR = TypeInstPtr::make(TypePtr::NotNull, current->env()->Class_klass()); 294 TypeInstPtr::MIRROR = TypeInstPtr::make(TypePtr::NotNull, current->env()->Class_klass());
295 TypeInstPtr::MARK = TypeInstPtr::make(TypePtr::BotPTR, current->env()->Object_klass(), 295 TypeInstPtr::MARK = TypeInstPtr::make(TypePtr::BotPTR, current->env()->Object_klass(),
296 false, 0, oopDesc::mark_offset_in_bytes()); 296 false, 0, oopDesc::mark_offset_in_bytes());
297 TypeInstPtr::KLASS = TypeInstPtr::make(TypePtr::BotPTR, current->env()->Object_klass(), 297 TypeInstPtr::KLASS = TypeInstPtr::make(TypePtr::BotPTR, current->env()->Object_klass(),
298 false, 0, oopDesc::klass_offset_in_bytes()); 298 false, 0, oopDesc::klass_offset_in_bytes());
299 TypeOopPtr::BOTTOM = TypeOopPtr::make(TypePtr::BotPTR, OffsetBot); 299 TypeOopPtr::BOTTOM = TypeOopPtr::make(TypePtr::BotPTR, OffsetBot, TypeOopPtr::InstanceBot);
300 300
301 TypeNarrowOop::NULL_PTR = TypeNarrowOop::make( TypePtr::NULL_PTR ); 301 TypeNarrowOop::NULL_PTR = TypeNarrowOop::make( TypePtr::NULL_PTR );
302 TypeNarrowOop::BOTTOM = TypeNarrowOop::make( TypeInstPtr::BOTTOM ); 302 TypeNarrowOop::BOTTOM = TypeNarrowOop::make( TypeInstPtr::BOTTOM );
303 303
304 mreg2type[Op_Node] = Type::BOTTOM; 304 mreg2type[Op_Node] = Type::BOTTOM;
490 //----------------------interface_vs_oop--------------------------------------- 490 //----------------------interface_vs_oop---------------------------------------
491 #ifdef ASSERT 491 #ifdef ASSERT
492 bool Type::interface_vs_oop(const Type *t) const { 492 bool Type::interface_vs_oop(const Type *t) const {
493 bool result = false; 493 bool result = false;
494 494
495 const TypeInstPtr* this_inst = this->isa_instptr(); 495 const TypePtr* this_ptr = this->make_ptr(); // In case it is narrow_oop
496 const TypeInstPtr* t_inst = t->isa_instptr(); 496 const TypePtr* t_ptr = t->make_ptr();
497 if( this_ptr == NULL || t_ptr == NULL )
498 return result;
499
500 const TypeInstPtr* this_inst = this_ptr->isa_instptr();
501 const TypeInstPtr* t_inst = t_ptr->isa_instptr();
497 if( this_inst && this_inst->is_loaded() && t_inst && t_inst->is_loaded() ) { 502 if( this_inst && this_inst->is_loaded() && t_inst && t_inst->is_loaded() ) {
498 bool this_interface = this_inst->klass()->is_interface(); 503 bool this_interface = this_inst->klass()->is_interface();
499 bool t_interface = t_inst->klass()->is_interface(); 504 bool t_interface = t_inst->klass()->is_interface();
500 result = this_interface ^ t_interface; 505 result = this_interface ^ t_interface;
501 } 506 }
2247 2252
2248 //------------------------------cast_to_ptr_type------------------------------- 2253 //------------------------------cast_to_ptr_type-------------------------------
2249 const Type *TypeOopPtr::cast_to_ptr_type(PTR ptr) const { 2254 const Type *TypeOopPtr::cast_to_ptr_type(PTR ptr) const {
2250 assert(_base == OopPtr, "subclass must override cast_to_ptr_type"); 2255 assert(_base == OopPtr, "subclass must override cast_to_ptr_type");
2251 if( ptr == _ptr ) return this; 2256 if( ptr == _ptr ) return this;
2252 return make(ptr, _offset); 2257 return make(ptr, _offset, _instance_id);
2253 } 2258 }
2254 2259
2255 //-----------------------------cast_to_instance_id---------------------------- 2260 //-----------------------------cast_to_instance_id----------------------------
2256 const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const { 2261 const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const {
2257 // There are no instances of a general oop. 2262 // There are no instances of a general oop.
2317 switch (tp->ptr()) { 2322 switch (tp->ptr()) {
2318 case Null: 2323 case Null:
2319 if (ptr == Null) return TypePtr::make(AnyPtr, ptr, offset); 2324 if (ptr == Null) return TypePtr::make(AnyPtr, ptr, offset);
2320 // else fall through: 2325 // else fall through:
2321 case TopPTR: 2326 case TopPTR:
2322 case AnyNull: 2327 case AnyNull: {
2323 return make(ptr, offset); 2328 int instance_id = meet_instance_id(InstanceTop);
2329 return make(ptr, offset, instance_id);
2330 }
2324 case BotPTR: 2331 case BotPTR:
2325 case NotNull: 2332 case NotNull:
2326 return TypePtr::make(AnyPtr, ptr, offset); 2333 return TypePtr::make(AnyPtr, ptr, offset);
2327 default: typerr(t); 2334 default: typerr(t);
2328 } 2335 }
2591 return (_offset == 0) && !below_centerline(_ptr); 2598 return (_offset == 0) && !below_centerline(_ptr);
2592 } 2599 }
2593 2600
2594 //------------------------------add_offset------------------------------------- 2601 //------------------------------add_offset-------------------------------------
2595 const TypePtr *TypeOopPtr::add_offset( intptr_t offset ) const { 2602 const TypePtr *TypeOopPtr::add_offset( intptr_t offset ) const {
2596 return make( _ptr, xadd_offset(offset) ); 2603 return make( _ptr, xadd_offset(offset), _instance_id);
2597 } 2604 }
2598 2605
2599 //------------------------------meet_instance_id-------------------------------- 2606 //------------------------------meet_instance_id--------------------------------
2600 int TypeOopPtr::meet_instance_id( int instance_id ) const { 2607 int TypeOopPtr::meet_instance_id( int instance_id ) const {
2601 // Either is 'TOP' instance? Return the other instance! 2608 // Either is 'TOP' instance? Return the other instance!
2694 // Compute the MEET of two InstPtrs when at least one is unloaded. 2701 // Compute the MEET of two InstPtrs when at least one is unloaded.
2695 // Assume classes are different since called after check for same name/class-loader 2702 // Assume classes are different since called after check for same name/class-loader
2696 const TypeInstPtr *TypeInstPtr::xmeet_unloaded(const TypeInstPtr *tinst) const { 2703 const TypeInstPtr *TypeInstPtr::xmeet_unloaded(const TypeInstPtr *tinst) const {
2697 int off = meet_offset(tinst->offset()); 2704 int off = meet_offset(tinst->offset());
2698 PTR ptr = meet_ptr(tinst->ptr()); 2705 PTR ptr = meet_ptr(tinst->ptr());
2706 int instance_id = meet_instance_id(tinst->instance_id());
2699 2707
2700 const TypeInstPtr *loaded = is_loaded() ? this : tinst; 2708 const TypeInstPtr *loaded = is_loaded() ? this : tinst;
2701 const TypeInstPtr *unloaded = is_loaded() ? tinst : this; 2709 const TypeInstPtr *unloaded = is_loaded() ? tinst : this;
2702 if( loaded->klass()->equals(ciEnv::current()->Object_klass()) ) { 2710 if( loaded->klass()->equals(ciEnv::current()->Object_klass()) ) {
2703 // 2711 //
2714 // BOTTOM | ........................Object-BOTTOM ..................| 2722 // BOTTOM | ........................Object-BOTTOM ..................|
2715 // 2723 //
2716 assert(loaded->ptr() != TypePtr::Null, "insanity check"); 2724 assert(loaded->ptr() != TypePtr::Null, "insanity check");
2717 // 2725 //
2718 if( loaded->ptr() == TypePtr::TopPTR ) { return unloaded; } 2726 if( loaded->ptr() == TypePtr::TopPTR ) { return unloaded; }
2719 else if (loaded->ptr() == TypePtr::AnyNull) { return TypeInstPtr::make( ptr, unloaded->klass() ); } 2727 else if (loaded->ptr() == TypePtr::AnyNull) { return TypeInstPtr::make( ptr, unloaded->klass(), false, NULL, off, instance_id ); }
2720 else if (loaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; } 2728 else if (loaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; }
2721 else if (loaded->ptr() == TypePtr::Constant || loaded->ptr() == TypePtr::NotNull) { 2729 else if (loaded->ptr() == TypePtr::Constant || loaded->ptr() == TypePtr::NotNull) {
2722 if (unloaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; } 2730 if (unloaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; }
2723 else { return TypeInstPtr::NOTNULL; } 2731 else { return TypeInstPtr::NOTNULL; }
2724 } 2732 }