Message ID | 551BCBA9.4020806@partner.samsung.com |
---|---|
State | New |
Headers | show |
Looks good to me. Indeed, I'd support this being an "obvious" fix.... --Alan Maxim Ostapenko wrote: > Hi, > > expanding AArch64 AdvSIMD builtins, aarch64_simd_expand_builtin puts > return type and arguments types in args[SIMD_MAX_BUILTIN_ARGS] array and > indicates the last argument with SIMD_ARG_STOP. When expanding > 4-argument builtin with return value, aarch64_simd_expand_builtin stores > SIMD_ARG_STOP to args[5], that overflows args since > SIMD_MAX_BUILTIN_ARGS == 5. This causes ICE for aarch64 cross-compiler > on i686 host: > > $ > /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*) > > This trivial patch fixes the issue. > > No regressions found for aarch64-linux-gnueabi (on x86_64 and i686 > hosts), ok to commit? > > -Maxim > >
gcc/ChangeLog: 2015-04-01 Max Ostapenko <m.ostapenko@partner.samsung.com> PR target/65624 * config/aarch64/aarch64-builtins.c (aarch64_simd_expand_builtin): Increase args array size by one to avoid buffer overflow. gcc/testsuite/ChangeLog: 2015-04-01 Max Ostapenko <m.ostapenko@partner.samsung.com> PR target/65624 * gcc.target/aarch64/pr65624.c: New test. diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index a9b3305..8a9fff8 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -1025,7 +1025,7 @@ aarch64_simd_expand_builtin (int fcode, tree exp, rtx target) aarch64_simd_builtin_datum *d = &aarch64_simd_builtin_data[fcode - AARCH64_SIMD_PATTERN_START]; enum insn_code icode = d->code; - builtin_simd_arg args[SIMD_MAX_BUILTIN_ARGS]; + builtin_simd_arg args[SIMD_MAX_BUILTIN_ARGS + 1]; int num_args = insn_data[d->code].n_operands; int is_void = 0; int k; diff --git a/gcc/testsuite/gcc.target/aarch64/pr65624.c b/gcc/testsuite/gcc.target/aarch64/pr65624.c new file mode 100644 index 0000000..8eb3786 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr65624.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +#include <arm_neon.h> + +int32x4_t +foo (void) +{ + int32x4_t vector_int32x4; + int16x4_t vector3_int16x4; + int16x4_t vector4_int16x4; + static int32_t buffer_int32x4[32]; + + vector_int32x4 = vld1q_s32(buffer_int32x4); + return vqdmlsl_lane_s16(vector_int32x4, vector3_int16x4, vector4_int16x4, 0); +}