[Committed] Fix PR85478

Message ID 20180424121950.18057-1-krebbel@linux.vnet.ibm.com
State New
Headers show
Series
  • [Committed] Fix PR85478
Related show

Commit Message

Andreas Krebbel April 24, 2018, 12:19 p.m.
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  <krebbel@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  <krebbel@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

-- 
2.9.1

Patch

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]);