diff options
author | Richard Biener <rguenther@suse.de> | 2018-06-06 13:03:29 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-06-06 13:03:29 +0000 |
commit | 1abc0f7f52c01e5fd1a8149eab1b5f4ad4e92fa5 (patch) | |
tree | 58c12e9abe514f02b058641bd4b7b4823d151ded | |
parent | d71488c017b4ebb932cf2b4a43656e1eda670b23 (diff) | |
download | gcc-1abc0f7f52c01e5fd1a8149eab1b5f4ad4e92fa5.tar.gz |
re PR tree-optimization/86062 (Missed redundancy elimination with struct and array)
2018-06-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/86062
* tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary
component refs ontop
of to be offsetted base.
* g++.dg/tree-ssa/pr86062.C: New testcase.
From-SVN: r261231
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr86062.C | 23 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 16 |
4 files changed, 44 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85515d98f98..18280e8a041 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-06-06 Richard Biener <rguenther@suse.de> + + PR tree-optimization/86062 + * tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary + component refs ontop + of to be offsetted base. + 2018-06-06 Jozef Lawrynowicz <jozef.l@mittosystems.com> * gcc/config/msp430/msp430.c (msp430_attr): Allow interrupt handlers diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 22ed1e03f22..095cae3f972 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-06-06 Richard Biener <rguenther@suse.de> + + PR tree-optimization/86062 + * g++.dg/tree-ssa/pr86062.C: New testcase. + 2018-06-05 Steve Ellcey <sellcey@cavium.com> PR target/79924 diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr86062.C b/gcc/testsuite/g++.dg/tree-ssa/pr86062.C new file mode 100644 index 00000000000..d62bdf6d2f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr86062.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-require-effective-target c++14 } +// { dg-options "-O2 -ffinite-math-only -fdump-tree-fre1" } + +#include <array> + +struct I { double i,s; I(double d):i(d),s(d){} }; +typedef std::array<double,3> P; +typedef std::array<I,3> AP; + +static AP c(P const&p){ + return {p[0],p[1],p[2]}; +} +template<class T> auto const& ac(T const&p, int n){return p[n];} +static double g(P const&p, int n) +{ + I res = ac(c(p),n); + return res.s-res.i; +} + +__attribute__((flatten)) double fff(P p){ return g(p,1); } + +// { dg-final { scan-tree-dump "return 0.0;" "fre1" } } diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 4e946ba7baf..4aec41e96c1 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -2270,14 +2270,16 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_, /* Apply an extra offset to the inner MEM_REF of the RHS. */ if (maybe_ne (extra_off, 0)) { - if (rhs.length () < 2 - || rhs[0].opcode != MEM_REF - || known_eq (rhs[0].off, -1)) + if (rhs.length () < 2) return (void *)-1; - rhs[0].off += extra_off; - rhs[0].op0 = int_const_binop (PLUS_EXPR, rhs[0].op0, - build_int_cst (TREE_TYPE (rhs[0].op0), - extra_off)); + int ix = rhs.length () - 2; + if (rhs[ix].opcode != MEM_REF + || known_eq (rhs[ix].off, -1)) + return (void *)-1; + rhs[ix].off += extra_off; + rhs[ix].op0 = int_const_binop (PLUS_EXPR, rhs[ix].op0, + build_int_cst (TREE_TYPE (rhs[ix].op0), + extra_off)); } /* We need to pre-pend vr->operands[0..i] to rhs. */ |