Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk sofar.
Richard. 2018-11-28 Richard Biener <rguent...@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 <rguent...@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)) {