https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117811
Bug ID: 117811 Summary: [ARM NEON] bad code for conditional right shift Product: gcc Version: 13.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: benoit.pierre at gmail dot com Target Milestone: --- Created attachment 59724 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59724&action=edit minimal test case Minimal test case: void buggy_shift( long vec[4], int shift ) { long xx, xy, yx, yy; xx = vec[0]; xy = vec[1]; yx = vec[2]; yy = vec[3]; if ( shift > 0 ) { xx = xx >> shift; xy = xy >> shift; yx = yx >> shift; yy = yy >> shift; } vec[0] = xx; vec[1] = xy; vec[2] = yx; vec[3] = yy; } The generated asm code (arm-linux-gnueabihf-gcc -Wall -Wextra -O2 -mfpu=neon -S test.c -o -) ignores the shift argument: buggy_shift: cmp r1, #0 vld1.32 {q8}, [r0] ble .L2 vshl.i32 q8, q8, #0 .L2: vst1.32 {q8}, [r0] bx lr No issue if the shift is unconditional, for example: - if ( shift > 0 ) + /* if ( shift > 0 ) */ Resulting in: buggy_shift: vld1.32 {q9}, [r0] vdup.32 q8, r1 vneg.s32 q8, q8 vshl.s32 q8, q9, q8 vst1.32 {q8}, [r0] bx lr Reproducible on the following versions: - Ubuntu Noble GCC 13: arm-linux-gnueabihf-gcc-13 Using built-in specs. COLLECT_GCC=arm-linux-gnueabihf-gcc-13 COLLECT_LTO_WRAPPER=/usr/libexec/gcc-cross/arm-linux-gnueabihf/13/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.2.0-23ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --without-target-system-zlib --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a+fp --with-float=hard --with-mode=thumb --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --includedir=/usr/arm-linux-gnueabihf/include Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 13.2.0 (Ubuntu 13.2.0-23ubuntu4) - Ubuntu Noble GCC 14: arm-linux-gnueabihf-gcc-14 -v Using built-in specs. COLLECT_GCC=arm-linux-gnueabihf-gcc-14 COLLECT_LTO_WRAPPER=/usr/libexec/gcc-cross/arm-linux-gnueabihf/14/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../src/configure -v --with-pkgversion='Ubuntu 14.2.0-4ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-14/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-14 --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --without-target-system-zlib --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a+fp --with-float=hard --with-mode=thumb --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --includedir=/usr/arm-linux-gnueabihf/include --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 14.2.0 (Ubuntu 14.2.0-4ubuntu2~24.04) - Arch Linux GCC 14: arm-linux-gnueabihf-gcc -v Using built-in specs. COLLECT_GCC=arm-linux-gnueabihf-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/14.2.0/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../gcc-14.2.0/configure --target=arm-linux-gnueabihf --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --program-prefix=arm-linux-gnueabihf- --libdir=/usr/lib --libexecdir=/usr/lib --with-local-prefix=/usr/arm-linux-gnueabihf --with-sysroot=/usr/arm-linux-gnueabihf --with-build-sysroot=/usr/arm-linux-gnueabihf --with-native-system-header-dir=/include --with-as=/usr/bin/arm-linux-gnueabihf-as --with-ld=/usr/bin/arm-linux-gnueabihf-ld --with-linker-hash-style=gnu --with-system-zlib --with-arch=armv6 --with-float=hard --with-fpu=vfp --enable-languages=c,c++,lto,m2 --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-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-plugin --enable-shared --enable-threads=posix --enable-libquadmath --enable-libvtv --disable-nls --disable-install-libiberty --disable-libssp --disable-libstdcxx-pch --disable-multilib --disable-werror Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 14.2.0 (GCC)