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'

Reply via email to