comparison src/share/vm/opto/type.cpp @ 1765:114e6b93e9e1

6980978: assert(mt == t->xmeet(this)) failed: meet not commutative Summary: Fix code in TypeAryPtr::xmeet() for constant array. Reviewed-by: never
author kvn
date Mon, 30 Aug 2010 11:02:53 -0700
parents 14b92b91f460
children f95d63e2154a
comparison
equal deleted inserted replaced
1764:14197af1010e 1765:114e6b93e9e1
3367 // This must fall to bottom, not (int[-128..65535])[int+]. 3367 // This must fall to bottom, not (int[-128..65535])[int+].
3368 instance_id = InstanceBot; 3368 instance_id = InstanceBot;
3369 tary = TypeAry::make(Type::BOTTOM, tary->_size); 3369 tary = TypeAry::make(Type::BOTTOM, tary->_size);
3370 } 3370 }
3371 } 3371 }
3372 bool xk; 3372 bool xk = false;
3373 switch (tap->ptr()) { 3373 switch (tap->ptr()) {
3374 case AnyNull: 3374 case AnyNull:
3375 case TopPTR: 3375 case TopPTR:
3376 // Compute new klass on demand, do not use tap->_klass 3376 // Compute new klass on demand, do not use tap->_klass
3377 xk = (tap->_klass_is_exact | this->_klass_is_exact); 3377 xk = (tap->_klass_is_exact | this->_klass_is_exact);
3389 } 3389 }
3390 } else if( above_centerline(_ptr) ) { 3390 } else if( above_centerline(_ptr) ) {
3391 o = tap->const_oop(); 3391 o = tap->const_oop();
3392 xk = true; 3392 xk = true;
3393 } else { 3393 } else {
3394 xk = this->_klass_is_exact; 3394 // Only precise for identical arrays
3395 xk = this->_klass_is_exact && (klass() == tap->klass());
3395 } 3396 }
3396 return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, instance_id ); 3397 return TypeAryPtr::make( ptr, o, tary, lazy_klass, xk, off, instance_id );
3397 } 3398 }
3398 case NotNull: 3399 case NotNull:
3399 case BotPTR: 3400 case BotPTR:
3400 // Compute new klass on demand, do not use tap->_klass 3401 // Compute new klass on demand, do not use tap->_klass
3401 if (above_centerline(this->_ptr)) 3402 if (above_centerline(this->_ptr))