This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR79351
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 28 Nov 2018 11:59:52 +0100 (CET)
- Subject: [PATCH] Fix PR79351
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk
sofar.
Richard.
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.
>From 0a4b9efaf7a01d8f39a0e8d1537a55be5b51cd98 Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Wed, 28 Nov 2018 10:41:04 +0100
Subject: [PATCH] fix-pr79351
diff --git a/gcc/testsuite/gcc.dg/torture/pr79351.c b/gcc/testsuite/gcc.dg/torture/pr79351.c
new file mode 100644
index 00000000000..0e145eb7e3b
--- /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((noipa))
+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 56aa56041af..b97c320a8c3 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -2119,6 +2119,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 (known_size_p (maxsize2)
+ && known_eq (maxsize2, size2)
&& operand_equal_p (base, base2, 0)
&& known_subrange_p (offset, maxsize, offset2, size2))
{