aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorYufeng Zhang <yufeng.zhang@arm.com>2014-01-07 16:18:04 +0000
committerYufeng Zhang <yufeng@gcc.gnu.org>2014-01-07 16:18:04 +0000
commit5d72b79faa6924198b321b860244b7e228025a66 (patch)
treedea23c1fa6a88632d40e007856454870302f9824 /gcc
parent48d534390f43b216715d3d1b4c39c998b1d0bced (diff)
downloadgcc-5d72b79faa6924198b321b860244b7e228025a66.zip
gcc-5d72b79faa6924198b321b860244b7e228025a66.tar.gz
gcc-5d72b79faa6924198b321b860244b7e228025a66.tar.bz2
arm.c (arm_expand_neon_args): Call expand_expr with EXPAND_MEMORY for NEON_ARG_MEMORY...
gcc/ * config/arm/arm.c (arm_expand_neon_args): Call expand_expr with EXPAND_MEMORY for NEON_ARG_MEMORY; check if the returned rtx is const0_rtx or not. gcc/testsuite/ * gcc.target/arm/neon/vst1Q_laneu64-1.c: New test. From-SVN: r206395
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c9
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64-1.c25
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ba166cc..c02060f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-07 Yufeng Zhang <yufeng.zhang@arm.com>
+
+ * config/arm/arm.c (arm_expand_neon_args): Call expand_expr
+ with EXPAND_MEMORY for NEON_ARG_MEMORY; check if the returned
+ rtx is const0_rtx or not.
+
2014-01-07 Richard Sandiford <rdsandiford@googlemail.com>
PR target/58115
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 142db45..c8bf7c1 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -24841,7 +24841,11 @@ arm_expand_neon_args (rtx target, int icode, int have_retval,
type_mode);
}
- op[argc] = expand_normal (arg[argc]);
+ /* Use EXPAND_MEMORY for NEON_ARG_MEMORY to ensure a MEM_P
+ be returned. */
+ op[argc] = expand_expr (arg[argc], NULL_RTX, VOIDmode,
+ (thisarg == NEON_ARG_MEMORY
+ ? EXPAND_MEMORY : EXPAND_NORMAL));
switch (thisarg)
{
@@ -24860,6 +24864,9 @@ arm_expand_neon_args (rtx target, int icode, int have_retval,
break;
case NEON_ARG_MEMORY:
+ /* Check if expand failed. */
+ if (op[argc] == const0_rtx)
+ return 0;
gcc_assert (MEM_P (op[argc]));
PUT_MODE (op[argc], mode[argc]);
/* ??? arm_neon.h uses the same built-in functions for signed
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1e30242..519d472 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-07 Yufeng Zhang <yufeng.zhang@arm.com>
+
+ * gcc.target/arm/neon/vst1Q_laneu64-1.c: New test.
+
2014-01-07 Richard Sandiford <rdsandiford@googlemail.com>
* gcc.target/i386/intrinsics_4.c (bar): New function.
diff --git a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64-1.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64-1.c
new file mode 100644
index 0000000..5f4c927
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64-1.c
@@ -0,0 +1,25 @@
+/* Test the `vst1Q_laneu64' ARM Neon intrinsic. */
+
+/* Detect ICE in the case of unaligned memory address. */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
+
+unsigned char dummy_store[1000];
+
+void
+foo (char* addr)
+{
+ uint8x16_t vdata = vld1q_u8 (addr);
+ vst1q_lane_u64 ((uint64_t*) &dummy_store, vreinterpretq_u64_u8 (vdata), 0);
+}
+
+uint64_t
+bar (uint64x2_t vdata)
+{
+ vdata = vld1q_lane_u64 ((uint64_t*) &dummy_store, vdata, 0);
+ return vgetq_lane_u64 (vdata, 0);
+}