< prev index next >
src/hotspot/share/adlc/dfa.cpp
Print this page
*** 757,779 ****
return cost;
}
int Expr::compute_min(const Expr *c1, const Expr *c2) {
! int result = c1->_min_value + c2->_min_value;
! assert( result >= 0, "Invalid cost computation");
! return result;
}
int Expr::compute_max(const Expr *c1, const Expr *c2) {
! int result = c1->_max_value + c2->_max_value;
! if( result < 0 ) { // check for overflow
! result = Expr::Max;
}
! return result;
}
void Expr::print() const {
if( _external_name != NULL ) {
printf(" %s == (%s) === [%d, %d]\n", _external_name, _expr, _min_value, _max_value);
--- 757,787 ----
return cost;
}
int Expr::compute_min(const Expr *c1, const Expr *c2) {
! int v1 = c1->_min_value;
! int v2 = c2->_min_value;
! assert(0 <= v2 && v2 <= Expr::Max, "sanity");
! assert(v1 <= Expr::Max - v2, "Invalid cost computation");
! return v1 + v2;
}
+
int Expr::compute_max(const Expr *c1, const Expr *c2) {
! int v1 = c1->_max_value;
! int v2 = c2->_max_value;
!
! // Check for overflow without producing UB. If v2 is positive
! // and not larger than Max, the subtraction cannot underflow.
! assert(0 <= v2 && v2 <= Expr::Max, "sanity");
! if (v1 > Expr::Max - v2) {
! return Expr::Max;
}
! return v1 + v2;
}
void Expr::print() const {
if( _external_name != NULL ) {
printf(" %s == (%s) === [%d, %d]\n", _external_name, _expr, _min_value, _max_value);
< prev index next >