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)