diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2023-05-23 12:34:45 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2023-05-23 14:56:13 +0200 |
commit | 8d5f050dabbf6dd3b992c3b46661848dbcf30d9e (patch) | |
tree | a52fb02ae076bdf29c63729eec7fe04e48a18c99 /gcc | |
parent | 0b4ae6e1ec8d71ab0dd1612999bb78108d56f4c2 (diff) | |
download | gcc-8d5f050dabbf6dd3b992c3b46661848dbcf30d9e.zip gcc-8d5f050dabbf6dd3b992c3b46661848dbcf30d9e.tar.gz gcc-8d5f050dabbf6dd3b992c3b46661848dbcf30d9e.tar.bz2 |
Remove buggy special case in irange::invert [PR109934].
This patch removes a buggy special case in irange::invert which seems
to have been broken for a while, and probably never triggered because
the legacy code was handled elsewhere, and the non-legacy code was
using an int_range_max of int_range<255> which made it extremely
likely for num_ranges == 255. However, with auto-resizing ranges,
int_range_max will start off at 3 and can hit this bogus code in the
unswitching code.
PR tree-optimization/109934
gcc/ChangeLog:
* value-range.cc (irange::invert): Remove buggy special case.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-ssa/pr109934.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr109934.c | 22 | ||||
-rw-r--r-- | gcc/value-range.cc | 8 |
2 files changed, 22 insertions, 8 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109934.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109934.c new file mode 100644 index 0000000..08bd5ce --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109934.c @@ -0,0 +1,22 @@ +// { dg-do run } +// { dg-options "-O3" } + +int printf(const char *, ...); +short a; +long b = 3, c; +int d(int e) { + switch (e) + case 111: + case 222: + case 44: + return 0; + return e; +} +int main() { + for (; a >= 0; --a) + if (d(c + 23) - 23) + b = 0; + + if (b != 3) + __builtin_abort (); +} diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 45b1e65..874a184 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -1650,14 +1650,6 @@ irange::invert () wide_int type_min = wi::min_value (prec, sign); wide_int type_max = wi::max_value (prec, sign); m_nonzero_mask = wi::minus_one (prec); - if (m_num_ranges == m_max_ranges - && lower_bound () != type_min - && upper_bound () != type_max) - { - m_base[1] = type_max; - m_num_ranges = 1; - return; - } // At this point, we need one extra sub-range to represent the // inverse. |