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

            Bug ID: 108040
           Summary: -fdevirtualize causes part of function to be missing
                    in output
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alvinhochun at gmail dot com
  Target Milestone: ---

Created attachment 54057
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54057&action=edit
preprocessed source file

Using MSYS2 UCRT64 GCC 12.2.0

$ g++ -v
Using built-in specs.
COLLECT_GCC=C:\msys64\ucrt64\bin\g++.exe
COLLECT_LTO_WRAPPER=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-12.2.0/configure --prefix=/ucrt64
--with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32
--host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32
--with-native-system-header-dir=/ucrt64/include --libexe
cdir=/ucrt64/lib --enable-bootstrap --enable-checking=release
--with-arch=x86-64 --with-tune=generic
--enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared
--enable-static --enable-libatomic --enable-threads=po
six --enable-graphite --enable-fully-dynamic-string
--enable-libstdcxx-filesystem-ts --enable-libstdcxx-time
--disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-multilib
--disable-rpath --disable-win32-registry --disa
ble-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib
--with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64
--with-pkgversion='Rev6, Built by MSYS2 project' --with-bugurl=https://git
hub.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld
--disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++
--with-stage1-ldflags=-static-libstdc++
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (Rev6, Built by MSYS2 project)


I compiled the original source with the following commands:

$ g++ -DCATCH_CONFIG_COLOUR_ANSI -D_WIN32_WINNT=0x0602
-ID:/dev/mingw-winrt/cppwinrt/test
-ID:/dev/mingw-winrt/cppwinrt/test/../cppwinrt
-IC:/msys64/home/Alvin/cppwinrt_rel/test/cppwinrt -O2 -g -DNDEBUG
-fno-omit-frame-pointer -fdiagnostics-color=always -mcx16 -O1
-finline-functions -finline-small-functions -findirect-inlining
-fno-devirtualize -std=gnu++20 -MD -MT
test/test/CMakeFiles/test-out_params_bad.dir/out_params_bad.cpp.obj -MF
'test\test\CMakeFiles\test-out_params_bad.dir\out_params_bad.cpp.obj.d'
D:/dev/mingw-winrt/cppwinrt/test/test/out_params_bad.cpp -g0 -S -o ../good.s
-fverbose-asm -save-temps

$ g++ -DCATCH_CONFIG_COLOUR_ANSI -D_WIN32_WINNT=0x0602
-ID:/dev/mingw-winrt/cppwinrt/test
-ID:/dev/mingw-winrt/cppwinrt/test/../cppwinrt
-IC:/msys64/home/Alvin/cppwinrt_rel/test/cppwinrt -O2 -g -DNDEBUG
-fno-omit-frame-pointer -fdiagnostics-color=always -mcx16 -O1
-finline-functions -finline-small-functions -findirect-inlining
-fno-devirtualize -std=gnu++20 -MD -MT
test/test/CMakeFiles/test-out_params_bad.dir/out_params_bad.cpp.obj -MF
'test\test\CMakeFiles\test-out_params_bad.dir\out_params_bad.cpp.obj.d'
D:/dev/mingw-winrt/cppwinrt/test/test/out_params_bad.cpp -g0 -S -o ../bad.s
-fdevirtualize -fverbose-asm -save-temps


I then compared `good.s` and `bad.s` and checked inside the function `static
void C_A_T_C_H_T_E_S_T_0()` (_ZL19C_A_T_C_H_T_E_S_T_0v). At around
`D:/dev/mingw-winrt/cppwinrt/test/test/out_params_bad.cpp:211`, `bad.s` is
missing a large chunk of the function (all the way to the function epilogue)
compared to `good.s`.

The only difference is that `bad.s` is compiled with `-fdevirtualize`.

Attached the preprocessed source with gzip compression.

Reply via email to