aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@marvell.com>2020-02-08 15:57:54 +0000
committerAndrew Pinski <apinski@marvell.com>2020-02-08 15:48:06 -0800
commitc2a4bf2d6edde8b148421668a4c07c844b994271 (patch)
tree6b67937e3ef6af840977f62d1005ed88b53bd37e /gcc
parent4b39d801b2698d0f756231f6f8fa0be5a36f0c05 (diff)
downloadgcc-c2a4bf2d6edde8b148421668a4c07c844b994271.zip
gcc-c2a4bf2d6edde8b148421668a4c07c844b994271.tar.gz
gcc-c2a4bf2d6edde8b148421668a4c07c844b994271.tar.bz2
aarch64: fix strict alignment for vector load/stores (PR 91927)
Hi, The problem here is that the vector mode version of movmisalign<mode> was only conditionalized on if SIMD was enabled instead of being also conditionalized on STRICT_ALIGNMENT too. Applied as pre-approved in the bug report by Richard Sandiford after a bootstrap/test on aarch64-linux-gnu. Thanks, Andrew Pinski ChangeLog: PR target/91927 * config/aarch64/aarch64-simd.md (movmisalign<mode>): Check STRICT_ALIGNMENT also. testsuite/ChangeLog: PR target/91927 * gcc.target/aarch64/pr91927.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/aarch64/aarch64-simd.md2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr91927.c38
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0ae8c54..b46ea4f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-08 Andrew Pinski <apinski@marvell.com>
+
+ PR target/91927
+ * config/aarch64/aarch64-simd.md (movmisalign<mode>): Check
+ STRICT_ALIGNMENT also.
+
2020-02-08 Jim Wilson <jimw@sifive.com>
PR target/93532
diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md
index c8e1012..4c651f4 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -41,7 +41,7 @@
(define_expand "movmisalign<mode>"
[(set (match_operand:VALL 0 "nonimmediate_operand")
(match_operand:VALL 1 "general_operand"))]
- "TARGET_SIMD"
+ "TARGET_SIMD && !STRICT_ALIGNMENT"
{
/* This pattern is not permitted to fail during expansion: if both arguments
are non-registers (e.g. memory := constant, which can be created by the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b9548b3..c47f3fb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-08 Andrew Pinski <apinski@marvel.com>
+
+ PR target/91927
+ * gcc.target/aarch64/pr91927.c: New testcase.
+
2020-02-08 Peter Bergner <bergner@linux.ibm.com>
PR target/93136
diff --git a/gcc/testsuite/gcc.target/aarch64/pr91927.c b/gcc/testsuite/gcc.target/aarch64/pr91927.c
new file mode 100644
index 0000000..f5cde1a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr91927.c
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-mstrict-align -O3" } */
+
+#define NULL 0
+
+typedef unsigned uint32_t;
+typedef struct __attribute__((__packed__))
+{
+ uint32_t nTagID;
+ uint32_t nValueBufferSize;
+ uint32_t nValueLength;
+
+} PropertyTags_t;
+
+typedef struct
+{
+ char *szName;
+ uint32_t nBufferSize;
+ uint32_t nLength;
+
+} Something_t;
+
+void SetTag(PropertyTags_t *pTag, uint32_t nBufferSize, uint32_t nLength);
+
+void TestCase(Something_t *pSome, uint32_t nBufferSize, uint32_t nLength)
+{
+ if (pSome != NULL)
+ {
+ PropertyTags_t sTag = { 0 };
+
+ SetTag(&sTag, nBufferSize, nLength);
+
+ pSome->nBufferSize = sTag.nValueBufferSize;
+ pSome->nLength = sTag.nValueLength;
+ }
+}
+
+/* { dg-final { scan-assembler-not "ldr\td" } } */