re PR tree-optimization/87974 (ICE in vect_get_vec_def_for_stmt_copy)
authorRichard Biener <rguenther@suse.de>
Wed, 14 Nov 2018 09:19:28 +0000 (09:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 14 Nov 2018 09:19:28 +0000 (09:19 +0000)
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.

* g++.dg/opt/pr87974.C: New testcase.

From-SVN: r266099

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr87974.C [new file with mode: 0644]
gcc/tree-vect-loop.c

index cbd89695b1d887a6b20f221839a4dbb51a9df37c..f1f2c4c957ac92d0aa1d63382d8315a603cd6c1f 100644 (file)
@@ -1,3 +1,10 @@
+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
index eb871d03d7c4cf60b4b1fe40f84e500ab5c5c8e2..767da5380f71ddea834bc5d40b009f8566eeebe4 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.dg/opt/pr87974.C b/gcc/testsuite/g++.dg/opt/pr87974.C
new file mode 100644 (file)
index 0000000..4b070d2
--- /dev/null
@@ -0,0 +1,33 @@
+// { 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;
+    }
+}
index dccddee1cf094cf6a3741fdaf7ea65afef957e2f..dac6bb87847487e63f873f09c49aa15bb9de4514 100644 (file)
@@ -6066,13 +6066,17 @@ vectorizable_reduction (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
        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)))