public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/97456] New: An incorrect optimization causes a function to always return the same value when using -flto
@ 2020-10-16 10:25 pqfrml at gmail dot com
  2020-10-16 10:29 ` [Bug c++/97456] " pqfrml at gmail dot com
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: pqfrml at gmail dot com @ 2020-10-16 10:25 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97456

            Bug ID: 97456
           Summary: An incorrect optimization causes a function to always
                    return the same value when using -flto
           Product: gcc
           Version: 10.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pqfrml at gmail dot com
  Target Milestone: ---

https://godbolt.org/z/f65cTb < Minimal example

To the best of my knowledge this is incorrect behavior and it has not yet been
reported.

This is my minimal example:

A floating point reference is passed twice to a function,
the function constructs one std::complex(called a) from the reference,
it constructs another zeroed std::complex(called b),
it assigns b + a to b,
it has a branch, where if b is equal to zero, the function returns 1,
if not it continues and prints b.imag() before returning 0.

For this to work the compiler cannot know of input value in advance which is
why I have used a random number in the example. It can also be user input or
something else opaque at compile time.
The function must be called at least twice for the behavior to appear.
-flto must be on and -O2 or -O3

-fsanitize=undefined causes the bug to disappear, -fno-strict-aliasing -fwrapv
-fno-aggressive-loop-optimizations doesn't make a difference and -Wall and
-Wextra gives no warnings.

The behavior appeared in 10.1 and is present in gcc trunk on godolt.
It is consistent on godbolt, my stationary PC and my laptop.
The files I will give you are from my stationary.

The minimum compilation command is:
g++ -O2 -flto -std=c++17 bug.cpp

and the files I will give you used:
g++ -v -save-temps -O2 -flto -std=c++17 bug.cpp -Wall -Wextra \
-fno-strict-aliasing -fwrapv -fno-aggressive-loop-optimizations

The unexpected behaviour is that it always returns the 1 from the branch, even
when it is impossible for it to evaluate to true, as it should be in my
example.
b needs to be used somehow after the branch, and the easiest way I have found
is console output.

My stationary computer is using Manjaro Linux and I am using the default gcc
from the package manager.

Compiler output:
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl
--with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit
--enable-cet=auto --enable-checking=release --enable-clocale=gnu
--enable-default-pie --enable-default-ssp --enable-gnu-indirect-function
--enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id
--enable-lto --enable-multilib --enable-plugin --enable-shared
--enable-threads=posix --disable-libssp --disable-libstdcxx-pch
--disable-libunwind-exceptions --disable-werror
gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-O2' '-flto' '-std=c++17' '-Wall'
'-Wextra' '-fno-strict-aliasing' '-fwrapv' '-fno-aggressive-loop-optimizations'
'-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/cc1plus -E -quiet -v -D_GNU_SOURCE
bug.cpp -mtune=generic -march=x86-64 -std=c++17 -Wall -Wextra -flto
-fno-strict-aliasing -fwrapv -fno-aggressive-loop-optimizations -O2
-fpch-preprocess -o bug.ii
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0

/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/x86_64-pc-linux-gnu

/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/backward
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include-fixed
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-O2' '-flto' '-std=c++17' '-Wall'
'-Wextra' '-fno-strict-aliasing' '-fwrapv' '-fno-aggressive-loop-optimizations'
'-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/cc1plus -fpreprocessed bug.ii -quiet
-dumpbase bug.cpp -mtune=generic -march=x86-64 -auxbase bug -O2 -Wall -Wextra
-std=c++17 -version -flto -fno-strict-aliasing -fwrapv
-fno-aggressive-loop-optimizations -o bug.s
GNU C++17 (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 10.2.0, GMP version 6.2.0, MPFR version
4.1.0, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C++17 (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 10.2.0, GMP version 6.2.0, MPFR version
4.1.0, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 2affcd71b0797e2421aae734ab600c81
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-O2' '-flto' '-std=c++17' '-Wall'
'-Wextra' '-fno-strict-aliasing' '-fwrapv' '-fno-aggressive-loop-optimizations'
'-shared-libgcc' '-mtune=generic' '-march=x86-64'
 as -v --64 -o bug.o bug.s
GNU assembler version 2.35 (x86_64-pc-linux-gnu) using BFD version (GNU
Binutils) 2.35
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-O2' '-flto' '-std=c++17' '-Wall'
'-Wextra' '-fno-strict-aliasing' '-fwrapv' '-fno-aggressive-loop-optimizations'
'-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/collect2 -plugin
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/liblto_plugin.so
-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.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 -flto
--build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker
/lib64/ld-linux-x86-64.so.2 -pie
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/Scrt1.o
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtbeginS.o
-L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0
-L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib -L/lib/../lib
-L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../.. bug.o
-lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtendS.o
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/crtn.o
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper -fresolution=bug.res
-flinker-output=pie bug.o 
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper -fresolution=bug.res
-flinker-output=pie bug.o 
g++ @/tmp/ccZAfZSN
Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl
--with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit
--enable-cet=auto --enable-checking=release --enable-clocale=gnu
--enable-default-pie --enable-default-ssp --enable-gnu-indirect-function
--enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id
--enable-lto --enable-multilib --enable-plugin --enable-shared
--enable-threads=posix --disable-libssp --disable-libstdcxx-pch
--disable-libunwind-exceptions --disable-werror
gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fPIC' '-O2' '-v'
'-save-temps' '-O2' '-Wextra' '-fno-strict-aliasing' '-fwrapv'
'-fno-aggressive-loop-optimizations' '-shared-libgcc' '-mtune=generic'
'-march=x86-64' '-fltrans-output-list=/tmp/ccFLP8uN.ltrans.out' '-fwpa'
'-fresolution=bug.res' '-flinker-output=pie' '-shared-libgcc'
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto1 -quiet -dumpbase bug.o
-mtune=generic -march=x86-64 -auxbase bug -O2 -O2 -Wextra -version -fno-openmp
-fno-openacc -fPIC -fno-strict-aliasing -fwrapv
-fno-aggressive-loop-optimizations
-fltrans-output-list=/tmp/ccFLP8uN.ltrans.out -fwpa -fresolution=bug.res
-flinker-output=pie @/tmp/ccq1CCRU
GNU GIMPLE (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 10.2.0, GMP version 6.2.0, MPFR version
4.1.0, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU GIMPLE (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 10.2.0, GMP version 6.2.0, MPFR version
4.1.0, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/../lib/:/lib/../lib/../lib/:/usr/lib/../lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../:/lib/:/usr/lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fPIC' '-O2' '-v'
'-save-temps' '-O2' '-Wextra' '-fno-strict-aliasing' '-fwrapv'
'-fno-aggressive-loop-optimizations' '-shared-libgcc' '-mtune=generic'
'-march=x86-64' '-fltrans-output-list=/tmp/ccFLP8uN.ltrans.out' '-fwpa'
'-fresolution=bug.res' '-flinker-output=pie' '-shared-libgcc'
[Leaving LTRANS /tmp/ccFLP8uN.ltrans.out]
g++ @/tmp/ccRp94jQ
Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl
--with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit
--enable-cet=auto --enable-checking=release --enable-clocale=gnu
--enable-default-pie --enable-default-ssp --enable-gnu-indirect-function
--enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id
--enable-lto --enable-multilib --enable-plugin --enable-shared
--enable-threads=posix --disable-libssp --disable-libstdcxx-pch
--disable-libunwind-exceptions --disable-werror
gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fPIC' '-O2' '-v'
'-save-temps' '-O2' '-Wextra' '-fno-strict-aliasing' '-fwrapv'
'-fno-aggressive-loop-optimizations' '-shared-libgcc' '-mtune=generic'
'-march=x86-64' '-fltrans-output-list=/tmp/ccFLP8uN.ltrans.out' '-fltrans' '-o'
'/tmp/ccFLP8uN.ltrans0.ltrans.o' '-shared-libgcc'
 /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto1 -quiet -dumpbase
ccFLP8uN.ltrans0.o -mtune=generic -march=x86-64 -auxbase-strip
/tmp/ccFLP8uN.ltrans0.ltrans.o -O2 -O2 -Wextra -version -fno-openmp
-fno-openacc -fPIC -fno-strict-aliasing -fwrapv
-fno-aggressive-loop-optimizations
-fltrans-output-list=/tmp/ccFLP8uN.ltrans.out -fltrans @/tmp/ccePO4q3 -o
ccFLP8uN.ltrans0.s
GNU GIMPLE (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 10.2.0, GMP version 6.2.0, MPFR version
4.1.0, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU GIMPLE (GCC) version 10.2.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 10.2.0, GMP version 6.2.0, MPFR version
4.1.0, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fPIC' '-O2' '-v'
'-save-temps' '-O2' '-Wextra' '-fno-strict-aliasing' '-fwrapv'
'-fno-aggressive-loop-optimizations' '-shared-libgcc' '-mtune=generic'
'-march=x86-64' '-fltrans-output-list=/tmp/ccFLP8uN.ltrans.out' '-fltrans' '-o'
'/tmp/ccFLP8uN.ltrans0.ltrans.o' '-shared-libgcc'
 as -v --64 -o /tmp/ccFLP8uN.ltrans0.ltrans.o ccFLP8uN.ltrans0.s
GNU assembler version 2.35 (x86_64-pc-linux-gnu) using BFD version (GNU
Binutils) 2.35
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/../lib/:/lib/../lib/../lib/:/usr/lib/../lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../:/lib/:/usr/lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fPIC' '-O2' '-v'
'-save-temps' '-O2' '-Wextra' '-fno-strict-aliasing' '-fwrapv'
'-fno-aggressive-loop-optimizations' '-shared-libgcc' '-mtune=generic'
'-march=x86-64' '-fltrans-output-list=/tmp/ccFLP8uN.ltrans.out' '-fltrans' '-o'
'/tmp/ccFLP8uN.ltrans0.ltrans.o' '-shared-libgcc'
[Leaving LTRANS /tmp/ccFLP8uN.ltrans0.o]
[Leaving a.out.lto_wrapper_args]
[Leaving /tmp/ccFLP8uN.ltrans0.ltrans.o]
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-O2' '-flto' '-std=c++17' '-Wall'
'-Wextra' '-fno-strict-aliasing' '-fwrapv' '-fno-aggressive-loop-optimizations'
'-shared-libgcc' '-mtune=generic' '-march=x86-64'

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-03-30 11:53 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-16 10:25 [Bug c++/97456] New: An incorrect optimization causes a function to always return the same value when using -flto pqfrml at gmail dot com
2020-10-16 10:29 ` [Bug c++/97456] " pqfrml at gmail dot com
2020-10-16 11:00 ` [Bug ipa/97456] [10/11 Regression] " rguenth at gcc dot gnu.org
2020-10-16 12:06 ` marxin at gcc dot gnu.org
2020-10-16 14:51 ` jamborm at gcc dot gnu.org
2020-10-16 15:56 ` jamborm at gcc dot gnu.org
2020-10-16 18:53 ` jamborm at gcc dot gnu.org
2020-10-16 18:54 ` [Bug tree-optimization/97456] " jamborm at gcc dot gnu.org
2020-10-19 17:22 ` cvs-commit at gcc dot gnu.org
2020-10-26 16:33 ` cvs-commit at gcc dot gnu.org
2020-10-26 16:34 ` jamborm at gcc dot gnu.org
2022-03-30 11:51 ` cvs-commit at gcc dot gnu.org
2022-03-30 11:53 ` jamborm at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).