https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97501
Bug ID: 97501
Summary: [11 Regression] ICE in verify_range, at
value-range.cc:369, -O2 on dead overflowing nested
loops
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: mwindsor at imperial dot ac.uk
Target Milestone: ---
When compiling code including an (unreachable) nested pair of over/underflowing
loops, recent git versions of GCC11 experience an ICE in value-range.cc:369.
This seems a different bug from #96430, #97317, and #97467: eg it contains no
bitshifts or casts, and exhibits on snapshots after the most recent of those
bugs was fixed.
I am seeing this on git revision `f0c0f124ebe28b71abccbd7247678c9ac608b649`
(fetched 2020-10-20) on x86_64-pc-linux-gnu, on which this report is based. I
have also seen this on, for instance, revision
`8949b985dbaf07d433bd57d2883e1e5414f20e75` (fetched 2020-10-13) on
powerpc64le-unknown-linux-gnu. GCC 10.2.0 on x86_64-apple-darwin19 does NOT
exhibit the ICE, so I presume this is a GCC11 regression. I'm unsure of the
first revision to exhibit this at the moment.
Considering the following example (`mwe-full.c`; preprocessing gives the same
file modulo line directives):
===
static int c = 0;
int main() {
int b = 0;
if (c) {
for (;; b--)
do
b++;
while (b);
}
}
===
(This comes from a C-Reduced version which didn't have the check on `c`; I
added this to avoid run-time-live UB, but the bug exhibits without it)
`gcc -O2 -v -save-temps mwe-full.c` gives me:
===
Using built-in specs.
COLLECT_GCC=/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/bin/gcc
COLLECT_LTO_WRAPPER=/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/libexec/gcc/x86_64-pc-linux-gnu/11.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /data/mwindsor/old_compilers/gcc-snapshots/git/configure
--prefix=/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.0.0 20201020 (experimental) (GCC)
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-mtune=generic' '-march=x86-64'
'-dumpdir' 'a-'
/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/libexec/gcc/x86_64-pc-linux-gnu/11.0.0/cc1
-E -quiet -v -imultiarch x86_64-linux-gnu mwe-full.c -mtune=generic
-march=x86-64 -O2 -fpch-preprocess -o a-mwe-full.i
ignoring non-existent directory "/usr/local/include/x86_64-linux-gnu"
ignoring non-existent directory
"/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/lib/gcc/x86_64-pc-linux-gnu/11.0.0/include
/usr/local/include
/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/include
/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/lib/gcc/x86_64-pc-linux-gnu/11.0.0/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-mtune=generic' '-march=x86-64'
'-dumpdir' 'a-'
/data/mwindsor/old_compilers/gcc-snapshots/2020-10-20/libexec/gcc/x86_64-pc-linux-gnu/11.0.0/cc1
-fpreprocessed a-mwe-full.i -quiet -dumpdir a- -dumpbase mwe-full.c
-dumpbase-ext .c -mtune=generic -march=x86-64 -O2 -version -o a-mwe-full.s
GNU C17 (GCC) version 11.0.0 20201020 (experimental) (x86_64-pc-linux-gnu)
compiled by GNU C version 11.0.0 20201020 (experimental), GMP version
6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version isl-0.18-GMP
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
GNU C17 (GCC) version 11.0.0 20201020 (experimental) (x86_64-pc-linux-gnu)
compiled by GNU C version 11.0.0 20201020 (experimental), GMP version
6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version isl-0.18-GMP
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: 8980ce301bb16f6f8206916710982a55
during GIMPLE pass: evrp
mwe-full.c: In function ‘main’:
mwe-full.c:11:1: internal compiler error: in verify_range, at
value-range.cc:369
11 | }
| ^
0x78f55b irange::verify_range()
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/value-range.cc:369
0x10d9d03 irange::irange_set(tree_node*, tree_node*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/value-range.cc:172
0x10d9d03 irange::set(tree_node*, tree_node*, value_range_kind)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/value-range.cc:226
0x10d8f4c irange::operator=(irange const&)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/value-range.cc:40
0x18c168e gimple_ranger::range_of_stmt(irange&, gimple*, tree_node*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/gimple-range.cc:996
0x18bdea8 gimple_ranger::range_of_expr(irange&, tree_node*, gimple*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/gimple-range.cc:883
0x10d5cdd range_query::value_of_expr(tree_node*, gimple*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/value-query.cc:85
0x175f681 hybrid_folder::value_of_expr(tree_node*, gimple*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/gimple-ssa-evrp.c:235
0xf8fc96 substitute_and_fold_dom_walker::before_dom_children(basic_block_def*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/tree-ssa-propagate.c:1072
0x1737187 dom_walker::walk(basic_block_def*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/domwalk.c:309
0xf8f2c5 substitute_and_fold_engine::substitute_and_fold(basic_block_def*)
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/tree-ssa-propagate.c:1283
0x175f2f6 execute_early_vrp
/data/mwindsor/old_compilers/gcc-snapshots/git/gcc/gimple-ssa-evrp.c:349
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
===
(old_compilers is a misnomer in the above!)
The ICE also exhibits under -O3, but not under -O1 or -O0. Turning on -fwrapv
or -fsanitize=undefined *suppresses* the ICE, so it seems related to the loop
overflow. Neither -fnostrict-aliasing nor -fno-aggressive-loop-optimizations
produce any change, and running the -O2 compilation result with either wrapv or
UBsan produces no run-time errors.