Fix code order in tree-sra.c:create_access
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 8 Nov 2019 11:58:45 +0000 (11:58 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 8 Nov 2019 11:58:45 +0000 (11:58 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/sve/acle/general/inline_2.c [new file with mode: 0644]
gcc/tree-sra.c

index c6c7daa2987c0553f9a55c70bdb1a694f95b1653..519896dcaae68c69daf17d4a02ee3dda6d0c94bf 100644 (file)
@@ -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
index 9ab6b0de4dc4acf40f730d7f3b680b292a26db46..06ec4028518ebe75a67aab47d00f936201adff77 100644 (file)
@@ -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 (file)
index 0000000..04f0b7c
--- /dev/null
@@ -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);
+}
index 44862690559c72efc004f525fade851302931a4a..8bcfef42e35c9fef79975a537ab8860dc0ea83cd 100644 (file)
@@ -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;