aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2018-11-28 12:57:58 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2018-11-28 12:57:58 +0000
commitb7be5c848a3594d3b946cc11ff76aecfe6219b3b (patch)
treeea6f5ce290027021b11ff5a5664f751a6dbf76fa
parentd62cde2138dd84b6245ca162471eac6ecb8d11db (diff)
2018-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/79351 * tree-ssa-sccvn.c (vn_reference_lookup_3): For assignments from empty CONSTRUCTORs ensure the store is at a constant position. * gcc.dg/torture/pr79351.c: New testcase. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@266556 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr79351.c26
-rw-r--r--gcc/tree-ssa-sccvn.c1
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2c82d0793f9..b199ff46537 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-11-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/79351
+ * tree-ssa-sccvn.c (vn_reference_lookup_3): For assignments from
+ empty CONSTRUCTORs ensure the store is at a constant position.
+
2018-11-26 Iain Sandoe <iain@sandoe.co.uk>
Backport from mainline
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0bc4908d668..fef05c79299 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/79351
+ * gcc.dg/torture/pr79351.c: New testcase.
+
2018-11-26 Andreas Krebbel <krebbel@linux.ibm.com>
Backport from mainline
diff --git a/gcc/testsuite/gcc.dg/torture/pr79351.c b/gcc/testsuite/gcc.dg/torture/pr79351.c
new file mode 100644
index 00000000000..d5d0271c376
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr79351.c
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+
+static struct state {
+ int k;
+ int dummy;
+} states[256];
+
+__attribute((noinline))
+static void
+ismatch(int n)
+{
+ for (int j=0; j<n; j++) {
+ states[j] = (struct state){0};
+ for (int i = 0; i <= j; i++) {
+ states[i].k++;
+ }
+ }
+}
+
+int
+main()
+{
+ ismatch(2);
+ if (states[0].k != 2)
+ __builtin_abort();
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 00bb229b4a2..8e7052f950e 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1936,6 +1936,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt),
&offset2, &size2, &maxsize2, &reverse);
if (maxsize2 != -1
+ && maxsize2 == size2
&& operand_equal_p (base, base2, 0)
&& offset2 <= offset
&& offset2 + size2 >= offset + maxsize)