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)

Reply via email to