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

            Bug ID: 65624
           Summary: ICE in aarch64-builtins.c when expanding 4-argument
                    aarch64 intrinsic.
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: chefmax at gcc dot gnu.org
              Host: i686-linux-gnu
            Target: aarch64-linux-gnu
             Build: i686-pc-linux-gnu

Created attachment 35178
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=35178&action=edit
Reprocase.

When testing cross toolchain for AArch64 on 32 bit host (i686), I ran to the
such issue:

$
/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen/libexec/gcc/aarch64-tizen-linux-gnueabi/5.0.0/cc1
-quiet ref_vqdmlsl_lane.c -quiet -dumpbase ref_vqdmlsl_lane.c
-march=armv8-a+simd -mlittle-endian -mabi=lp64 -auxbase-strip
ref_vqdmlsl_lane.gccarm.o -g -Wall -Wno-unused-variable -Wno-unused-function
-Wno-error=unused-local-typedefs -fshort-wchar -freport-bug

// In file included from ref_vqdmlal_lane.c:27:0,
//                  from ref_vqdmlsl_lane.c:29:
//
/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen/lib/gcc/aarch64-tizen-linux-gnueabi/5.0.0/include/arm_neon.h:
In function 'exec_vqdmlsl_lane':
//
/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen/lib/gcc/aarch64-tizen-linux-gnueabi/5.0.0/include/arm_neon.h:19165:10:
internal compiler error: tree check: accessed operand 8 of call_expr with 7
operands in aarch64_simd_expand_args, at config/aarch64/aarch64-builtins.c:915
//    return __builtin_aarch64_sqdmlsl_lanev4hi (__a, __b, __c, __d);
//           ^
// 0x89b4948 tree_operand_check_failed(int, tree_node const*, char const*, int,
char const*)
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/tree.c:9507
// 0x8a3c9f9 tree_operand_check
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/tree.h:3346
// 0x8a3c9f9 aarch64_simd_expand_args
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/config/aarch64/aarch64-builtins.c:915
// 0x8a3c9f9 aarch64_simd_expand_builtin(int, tree_node*, rtx_def*)
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/config/aarch64/aarch64-builtins.c:1075
// 0x828256b expand_builtin(tree_node*, rtx_def*, rtx_def*, machine_mode, int)
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/builtins.c:5967
// 0x83a3bb0 expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/expr.c:10489
// 0x83b0ce6 store_expr_with_bounds(tree_node*, rtx_def*, int, bool,
tree_node*)
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/expr.c:5385
// 0x83b37c9 expand_assignment(tree_node*, tree_node*, bool)
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/expr.c:5154
// 0x82a9a6e expand_call_stmt
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/cfgexpand.c:2397
// 0x82a9a6e expand_gimple_stmt_1
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/cfgexpand.c:3343
// 0x82a9a6e expand_gimple_stmt
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/cfgexpand.c:3497
// 0x82aaf80 expand_gimple_basic_block
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/cfgexpand.c:5509
// 0x82ad761 execute
//
>----/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/gcc/cfgexpand.c:6127
// Please submit a full bug report,
// with preprocessed source if appropriate.
// Please include the complete backtrace with any bug report.
// See <http://gcc.gnu.org/bugs.html> for instructions.

Looking to the GCC source code (aarch64_simd_expand_builtin function), I've
noticed that all arguments and return value types are stored to
args[SIMD_MAX_BUILTIN_ARGS] array. In aarch64_simd_expand_builtin, we also
write special SIMD_ARG_STOP indicator to this array after all arguments. But if
we have 4-argument intrinsic with return value, we will overflow
args[SIMD_MAX_BUILTIN_ARGS] with SIMD_ARG_STOP since SIMD_MAX_BUILTIN_ARGS is
defined as 5. I'm attaching preprocessed reprocase and trivial fix.

max@max:~/build$ aarch64-tizen-linux-gnueabi-gcc -v
// Configured with:
/home/m.ostapenko/jazz64/vd49_a5x/toolchain/build/sources/gcc_1/configure
--build=i686-pc-linux-gnu --host=i686-pc-linux-gnu
--target=aarch64-tizen-linux-gnueabi
--prefix=/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen
--with-sysroot=/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen/aarch64-tizen-linux-gnueabi/sys-root
--disable-libmudflap --enable-libssp --disable-nls --disable-libstdcxx-pch
--disable-multilib --disable-gnu-unique-object --enable-linker-build-id
--with-arch=armv8-a --enable-libgomp --enable-poison-system-directories
--enable-long-long --enable-threads --enable-languages=c,c++,fortran
--enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit
--with-gnu-as --with-gnu-ld --with-host-libstdcxx='-static-libgcc
-Wl,-Bstatic,-lstdc++,-Bdynamic -lm'
--with-build-time-tools=/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen/bin
--with-gmp=/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen
--with-mpfr=/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen
--with-libelf=/home/m.ostapenko/jazz64/vd49_a5x/toolchain/aarch64-tizen
// Thread model: posix
// gcc version 5.0.0 20150325 (experimental) (VDLinux.v8a5x.GA1.2015-03-31)

Reply via email to