diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2021-09-28 13:11:22 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2021-10-06 09:11:50 -0400 |
commit | e828f4b5898896240b2ae5d5030c539aff28ea24 (patch) | |
tree | 2ebb40958a0a3a527b76d921b76754c63086575e /gcc | |
parent | 4b8ca6c6177b2bd948c1cb2a116955b942751559 (diff) | |
download | gcc-e828f4b5898896240b2ae5d5030c539aff28ea24.zip gcc-e828f4b5898896240b2ae5d5030c539aff28ea24.tar.gz gcc-e828f4b5898896240b2ae5d5030c539aff28ea24.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/value-range.h | 15 |
1 files changed, 13 insertions, 2 deletions
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)) { |