[Bug c++/90955] New: Wrong optimization: erroneous sum of compile-time constants
lists at xandea dot de
gcc-bugzilla@gcc.gnu.org
Fri Jun 21 11:43:00 GMT 2019
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'
More information about the Gcc-bugs
mailing list