diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-11-28 12:57:58 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-11-28 12:57:58 +0000 |
commit | b7be5c848a3594d3b946cc11ff76aecfe6219b3b (patch) | |
tree | ea6f5ce290027021b11ff5a5664f751a6dbf76fa | |
parent | d62cde2138dd84b6245ca162471eac6ecb8d11db (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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr79351.c | 26 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 1 |
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) |