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)