diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-11-10 15:43:13 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-11-10 15:43:13 +0100 |
commit | 127ef36981ebdfbe3be0f8df710090642a2a4abe (patch) | |
tree | c68a1dc595dca3d5343f87ec39f6fc2f1e5794a3 /gcc/testsuite | |
parent | 93814e2d690f7ccae4d87365b66d05cfa4a11576 (diff) | |
download | gcc-127ef36981ebdfbe3be0f8df710090642a2a4abe.zip gcc-127ef36981ebdfbe3be0f8df710090642a2a4abe.tar.gz gcc-127ef36981ebdfbe3be0f8df710090642a2a4abe.tar.bz2 |
re PR tree-optimization/82929 (r254579 causes ICE: tree check: expected ssa_name, have array_ref in has_single_use, at ssa-iterators.h:400)
PR tree-optimization/82929
* gimple-ssa-store-merging.c (struct store_immediate_info): Add
ops_swapped_p non-static data member.
(store_immediate_info::store_immediate_info): Clear it.
(imm_store_chain_info::coalesce_immediate_stores): If swapping
ops set ops_swapped_p.
(count_multiple_uses): Handle ops_swapped_p.
* gcc.dg/pr82929.c: New test.
* g++.dg/opt/pr82929.C: New test.
From-SVN: r254628
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr82929.C | 30 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr82929.c | 18 |
3 files changed, 54 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc6799a..72dea0a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-11-10 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/82929 + * gcc.dg/pr82929.c: New test. + * g++.dg/opt/pr82929.C: New test. + 2017-11-10 Christophe Lyon <christophe.lyon@linaro.org> * lib/target-supports.exp (check_effective_target_arm_soft_ok): diff --git a/gcc/testsuite/g++.dg/opt/pr82929.C b/gcc/testsuite/g++.dg/opt/pr82929.C new file mode 100644 index 0000000..572f491 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr82929.C @@ -0,0 +1,30 @@ +// PR tree-optimization/82929 +// { dg-do compile } +// { dg-options "-O2" } + +template <int _Nw> struct A { + long _M_w[_Nw]; + void m_fn1(A p1) { + for (int a = 0;; a++) + _M_w[a] &= p1._M_w[a]; + } + void m_fn2() { + for (int b = 0; b < _Nw; b++) + _M_w[b] = ~_M_w[b]; + } +}; +template <int _Nb> struct C : A<_Nb / (8 * 8)> { + void operator&=(C p1) { this->m_fn1(p1); } + C m_fn3() { + this->m_fn2(); + return *this; + } + C operator~() { return C(*this).m_fn3(); } +}; +struct B { + C<192> Value; +}; +void fn1(C<192> &p1) { + B c; + p1 &= ~c.Value; +} diff --git a/gcc/testsuite/gcc.dg/pr82929.c b/gcc/testsuite/gcc.dg/pr82929.c new file mode 100644 index 0000000..afe9394 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr82929.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/82929 */ +/* { dg-do compile { target store_merge } } */ +/* { dg-options "-O2 -fdump-tree-store-merging" } */ + +void +foo (short *p, short *q, short *r) +{ + short a = q[0]; + short b = q[1]; + short c = ~a; + short d = r[0]; + short e = r[1]; + short f = ~b; + p[0] = c & d; + p[1] = e & f; +} + +/* { dg-final { scan-tree-dump-times "Merging successful" 1 "store-merging" } } */ |