aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2020-02-19 11:13:52 +0100
committerMartin Jambor <mjambor@suse.cz>2020-02-19 11:15:30 +0100
commit51faf07cef9293af544bfacc7d0b320ab90d7d60 (patch)
tree533e82edecf8fb0aaf3972966db494361c113dec
parent665c5bad168ab63629b29ed2ce08ed042c088dc2 (diff)
downloadgcc-51faf07cef9293af544bfacc7d0b320ab90d7d60.zip
gcc-51faf07cef9293af544bfacc7d0b320ab90d7d60.tar.gz
gcc-51faf07cef9293af544bfacc7d0b320ab90d7d60.tar.bz2
sra: Do not create zero sized accesses (PR 93776)
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.
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr93776.c27
-rw-r--r--gcc/tree-sra.c5
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6b53f9a..7ebeaed 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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
* tree-sra.c (scalarizable_type_p): Return false if record fields
do not follow wach other.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8033fa0..df79951 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* g++.dg/tree-ssa/pr93667.C: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c
new file mode 100644
index 0000000..c407a62
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c
@@ -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);
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 4c7d651..49f9001 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -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);