From 5d72b79faa6924198b321b860244b7e228025a66 Mon Sep 17 00:00:00 2001 From: Yufeng Zhang Date: Tue, 7 Jan 2014 16:18:04 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 +++++ gcc/config/arm/arm.c | 9 ++++++- gcc/testsuite/ChangeLog | 4 +++ .../gcc.target/arm/neon/vst1Q_laneu64-1.c | 25 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ba166cc31ce..c02060f904e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-01-07 Yufeng Zhang + + * 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 PR target/58115 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 142db45d7c5..c8bf7c1ecf3 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 1e30242aed6..519d4727036 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-01-07 Yufeng Zhang + + * gcc.target/arm/neon/vst1Q_laneu64-1.c: New test. + 2014-01-07 Richard Sandiford * 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 00000000000..5f4c927b6e0 --- /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); +}