diff options
author | Yufeng Zhang <yufeng.zhang@arm.com> | 2014-01-07 16:18:04 +0000 |
---|---|---|
committer | Yufeng Zhang <yufeng@gcc.gnu.org> | 2014-01-07 16:18:04 +0000 |
commit | 5d72b79faa6924198b321b860244b7e228025a66 (patch) | |
tree | dea23c1fa6a88632d40e007856454870302f9824 /gcc | |
parent | 48d534390f43b216715d3d1b4c39c998b1d0bced (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64-1.c | 25 |
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); +} |