diff mbox

[AArch64] Fix PR 65624 (ICE in aarch64-linux-gnueabi crosscompiler on i686 host).

Message ID 551BCBA9.4020806@partner.samsung.com
State New
Headers show

Commit Message

max April 1, 2015, 10:42 a.m. UTC
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

Comments

Alan Lawrence April 1, 2015, 11:02 a.m. UTC | #1
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
> 
>
diff mbox

Patch

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);
+}