https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61665

            Bug ID: 61665
           Summary: aarch64: instruction ordering problem when using
                    vector register for integer math
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: janne-gcc at jannau dot net

Created attachment 33041
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33041&action=edit
preprocessed source

One of libavcodec's tests segfaults on aarch64 using gcc 4.9.0. The attached
file is a reduced test case which still triggers the same error. Following part
of the source is problematic:

    for (p = 0; p < 3; p++) {
        int stride = ctx->frame->linesize[p];
       uint8_t *dst = ctx->frame->data[p] + (y_off >> !!p) * stride;
       for (y = 0; y < slice_h >> !!p; y += 8) {

which compiles with to following disassembly (program order not disturbed by
branches):

  60:   6b1f005f        cmp     w2, wzr
  64:   1a9f07e3        cset    w3, ne
  68:   1e270061        fmov    s1, w3
...
  80:   7ee0b821        neg     d1, d1
  88:   0ea14606        sshl    v6.2s, v16.2s, v1.2s
...
  8c:   7ee0b821        neg     d1, d1
...
  94:   0ea144e2        sshl    v2.2s, v7.2s, v1.2s

The second neg sets d1 to 1 and the variable sshl becomes an left shift instead
of the intended right shift. v2.s[0] is used to compute dst. An out of bound
write to dst causes the segfault.

If I change the order of second neg and second sshl the pointer is computed
correctly. The test passes with this modification to generated assembly.
The instructions have to be exchanged since v1 is used later and produces wrong
results with d1 == -1.

gcc-linaro-4.9-2014.06-1 still produces the same error.

Command to reproduce:
aarch64-unknown-linux-gnu-gcc-4.9.0 -v -save-temps -o fic -O2 fic.c
Using built-in specs.
COLLECT_GCC=aarch64-unknown-linux-gnu-gcc-4.9.0
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/lto-wrapper
Target: aarch64-unknown-linux-gnu
Configured with:
/var/tmp/portage/cross-aarch64-unknown-linux-gnu/gcc-4.9.0/work/gcc-4.9.0/configure
--host=x86_64-pc-linux-gnu --target=aarch64-unknown-linux-gnu
--build=x86_64-pc-linux-gnu --prefix=/usr
--bindir=/usr/x86_64-pc-linux-gnu/aarch64-unknown-linux-gnu/gcc-bin/4.9.0
--includedir=/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/include
--datadir=/usr/share/gcc-data/aarch64-unknown-linux-gnu/4.9.0
--mandir=/usr/share/gcc-data/aarch64-unknown-linux-gnu/4.9.0/man
--infodir=/usr/share/gcc-data/aarch64-unknown-linux-gnu/4.9.0/info
--with-gxx-include-dir=/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/include/g++-v4
--with-python-dir=/share/gcc-data/aarch64-unknown-linux-gnu/4.9.0/python
--enable-languages=c,c++,fortran
--enable-obsolete --enable-secureplt --disable-werror --with-system-zlib
--enable-nls --without-included-gettext --enable-checking=release
--with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.9.0 p1.0,
pie-0.6.0' --enable-libstdcxx-time --enable-poison-system-directories
--with-sysroot=/usr/aarch64-unknown-linux-gnu --disable-bootstrap
--enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --disable-altivec
--disable-fixed-point --disable-libgcj --enable-libgomp --disable-libmudflap
--disable-libssp --enable-lto --without-cloog
Thread model: posix
gcc version 4.9.0 (Gentoo 4.9.0 p1.0, pie-0.6.0)
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'fic' '-O2' '-mlittle-endian'
'-mabi=lp64'
 /usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/cc1 -E -quiet -v fic.c
-mlittle-endian -mabi=lp64 -O2
-fpch-preprocess -o fic.i
ignoring nonexistent directory
"/usr/aarch64-unknown-linux-gnu/usr/local/include"
ignoring nonexistent directory
"/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/../../../../aarch64-unknown-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/include
 /usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/include-fixed
 /usr/aarch64-unknown-linux-gnu/usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'fic' '-O2' '-mlittle-endian'
'-mabi=lp64'
 /usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/cc1 -fpreprocessed fic.i
-quiet -dumpbase fic.c -mlittle-endian -mabi=lp64 -auxbase fic -O2 -version -o
fic.s
GNU C (Gentoo 4.9.0 p1.0, pie-0.6.0) version 4.9.0 (aarch64-unknown-linux-gnu)
        compiled by GNU C version 4.8.2, GMP version 6.0.0, MPFR version
3.1.2-p5, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C (Gentoo 4.9.0 p1.0, pie-0.6.0) version 4.9.0 (aarch64-unknown-linux-gnu)
        compiled by GNU C version 4.8.2, GMP version 6.0.0, MPFR version
3.1.2-p5, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: ff503548fba5e138f4634ff6c9a09b93
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'fic' '-O2' '-mlittle-endian'
'-mabi=lp64'
 /usr/libexec/gcc/aarch64-unknown-linux-gnu/as -v -EL -mabi=lp64 -o fic.o fic.s
GNU assembler version 2.24 (aarch64-unknown-linux-gnu) using BFD version (GNU
Binutils) 2.24
COMPILER_PATH=/usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/:/usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/:/usr/libexec/gcc/aarch64-unknown-linux-gnu/:/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/:/usr/lib/gcc/aarch64-unknown-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/:/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/../../../../aarch64-unknown-linux-gnu/lib/:/usr/aarch64-unknown-linux-gnu/lib/:/usr/aarch64-unknown-linux-gnu/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'fic' '-O2' '-mlittle-endian'
'-mabi=lp64'
 /usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/collect2 -plugin
/usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/liblto_plugin.so
-plugin-opt=/usr/libexec/gcc/aarch64-unknown-linux-gnu/4.9.0/lto-wrapper
-plugin-opt=-fresolution=fic.res -plugin-opt=-pass-through=-lgcc
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s
--sysroot=/usr/aarch64-unknown-linux-gnu --eh-frame-hdr -dynamic-linker
/lib/ld-linux-aarch64.so.1 -X -EL -maarch64linux -o fic
/usr/aarch64-unknown-linux-gnu/usr/lib/crt1.o
/usr/aarch64-unknown-linux-gnu/usr/lib/crti.o
/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/crtbegin.o
-L/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0
-L/usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/../../../../aarch64-unknown-linux-gnu/lib
-L/usr/aarch64-unknown-linux-gnu/lib -L/usr/aarch64-unknown-linux-gnu/usr/lib
fic.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s
--no-as-needed /usr/lib/gcc/aarch64-unknown-linux-gnu/4.9.0/crtend.o
/usr/aarch64-unknown-linux-gnu/usr/lib/crtn.o

Reply via email to