diff options
author | Richard Biener <rguenther@suse.de> | 2020-11-02 11:09:56 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-11-02 12:34:00 +0100 |
commit | 4c198ddff83744f8b7bf24306ed1e6b889c44044 (patch) | |
tree | fa6e8f77816996af9e9159083fec5e1f09d465c4 /gcc/tree-vect-loop.c | |
parent | f3a3327fe3d4e20a8fe863c2a3ad949864191f5d (diff) | |
download | gcc-4c198ddff83744f8b7bf24306ed1e6b889c44044.zip gcc-4c198ddff83744f8b7bf24306ed1e6b889c44044.tar.gz gcc-4c198ddff83744f8b7bf24306ed1e6b889c44044.tar.bz2 |
tree-optimization/97558 - compute vectype for SLP nested cycles
This makes sure to compute the vector type for invariant SLP children
of nested cycles.
2020-11-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/97558
* tree-vect-loop.c (vectorizable_reduction): For nested SLP
cycles compute invariant operands vector type.
* gcc.dg/vect/pr97558-2.c: New testcase.
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 353703c..105ea61 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6336,9 +6336,28 @@ vectorizable_reduction (loop_vec_info loop_vinfo, if (STMT_VINFO_DEF_TYPE (stmt_info) == vect_nested_cycle) { if (is_a <gphi *> (stmt_info->stmt)) - /* Analysis for double-reduction is done on the outer - loop PHI, nested cycles have no further restrictions. */ - STMT_VINFO_TYPE (stmt_info) = cycle_phi_info_type; + { + if (slp_node) + { + /* We eventually need to set a vector type on invariant + arguments. */ + unsigned j; + slp_tree child; + FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (slp_node), j, child) + if (!vect_maybe_update_slp_op_vectype + (child, SLP_TREE_VECTYPE (slp_node))) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "incompatible vector types for " + "invariants\n"); + return false; + } + } + /* Analysis for double-reduction is done on the outer + loop PHI, nested cycles have no further restrictions. */ + STMT_VINFO_TYPE (stmt_info) = cycle_phi_info_type; + } else STMT_VINFO_TYPE (stmt_info) = reduc_vec_info_type; return true; |