https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90955
Bug ID: 90955 Summary: Wrong optimization: erroneous sum of compile-time constants Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: lists at xandea dot de Target Milestone: --- Created attachment 46507 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46507&action=edit minimum working example, preprocessed Optimisation removes accumulated constant members of a struct and replaces them with a compile-time calculated constant. However, this constant is wrong and the functions computes a wrong result. The error disappears when compiling without optimisation (-O0), or accessing the struct (e.g. ::printf("%p\n", start); ) in the function, or using std::memcpy to temporary buffer instead of reinterpret_cast. This could be a strict-aliasing issue, but no warning is generated. The preprocessed code is the same for GCC 6.3.0 (from Debian) and 9.1.0 (built locally). Originally, this issue appeared in IPv4 pseudo header calculation related to the UDP checksum, but I removed the unneeded struct members and operations. user@host:/tmp$ /run/shm/prefix-gcc-9.1/bin/g++ -v -save-temps -std=c++14 -g -O3 -Wall -pedantic -Wextra -Wstrict-aliasing bug.cpp -o bug Using built-in specs. COLLECT_GCC=/run/shm/prefix-gcc-9.1/bin/g++ COLLECT_LTO_WRAPPER=/dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.1.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../gcc-9.1.0/configure --enable-languages=c,c++ --disable-multilib --prefix=/run/shm/prefix-gcc-9.1 Thread model: posix gcc version 9.1.0 (GCC) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++14' '-g' '-O3' '-Wall' '-Wpedantic' '-Wextra' '-Wstrict-aliasing' '-o' 'bug' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.1.0/cc1plus -E -quiet -v -imultiarch x86_64-linux-gnu -iprefix /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/ -D_GNU_SOURCE bug.cpp -mtune=generic -march=x86-64 -std=c++14 -Wall -Wpedantic -Wextra -Wstrict-aliasing -g -fworking-directory -O3 -fpch-preprocess -o bug.ii ignoring nonexistent directory "/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../x86_64-pc-linux-gnu/include" ignoring duplicate directory "/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0" ignoring duplicate directory "/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/x86_64-pc-linux-gnu" ignoring duplicate directory "/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/backward" ignoring duplicate directory "/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/9.1.0/include" ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring duplicate directory "/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/9.1.0/include-fixed" ignoring nonexistent directory "/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../x86_64-pc-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0 /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/x86_64-pc-linux-gnu /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/backward /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/include /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/include-fixed /usr/local/include /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/../../include /usr/include/x86_64-linux-gnu /usr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++14' '-g' '-O3' '-Wall' '-Wpedantic' '-Wextra' '-Wstrict-aliasing' '-o' 'bug' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.1.0/cc1plus -fpreprocessed bug.ii -quiet -dumpbase bug.cpp -mtune=generic -march=x86-64 -auxbase bug -g -O3 -Wall -Wpedantic -Wextra -Wstrict-aliasing -std=c++14 -version -o bug.s GNU C++14 (GCC) version 9.1.0 (x86_64-pc-linux-gnu) compiled by GNU C version 9.1.0, 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=100 --param ggc-min-heapsize=131072 GNU C++14 (GCC) version 9.1.0 (x86_64-pc-linux-gnu) compiled by GNU C version 9.1.0, 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=100 --param ggc-min-heapsize=131072 Compiler executable checksum: feaf72a6ddb03f0dd0613a43c9096015 COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++14' '-g' '-O3' '-Wall' '-Wpedantic' '-Wextra' '-Wstrict-aliasing' '-o' 'bug' '-shared-libgcc' '-mtune=generic' '-march=x86-64' as -v --64 -o bug.o bug.s GNU assembler version 2.28 (x86_64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.28 COMPILER_PATH=/dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.1.0/:/dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/ LIBRARY_PATH=/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/:/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib64/:/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++14' '-g' '-O3' '-Wall' '-Wpedantic' '-Wextra' '-Wstrict-aliasing' '-o' 'bug' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.1.0/collect2 -plugin /dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.1.0/liblto_plugin.so -plugin-opt=/dev/shm/prefix-gcc-9.1/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.1.0/lto-wrapper -plugin-opt=-fresolution=bug.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 bug /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/crtbegin.o -L/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0 -L/dev/shm/prefix-gcc-9.1/bin/../lib/gcc -L/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib64 -L/dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../.. bug.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /dev/shm/prefix-gcc-9.1/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++14' '-g' '-O3' '-Wall' '-Wpedantic' '-Wextra' '-Wstrict-aliasing' '-o' 'bug' '-shared-libgcc' '-mtune=generic' '-march=x86-64'