< prev index next >
src/share/vm/opto/type.cpp
Print this page
rev 9644 : 8145096: Undefined behaviour in HotSpot
Summary: Fix some integer overflows
Reviewed-by: duke
*** 1368,1379 ****
if (_lo < olo || _hi > ohi)
return this; // doesn't narrow; pretty wierd
// The new type narrows the old type, so look for a "death march".
// See comments on PhaseTransform::saturate.
! juint nrange = _hi - _lo;
! juint orange = ohi - olo;
if (nrange < max_juint - 1 && nrange > (orange >> 1) + (SMALLINT*2)) {
// Use the new type only if the range shrinks a lot.
// We do not want the optimizer computing 2^31 point by point.
return old;
}
--- 1368,1379 ----
if (_lo < olo || _hi > ohi)
return this; // doesn't narrow; pretty wierd
// The new type narrows the old type, so look for a "death march".
// See comments on PhaseTransform::saturate.
! juint nrange = (juint)_hi - _lo;
! juint orange = (juint)ohi - olo;
if (nrange < max_juint - 1 && nrange > (orange >> 1) + (SMALLINT*2)) {
// Use the new type only if the range shrinks a lot.
// We do not want the optimizer computing 2^31 point by point.
return old;
}
*** 1402,1412 ****
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeInt::hash(void) const {
! return _lo+_hi+_widen+(int)Type::Int;
}
//------------------------------is_finite--------------------------------------
// Has a finite value
bool TypeInt::is_finite() const {
--- 1402,1412 ----
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeInt::hash(void) const {
! return java_add(java_add(_lo, _hi), java_add(_widen, (int)Type::Int));
}
//------------------------------is_finite--------------------------------------
// Has a finite value
bool TypeInt::is_finite() const {
*** 1583,1593 ****
}
if (min < _lo && _hi < max) {
// If neither endpoint is extremal yet, push out the endpoint
// which is closer to its respective limit.
if (_lo >= 0 || // easy common case
! (julong)(_lo - min) >= (julong)(max - _hi)) {
// Try to widen to an unsigned range type of 32/63 bits:
if (max >= max_juint && _hi < max_juint)
return make(_lo, max_juint, WidenMax);
else
return make(_lo, max, WidenMax);
--- 1583,1593 ----
}
if (min < _lo && _hi < max) {
// If neither endpoint is extremal yet, push out the endpoint
// which is closer to its respective limit.
if (_lo >= 0 || // easy common case
! ((julong)_lo - min) >= ((julong)max - _hi)) {
// Try to widen to an unsigned range type of 32/63 bits:
if (max >= max_juint && _hi < max_juint)
return make(_lo, max_juint, WidenMax);
else
return make(_lo, max, WidenMax);
*** 2402,2412 ****
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypePtr::hash(void) const {
! return _ptr + _offset + hash_speculative() + _inline_depth;
;
}
/**
* Return same type without a speculative part
--- 2402,2412 ----
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypePtr::hash(void) const {
! return java_add(java_add(_ptr, _offset), java_add( hash_speculative(), _inline_depth));
;
}
/**
* Return same type without a speculative part
*** 3212,3225 ****
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeOopPtr::hash(void) const {
return
! (const_oop() ? const_oop()->hash() : 0) +
! _klass_is_exact +
! _instance_id +
! TypePtr::hash();
}
//------------------------------dump2------------------------------------------
#ifndef PRODUCT
void TypeOopPtr::dump2( Dict &d, uint depth, outputStream *st ) const {
--- 3212,3223 ----
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeOopPtr::hash(void) const {
return
! java_add(java_add(const_oop() ? const_oop()->hash() : 0, _klass_is_exact),
! java_add(_instance_id, TypePtr::hash()));
}
//------------------------------dump2------------------------------------------
#ifndef PRODUCT
void TypeOopPtr::dump2( Dict &d, uint depth, outputStream *st ) const {
*** 3822,3832 ****
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeInstPtr::hash(void) const {
! int hash = klass()->hash() + TypeOopPtr::hash();
return hash;
}
//------------------------------dump2------------------------------------------
// Dump oop Type
--- 3820,3830 ----
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeInstPtr::hash(void) const {
! int hash = java_add(klass()->hash(), TypeOopPtr::hash());
return hash;
}
//------------------------------dump2------------------------------------------
// Dump oop Type
*** 4740,4750 ****
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeKlassPtr::hash(void) const {
! return klass()->hash() + TypePtr::hash();
}
//------------------------------singleton--------------------------------------
// TRUE if Type is a singleton type, FALSE otherwise. Singletons are simple
// constants
--- 4738,4748 ----
}
//------------------------------hash-------------------------------------------
// Type-specific hashing function.
int TypeKlassPtr::hash(void) const {
! return java_add(klass()->hash(), TypePtr::hash());
}
//------------------------------singleton--------------------------------------
// TRUE if Type is a singleton type, FALSE otherwise. Singletons are simple
// constants
< prev index next >