https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113907
Bug ID: 113907 Summary: [14 regression] ICU miscompiled since on x86 since r14-5109-ga291237b628f41 Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: sjames at gcc dot gnu.org CC: amacleod at redhat dot com, arsen at gcc dot gnu.org Target Milestone: --- Originally reported downstream in Gentoo at https://bugs.gentoo.org/924153. ICU seems miscompiled on x86 (-m32) since r14-5109-ga291237b628f41. My C++ is ~non-existent so I can't reduce it. I appreciate this isn't a great level of detail. It crashes during the build when running a just-built executable: ``` i686-pc-linux-gnu-g++ -D_REENTRANT -DU_DEBUG=1 -DU_HAVE_ELF_H=1 -DU_HAVE_STRTOD_L=1 -DU_HAVE_XLOCALE_H=0 -DU_DISABLE_RENAMING=1 -I/var/tmp/portage/dev-libs/icu-74.2/work/icu/source/common -I/var/tmp/portage/dev-libs/icu-74.2/work/icu/source/tools/icupkg/../toolutil -DU_ATTRIBUTE_DEPRECATED= -O2 -march=i686 -pipe -pipe -frecord-gcc-switches -fno-diagnostics-color -fmessage-length=0 -std=c++14 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -c -o icupkg.o /var/tmp/portage/dev-libs/icu-74.2/work/icu/source/tools/icupkg/icupkg.cpp [..] i686-pc-linux-gnu-g++ -O2 -march=i686 -pipe -pipe -frecord-gcc-switches -fno-diagnostics-color -fmessage-length=0 -std=c++14 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -Wl,-O1 -Wl,--as-needed -Wl,--defsym=__gentoo_check_ldflags__=0 -o ../../bin/icupkg icupkg.o -L../../lib -licutu -L../../lib -licui18n -L../../lib -licuuc -L../../stubdata -licudata -lpthread -lm [...] Unpacking /var/tmp/portage/dev-libs/icu-74.2/work/icu/source/data/in/icudt74l.dat and generating out/tmp/icudata.lst (list of data files) LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH ../bin/icupkg -d ./out/build/icudt74l --list -x \* /var/tmp/portage/dev-libs/icu-74.2/work/icu/source/data/in/icudt74l.dat -o out/tmp/icudata.lst make[1]: *** [Makefile:272: out/tmp/icudata.lst] Segmentation fault make[1]: *** Waiting for unfinished jobs.... make[2]: Leaving directory '/var/tmp/portage/dev-libs/icu-74.2/work/icu/source-abi_x86_32.x86/data' make[1]: Leaving directory '/var/tmp/portage/dev-libs/icu-74.2/work/icu/source-abi_x86_32.x86/data' make: *** [Makefile:153: all-recursive] Error 2 * ERROR: dev-libs/icu-74.2::gentoo failed (compile phase): * emake failed ``` Valgrind says: ``` ==26485== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. ==26485== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info ==26485== Command: ../bin/icupkg -d ./out/build/icudt74l --list -x * /var/tmp/portage/dev-libs/icu-74.1/work/icu/source/data/in/icudt74l.dat -o out/tmp/icudata.lst ==26485== ==26485== Invalid write of size 1 ==26485== at 0x52A0110: memcpy (string_fortified.h:29) ==26485== by 0x52A0110: uprv_copyArray64 (udataswp.cpp:172) ==26485== by 0x52A0110: uprv_copyArray16(UDataSwapper const*, void const*, int, void*, UErrorCode*) (udataswp.cpp:160) ==26485== by 0x52A0630: udata_swapDataHeader (udataswp.cpp:342) ==26485== by 0x48694F1: icu::Package::readPackage(char const*) (package.cpp:483) ==26485== by 0x10987F: main (icupkg.cpp:335) ==26485== Address 0x54f2458 is 0 bytes after a block of size 201,216 alloc'd ==26485== at 0x4842E4D: operator new(unsigned int) (vg_replace_malloc.c:476) ==26485== by 0x10936B: main (icupkg.cpp:285) ``` Manual reproduction steps: ``` ./configure CC="gcc -m32" CXX="g++ -m32" CFLAGS="-O2 -ggdb3 -march=i686" CXXFLAGS="-O2 -ggdb3 -march=i686" --disable-renaming --disable-layoutex --disable-samples make -j$(nproc) ``` There's some suspicious code there wrt reinterpret_cast but -fno-strict-aliasing doesn't help. It's fine with -O1, but not -O2.