aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-11-08 11:58:45 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-11-08 11:58:45 +0000
commit93ace3af2c44fa019f5141243be198fb2233c7f8 (patch)
tree30b41e500b3c8d0bda47f2bd6a66bb0c8dd9ec78 /gcc
parentb602712b3ea2a0729a2eda61bd9ee795aba6138f (diff)
downloadgcc-93ace3af2c44fa019f5141243be198fb2233c7f8.zip
gcc-93ace3af2c44fa019f5141243be198fb2233c7f8.tar.gz
gcc-93ace3af2c44fa019f5141243be198fb2233c7f8.tar.bz2
Fix code order in tree-sra.c:create_access
If get_ref_base_and_extent returns poly_int offsets or sizes, tree-sra.c:create_access prevents SRA from being applied to the base. However, we haven't verified by that point that we have a valid base to disqualify. This originally led to an ICE on the attached testcase, but it no longer triggers there after the introduction of IPA SRA. 2019-11-08 Richard Sandiford <richard.sandiford@arm.com> gcc/ * tree-sra.c (create_access): Delay disqualifying the base for poly_int values until we know we have a base. gcc/testsuite/ * gcc.target/aarch64/sve/acle/general/inline_2.c: New test. From-SVN: r277965
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/acle/general/inline_2.c16
-rw-r--r--gcc/tree-sra.c17
4 files changed, 34 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c6c7daa..519896d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * tree-sra.c (create_access): Delay disqualifying the base
+ for poly_int values until we know we have a base.
+
2019-11-08 Andre Vieira <andre.simoesdiasvieira@arm.com>
* tree-vect-loop.c (vect_analyze_loop): Disable epilogue vectorization
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9ab6b0d..06ec402 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * gcc.target/aarch64/sve/acle/general/inline_2.c: New test.
+
2019-11-08 Jakub Jelinek <jakub@redhat.com>
PR target/92038
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/inline_2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/inline_2.c
new file mode 100644
index 0000000..04f0b7c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/inline_2.c
@@ -0,0 +1,16 @@
+/* { dg-options "-O2" } */
+
+typedef struct s { double d[4]; } TYPE;
+
+static inline void
+copy (TYPE *dst, TYPE *src)
+{
+ __SVFloat64_t tmp = *(__SVFloat64_t *) src;
+ *dst = *(TYPE *) &tmp;
+}
+
+void
+foo (TYPE *a)
+{
+ copy (a, a + 1);
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 4486269..8bcfef4 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -789,19 +789,11 @@ create_access (tree expr, gimple *stmt, bool write)
{
struct access *access;
poly_int64 poffset, psize, pmax_size;
- HOST_WIDE_INT offset, size, max_size;
tree base = expr;
bool reverse, unscalarizable_region = false;
base = get_ref_base_and_extent (expr, &poffset, &psize, &pmax_size,
&reverse);
- if (!poffset.is_constant (&offset)
- || !psize.is_constant (&size)
- || !pmax_size.is_constant (&max_size))
- {
- disqualify_candidate (base, "Encountered a polynomial-sized access.");
- return NULL;
- }
/* For constant-pool entries, check we can substitute the constant value. */
if (constant_decl_p (base))
@@ -824,6 +816,15 @@ create_access (tree expr, gimple *stmt, bool write)
if (!DECL_P (base) || !bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
return NULL;
+ HOST_WIDE_INT offset, size, max_size;
+ if (!poffset.is_constant (&offset)
+ || !psize.is_constant (&size)
+ || !pmax_size.is_constant (&max_size))
+ {
+ disqualify_candidate (base, "Encountered a polynomial-sized access.");
+ return NULL;
+ }
+
if (size != max_size)
{
size = max_size;