comparison src/share/vm/opto/type.cpp @ 366:8261ee795323

6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int") Summary: insert CastII nodes to narrow type of load_array_length() node Reviewed-by: never, kvn
author rasbold
date Wed, 17 Sep 2008 08:29:17 -0700
parents af945ba2e739
children f4fe12e429a4
comparison
equal deleted inserted replaced
333:7484fa4b8825 366:8261ee795323
3155 return res; 3155 return res;
3156 } 3156 }
3157 3157
3158 // Narrow the given size type to the index range for the given array base type. 3158 // Narrow the given size type to the index range for the given array base type.
3159 // Return NULL if the resulting int type becomes empty. 3159 // Return NULL if the resulting int type becomes empty.
3160 const TypeInt* TypeAryPtr::narrow_size_type(const TypeInt* size, BasicType elem) { 3160 const TypeInt* TypeAryPtr::narrow_size_type(const TypeInt* size) const {
3161 jint hi = size->_hi; 3161 jint hi = size->_hi;
3162 jint lo = size->_lo; 3162 jint lo = size->_lo;
3163 jint min_lo = 0; 3163 jint min_lo = 0;
3164 jint max_hi = max_array_length(elem); 3164 jint max_hi = max_array_length(elem()->basic_type());
3165 //if (index_not_size) --max_hi; // type of a valid array index, FTR 3165 //if (index_not_size) --max_hi; // type of a valid array index, FTR
3166 bool chg = false; 3166 bool chg = false;
3167 if (lo < min_lo) { lo = min_lo; chg = true; } 3167 if (lo < min_lo) { lo = min_lo; chg = true; }
3168 if (hi > max_hi) { hi = max_hi; chg = true; } 3168 if (hi > max_hi) { hi = max_hi; chg = true; }
3169 // Negative length arrays will produce weird intermediate dead fath-path code
3169 if (lo > hi) 3170 if (lo > hi)
3170 return NULL; 3171 return TypeInt::ZERO;
3171 if (!chg) 3172 if (!chg)
3172 return size; 3173 return size;
3173 return TypeInt::make(lo, hi, Type::WidenMin); 3174 return TypeInt::make(lo, hi, Type::WidenMin);
3174 } 3175 }
3175 3176
3176 //-------------------------------cast_to_size---------------------------------- 3177 //-------------------------------cast_to_size----------------------------------
3177 const TypeAryPtr* TypeAryPtr::cast_to_size(const TypeInt* new_size) const { 3178 const TypeAryPtr* TypeAryPtr::cast_to_size(const TypeInt* new_size) const {
3178 assert(new_size != NULL, ""); 3179 assert(new_size != NULL, "");
3179 new_size = narrow_size_type(new_size, elem()->basic_type()); 3180 new_size = narrow_size_type(new_size);
3180 if (new_size == NULL) // Negative length arrays will produce weird
3181 new_size = TypeInt::ZERO; // intermediate dead fast-path goo
3182 if (new_size == size()) return this; 3181 if (new_size == size()) return this;
3183 const TypeAry* new_ary = TypeAry::make(elem(), new_size); 3182 const TypeAry* new_ary = TypeAry::make(elem(), new_size);
3184 return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id); 3183 return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id);
3185 } 3184 }
3186 3185