From e828f4b5898896240b2ae5d5030c539aff28ea24 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Tue, 28 Sep 2021 13:11:22 -0400 Subject: 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. --- gcc/value-range.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/value-range.h b/gcc/value-range.h index a8adc50..39e8f3b 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -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)) { -- cgit v1.1