comparison src/share/vm/opto/type.cpp @ 64:b8f5ba577b02

6673473: (Escape Analysis) Add the instance's field information to PhiNode Summary: Avoid an infinite generation of instance's field values Phi nodes. Reviewed-by: never
author kvn
date Thu, 13 Mar 2008 16:31:32 -0700
parents a61af66fc99e
children ba764ed4b6f2
comparison
equal deleted inserted replaced
63:eac007780a58 64:b8f5ba577b02
3162 switch (tap->ptr()) { 3162 switch (tap->ptr()) {
3163 case AnyNull: 3163 case AnyNull:
3164 case TopPTR: 3164 case TopPTR:
3165 // Compute new klass on demand, do not use tap->_klass 3165 // Compute new klass on demand, do not use tap->_klass
3166 xk = (tap->_klass_is_exact | this->_klass_is_exact); 3166 xk = (tap->_klass_is_exact | this->_klass_is_exact);
3167 return make( ptr, const_oop(), tary, lazy_klass, xk, off ); 3167 return make( ptr, const_oop(), tary, lazy_klass, xk, off, iid );
3168 case Constant: { 3168 case Constant: {
3169 ciObject* o = const_oop(); 3169 ciObject* o = const_oop();
3170 if( _ptr == Constant ) { 3170 if( _ptr == Constant ) {
3171 if( tap->const_oop() != NULL && !o->equals(tap->const_oop()) ) { 3171 if( tap->const_oop() != NULL && !o->equals(tap->const_oop()) ) {
3172 ptr = NotNull; 3172 ptr = NotNull;
3174 } 3174 }
3175 } else if( above_centerline(_ptr) ) { 3175 } else if( above_centerline(_ptr) ) {
3176 o = tap->const_oop(); 3176 o = tap->const_oop();
3177 } 3177 }
3178 xk = true; 3178 xk = true;
3179 return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off ); 3179 return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, iid );
3180 } 3180 }
3181 case NotNull: 3181 case NotNull:
3182 case BotPTR: 3182 case BotPTR:
3183 // Compute new klass on demand, do not use tap->_klass 3183 // Compute new klass on demand, do not use tap->_klass
3184 if (above_centerline(this->_ptr)) 3184 if (above_centerline(this->_ptr))
3261 st->print(":%s", ptr_msg[_ptr]); 3261 st->print(":%s", ptr_msg[_ptr]);
3262 if( _klass_is_exact ) st->print(":exact"); 3262 if( _klass_is_exact ) st->print(":exact");
3263 break; 3263 break;
3264 } 3264 }
3265 3265
3266 st->print("*"); 3266 if( _offset != 0 ) {
3267 int header_size = objArrayOopDesc::header_size() * wordSize;
3268 if( _offset == OffsetTop ) st->print("+undefined");
3269 else if( _offset == OffsetBot ) st->print("+any");
3270 else if( _offset < header_size ) st->print("+%d", _offset);
3271 else {
3272 BasicType basic_elem_type = elem()->basic_type();
3273 int array_base = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
3274 int elem_size = type2aelembytes(basic_elem_type);
3275 st->print("[%d]", (_offset - array_base)/elem_size);
3276 }
3277 }
3278 st->print(" *");
3267 if (_instance_id != UNKNOWN_INSTANCE) 3279 if (_instance_id != UNKNOWN_INSTANCE)
3268 st->print(",iid=%d",_instance_id); 3280 st->print(",iid=%d",_instance_id);
3269 if( !_offset ) return;
3270 if( _offset == OffsetTop ) st->print("+undefined");
3271 else if( _offset == OffsetBot ) st->print("+any");
3272 else if( _offset < 12 ) st->print("+%d",_offset);
3273 else st->print("[%d]", (_offset-12)/4 );
3274 } 3281 }
3275 #endif 3282 #endif
3276 3283
3277 bool TypeAryPtr::empty(void) const { 3284 bool TypeAryPtr::empty(void) const {
3278 if (_ary->empty()) return true; 3285 if (_ary->empty()) return true;