https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84658
Bug ID: 84658 Summary: -O3 -fmerge-all-constants causes incorrect for-each loop generation. Product: gcc Version: 8.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: gnubugs at maulingmonkey dot com Target Milestone: --- The following program should print a few numbers then exit. Due to incorrect codegen when combining -fmerge-all-constants, -O3, and duplicate arrays of sufficient length on GCC 7.2.0+, Bar generates no bounds check and will infinite loop until it reads past the end of kTestCases and eventually crashes: #include <stdio.h> void Foo() { const int kTestCases[] = { 0, 1, 2, 3, 4, 5, 8, 15, 16, 17, 512, 1020, 1021, 1022, 1023, 1024 }; for (int count : kTestCases) { printf("%d\n", count); } } void Bar() { const int kTestCases[] = { 0, 1, 2, 3, 4, 5, 8, 15, 16, 17, 512, 1020, 1021, 1022, 1023, 1024 }; for (int count : kTestCases) { printf("%d\n", count); } } int main() { Foo(); Bar(); } I originally reproduced this bug against MinGW's GCC 7.2.0, and since reproduced on Wandbox's 7.2.0 and 8.0.1 (20180228) versions of GCC, but not 7.1.0. (Wandbox uses -O2) Wandbox 8.0.1 (20180228) GCC permalink: https://wandbox.org/permlink/A0dVICb3CDTIoheX MinGW 7.2.0 repro commands: C:/mingw/bin/x86_64-w64-mingw32-g++ -O3 -fmerge-all-constants -o "main.o" -c "main.cpp" C:/mingw/bin/x86_64-w64-mingw32-g++ -o main.exe main.o Wandbox's 8.0.1 (20180228) repro commands: g++ prog.cc -Wall -Wextra -O2 -march=native "-fmerge-all-constants" Version spam from g++ -v commands follows for completeness (in the case of wandbox, with a little extra spam - I don't know how to tell it not to pass source files.) # MinGW 7.2.0 C:\>C:/mingw/bin/x86_64-w64-mingw32-g++ -v Using built-in specs. COLLECT_GCC=C:/mingw/bin/x86_64-w64-mingw32-g++ COLLECT_LTO_WRAPPER=C:/mingw/bin/../libexec/gcc/x86_64-w64-mingw32/7.2.0/lto-wrapper.exe Target: x86_64-w64-mingw32 Configured with: ../../../src/gcc-7.2.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw720/x86_64-720-win32-sjlj-rt_v5-rev0/mingw64 --enable-shared --enable-static --enable-targets=all --enable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=win32 --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --enable-sjlj-exceptions --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch-32=i686 --with-arch-64=nocona --with-tune-32=generic --with-tune-64=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw720/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw720/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw720/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw720/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-win32-sjlj-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw720/x86_64-720-win32-sjlj-rt_v5-rev0/mingw64/opt/include -I/c/mingw720/prerequisites/x86_64-zlib-static/include -I/c/mingw720/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw720/x86_64-720-win32-sjlj-rt_v5-rev0/mingw64/opt/include -I/c/mingw720/prerequisites/x86_64-zlib-static/include -I/c/mingw720/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw720/x86_64-720-win32-sjlj-rt_v5-rev0/mingw64/opt/include -I/c/mingw720/prerequisites/x86_64-zlib-static/include -I/c/mingw720/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw720/x86_64-720-win32-sjlj-rt_v5-rev0/mingw64/opt/lib -L/c/mingw720/prerequisites/x86_64-zlib-static/lib -L/c/mingw720/prerequisites/x86_64-w64-mingw32-static/lib ' Thread model: win32 gcc version 7.2.0 (x86_64-win32-sjlj-rev0, Built by MinGW-W64 project) # Wandbox 7.2.0 $ g++ prog.cc "-v" Using built-in specs. COLLECT_GCC=/opt/wandbox/gcc-7.2.0/bin/g++ COLLECT_LTO_WRAPPER=/opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../gcc-7.2.0/configure --prefix=/opt/wandbox/gcc-7.2.0 --enable-languages=c,c++ --disable-multilib --without-ppl --without-cloog-ppl --enable-checking=release --disable-nls LDFLAGS=-Wl,-rpath,/opt/wandbox/gcc-7.2.0/lib,-rpath,/opt/wandbox/gcc-7.2.0/lib64,-rpath,/opt/wandbox/gcc-7.2.0/lib32 --enable-lto Thread model: posix gcc version 7.2.0 (GCC) COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/cc1plus -quiet -v -I /opt/wandbox/boost-sml/include -I /opt/wandbox/boost-di/include -I /opt/wandbox/range-v3/include -I /opt/wandbox/nlohmann-json/src -I /opt/wandbox/cmcstl2/include -imultiarch x86_64-linux-gnu -D_GNU_SOURCE prog.cc -quiet -dumpbase prog.cc -mtune=generic -march=x86-64 -auxbase prog -version -o /tmp/ccHRA5WI.s GNU C++14 (GCC) version 7.2.0 (x86_64-pc-linux-gnu) compiled by GNU C version 7.2.0, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version none GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../x86_64-pc-linux-gnu/include" ignoring nonexistent directory "/opt/wandbox/nlohmann-json/src" #include "..." search starts here: #include <...> search starts here: /opt/wandbox/boost-sml/include /opt/wandbox/boost-di/include /opt/wandbox/range-v3/include /opt/wandbox/cmcstl2/include /opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../include/c++/7.2.0 /opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../include/c++/7.2.0/x86_64-pc-linux-gnu /opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward /opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include /opt/wandbox/gcc-7.2.0/include /opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. GNU C++14 (GCC) version 7.2.0 (x86_64-pc-linux-gnu) compiled by GNU C version 7.2.0, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version none GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: e4573953ae983b800fb10c1669d61c0c COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' as -v -I /opt/wandbox/boost-sml/include -I /opt/wandbox/boost-di/include -I /opt/wandbox/range-v3/include -I /opt/wandbox/nlohmann-json/src -I /opt/wandbox/cmcstl2/include --64 -o /tmp/ccfqJWSe.o /tmp/ccHRA5WI.s GNU assembler version 2.26.1 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.26.1 COMPILER_PATH=/opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/:/opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/:/opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/:/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/:/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/ LIBRARY_PATH=/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/:/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib64/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-linux-gnu/:/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/collect2 -plugin /opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/liblto_plugin.so -plugin-opt=/opt/wandbox/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cczT5bRK.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o prog.exe /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/crtbegin.o -L/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0 -L/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../.. -rpath /opt/wandbox/gcc-7.2.0/lib64 -lpthread /tmp/ccfqJWSe.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /opt/wandbox/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' # Wandbox 8.0.1 (20180228) $ g++ prog.cc "-v" Using built-in specs. COLLECT_GCC=/opt/wandbox/gcc-head/bin/g++ COLLECT_LTO_WRAPPER=/opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.1/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../source/configure --prefix=/opt/wandbox/gcc-head --enable-languages=c,c++ --disable-multilib --without-ppl --without-cloog-ppl --enable-checking=release --disable-nls --enable-lto LDFLAGS=-Wl,-rpath,/opt/wandbox/gcc-head/lib,-rpath,/opt/wandbox/gcc-head/lib64,-rpath,/opt/wandbox/gcc-head/lib32 Thread model: posix gcc version 8.0.1 20180228 (experimental) (GCC) COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.1/cc1plus -quiet -v -I /opt/wandbox/boost-sml/include -I /opt/wandbox/boost-di/include -I /opt/wandbox/range-v3/include -I /opt/wandbox/nlohmann-json/src -I /opt/wandbox/cmcstl2/include -imultiarch x86_64-linux-gnu -D_GNU_SOURCE prog.cc -quiet -dumpbase prog.cc -mtune=generic -march=x86-64 -auxbase prog -version -o /tmp/ccd0D4l2.s GNU C++14 (GCC) version 8.0.1 20180228 (experimental) (x86_64-pc-linux-gnu) compiled by GNU C version 8.0.1 20180228 (experimental), GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version none GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../../../x86_64-pc-linux-gnu/include" ignoring nonexistent directory "/opt/wandbox/nlohmann-json/src" #include "..." search starts here: #include <...> search starts here: /opt/wandbox/boost-sml/include /opt/wandbox/boost-di/include /opt/wandbox/range-v3/include /opt/wandbox/cmcstl2/include /opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../../../include/c++/8.0.1 /opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../../../include/c++/8.0.1/x86_64-pc-linux-gnu /opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../../../include/c++/8.0.1/backward /opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/include /opt/wandbox/gcc-head/include /opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. GNU C++14 (GCC) version 8.0.1 20180228 (experimental) (x86_64-pc-linux-gnu) compiled by GNU C version 8.0.1 20180228 (experimental), GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version none GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 19cc421d9c46f395a0adf79017271593 COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' as -v -I /opt/wandbox/boost-sml/include -I /opt/wandbox/boost-di/include -I /opt/wandbox/range-v3/include -I /opt/wandbox/nlohmann-json/src -I /opt/wandbox/cmcstl2/include --64 -o /tmp/ccP1GKIN.o /tmp/ccd0D4l2.s GNU assembler version 2.26.1 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.26.1 COMPILER_PATH=/opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.1/:/opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.1/:/opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/:/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/:/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/ LIBRARY_PATH=/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/:/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../../../lib64/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-linux-gnu/:/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.1/collect2 -plugin /opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.1/liblto_plugin.so -plugin-opt=/opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccngDN7y.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o prog.exe /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/crtbegin.o -L/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1 -L/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/../../.. -rpath /opt/wandbox/gcc-head/lib64 -lpthread /tmp/ccP1GKIN.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /opt/wandbox/gcc-head/lib/gcc/x86_64-pc-linux-gnu/8.0.1/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o COLLECT_GCC_OPTIONS='-o' 'prog.exe' '-I' '/opt/wandbox/boost-sml/include' '-I' '/opt/wandbox/boost-di/include' '-I' '/opt/wandbox/range-v3/include' '-I' '/opt/wandbox/nlohmann-json/src' '-I' '/opt/wandbox/cmcstl2/include' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64'