diff options
author | Richard Biener <rguenther@suse.de> | 2018-11-14 09:19:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-11-14 09:19:28 +0000 |
commit | f711908bf61e39432965db84ed12424cc6f251e1 (patch) | |
tree | 7e348a03b38fec7de949eb377b67eee3e0502318 /gcc | |
parent | c4071191f4d20d25389181b90c0a24f254a47b87 (diff) | |
download | gcc-f711908bf61e39432965db84ed12424cc6f251e1.zip gcc-f711908bf61e39432965db84ed12424cc6f251e1.tar.gz gcc-f711908bf61e39432965db84ed12424cc6f251e1.tar.bz2 |
re PR tree-optimization/87974 (ICE in vect_get_vec_def_for_stmt_copy)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr87974.C | 33 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 8 |
4 files changed, 51 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cbd8969..f1f2c4c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eb871d0..767da53 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..4b070d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr87974.C @@ -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; + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index dccddee..dac6bb8 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -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))) |