Use TYPE_MIN/MAX_VALUE in set_varying when possible.

We currently create new trees every time... which is very wasteful and time
consuming. Instead, just use the TYPE_MIN/MAX_VALUE.

	* value-range.h (irange::set_varying): Use TYPE_MIN_VALUE and
	TYPE_MAX_VALUE instead of creating new trees when possible.
This commit is contained in:
Andrew MacLeod 2021-09-28 13:11:22 -04:00
parent 4b8ca6c617
commit e828f4b589

View File

@ -476,10 +476,21 @@ irange::set_varying (tree type)
if (INTEGRAL_TYPE_P (type))
{
// Strict enum's require varying to be not TYPE_MIN/MAX, but rather
// min_value and max_value.
wide_int min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
wide_int max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
m_base[0] = wide_int_to_tree (type, min);
m_base[1] = wide_int_to_tree (type, max);
if (wi::eq_p (max, wi::to_wide (TYPE_MAX_VALUE (type)))
&& wi::eq_p (min, wi::to_wide (TYPE_MIN_VALUE (type))))
{
m_base[0] = TYPE_MIN_VALUE (type);
m_base[1] = TYPE_MAX_VALUE (type);
}
else
{
m_base[0] = wide_int_to_tree (type, min);
m_base[1] = wide_int_to_tree (type, max);
}
}
else if (POINTER_TYPE_P (type))
{