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