Bootstrapped and regression tested on x86_64, ppc64, and s390x. Pre-approved by Richard in the PR.
-Andreas- gcc/ChangeLog: 2018-04-24 Andreas Krebbel <kreb...@linux.ibm.com> PR tree-optimization/85478 * tree-vect-loop.c (vect_analyze_loop_2): Do not call vect_grouped_store_supported for single element vectors. gcc/testsuite/ChangeLog: 2018-04-24 Andreas Krebbel <kreb...@linux.ibm.com> PR tree-optimization/85478 * g++.dg/pr85478.C: New test. --- gcc/testsuite/g++.dg/pr85478.C | 46 ++++++++++++++++++++++++++++++++++++++++++ gcc/tree-vect-loop.c | 5 +++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/pr85478.C diff --git a/gcc/testsuite/g++.dg/pr85478.C b/gcc/testsuite/g++.dg/pr85478.C new file mode 100644 index 0000000..4eb4f24 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr85478.C @@ -0,0 +1,46 @@ +/* { dg-do compile { target { s390*-*-* } } } */ +/* { dg-options "-O3 -march=arch12 -std=c++11 -Wno-return-type" } */ + +struct a { + enum { b }; +}; +struct c { + template <typename d, typename e> static void f(d g, e h) { + d i; + for (; i != g; ++h, ++i) + *h = *i; + } +}; +template <int, typename d, typename e> void j(d g, e h) { c::f(g, h); } +template <int k, typename d, typename e> void l(d g, e h) { j<k>(g, h); } +template <typename d, typename e> void aa(d g, e h) { l<a::b>(g, h); } +template <typename> class ab; +template <> struct ab<float> { + _Complex m() { return n; } + _Complex n; +}; +template <> struct ab<long double> { + ab(ab<float> g) : n(g.m()) {} + _Complex long double n; +}; +template <int ac, typename o> class p { +public: + template <typename q> p &operator=(const p<ac, q> &); + o *ad; +}; +template <typename o> class r : public p<2, o> {}; +template <int ac, typename o> +template <typename q> +p<ac, o> &p<ac, o>::operator=(const p<ac, q> &g) { + aa(&g.ad[0], &ad[0]); +} +template <typename ae> class s : public r<ae> { + template <typename t> s &operator=(const s<t> &); +}; +template <typename ae> +template <typename t> +s<ae> &s<ae>::operator=(const s<t> &g) { + p<2, ae>::operator=(g); +} +template s<ab<long double>> &s<ab<long double>>:: +operator=(const s<ab<float>> &); diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 7b3009a..4ce721ed 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -2492,8 +2492,9 @@ again: unsigned int size = STMT_VINFO_GROUP_SIZE (vinfo); tree vectype = STMT_VINFO_VECTYPE (vinfo); if (! vect_store_lanes_supported (vectype, size, false) - && ! vect_grouped_store_supported (vectype, size)) - return false; + && ! known_eq (TYPE_VECTOR_SUBPARTS (vectype), 1U) + && ! vect_grouped_store_supported (vectype, size)) + return false; FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (instance), j, node) { vinfo = vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (node)[0]); -- 2.9.1