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.