+2018-11-14 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/87974
+ * tree-vect-loop.c (vectorizable_reduction): When computing
+ the vectorized reduction PHI vector type ignore constant
+ and external defs.
+
2018-11-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/87977
+2018-11-14 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/87974
+ * g++.dg/opt/pr87974.C: New testcase.
+
2018-11-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/87977
--- /dev/null
+// { dg-do compile { target c++11 } }
+// { dg-options "-O3" }
+
+struct h {
+ typedef int &c;
+};
+class i {
+ struct j {
+ using c = int *;
+ };
+ using as = j::c;
+};
+template <typename> class k {
+public:
+ using as = i::as;
+ h::c operator[](long l) {
+ k<int[]>::as d = 0;
+ return d[l];
+ }
+};
+class : public k<int[]> { } a;
+long c, f;
+void m()
+{
+ for (long b; b <= 6; b++)
+ for (long g; g < b; g++) {
+ unsigned long e = g;
+ c = 0;
+ for (; c < b; c++)
+ f = e >>= 1;
+ a[g] = f;
+ }
+}
return true;
gassign *reduc_stmt = as_a <gassign *> (reduc_stmt_info->stmt);
+ code = gimple_assign_rhs_code (reduc_stmt);
for (unsigned k = 1; k < gimple_num_ops (reduc_stmt); ++k)
{
tree op = gimple_op (reduc_stmt, k);
if (op == phi_result)
continue;
- if (k == 1
- && gimple_assign_rhs_code (reduc_stmt) == COND_EXPR)
+ if (k == 1 && code == COND_EXPR)
+ continue;
+ bool is_simple_use = vect_is_simple_use (op, loop_vinfo, &dt);
+ gcc_assert (is_simple_use);
+ if (dt == vect_constant_def || dt == vect_external_def)
continue;
if (!vectype_in
|| (GET_MODE_SIZE (SCALAR_TYPE_MODE (TREE_TYPE (vectype_in)))