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'

Reply via email to