sra: Do not create zero sized accesses (PR 93776)
authorMartin Jambor <mjambor@suse.cz>
Wed, 19 Feb 2020 10:13:52 +0000 (11:13 +0100)
committerMartin Jambor <mjambor@suse.cz>
Wed, 19 Feb 2020 10:15:30 +0000 (11:15 +0100)
SRA can get a bit confused with zero-sized accesses like the one in
the testcase.  Since there is nothing in the access, nothing is
scalarized, but we can get order of the structures wrong, which the
verifier is not happy about.

Fixed by simply ignoring such accesses.

2020-02-19  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/93776
* tree-sra.c (create_access): Do not create zero size accesses.
(get_access_for_expr): Do not search for zero sized accesses.

testsuite/
* gcc.dg/tree-ssa/pr93776.c: New test.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr93776.c [new file with mode: 0644]
gcc/tree-sra.c

index 6b53f9a2f07e4b999ab4971f6fd1868df06133f4..7ebeaed89e04ab91af4ed5ad607c9046250656c1 100644 (file)
@@ -1,3 +1,9 @@
+2020-02-19  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/93776
+       * tree-sra.c (create_access): Do not create zero size accesses.
+       (get_access_for_expr): Do not search for zero sized accesses.
+
 2020-02-19  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/93667
index 8033fa0a3bb009789d57da1e66f3a7da38b9c9e1..df79951b6cc2aaad90268df0e1a1b553dceb03f6 100644 (file)
@@ -1,3 +1,8 @@
+2020-02-19  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/93776
+       * gcc.dg/tree-ssa/pr93776.c: New test.
+
 2020-02-19  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/93667
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c
new file mode 100644 (file)
index 0000000..c407a62
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+struct empty {};
+struct s { int i; };
+struct z
+{
+  int j;
+  struct empty e;
+  struct s s;
+  int k;
+};
+
+void bar (struct z);
+void baz (int);
+
+void foo (void)
+{
+  struct z z, z2;
+
+  z.k = 8;
+  z2.s.i = 1;
+  z = z2;
+  bar (z);
+  z.e = (struct empty) {};
+  baz (z.k);
+}
index 4c7d651e6b9040ad1d28d987b181bf59801f95cb..49f9001f7fb9bd63a4c8be40aaf0f29206bd86e9 100644 (file)
@@ -926,6 +926,8 @@ create_access (tree expr, gimple *stmt, bool write)
       size = max_size;
       unscalarizable_region = true;
     }
+  if (size == 0)
+    return NULL;
   if (size < 0)
     {
       disqualify_candidate (base, "Encountered an unconstrained access.");
@@ -3643,7 +3645,8 @@ get_access_for_expr (tree expr)
        return NULL;
     }
 
-  if (!bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
+  if (max_size == 0
+      || !bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
     return NULL;
 
   return get_var_base_offset_size_access (base, offset, max_size);