diff options
author | Richard Biener <rguenther@suse.de> | 2023-02-28 15:34:27 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-05-09 12:29:45 +0200 |
commit | d4cbcb9e45c6d45cdbc15583e1a418c13150d8c7 (patch) | |
tree | 629eb918f40039a27203840366558e3e9e8b1ea3 | |
parent | 0697a1a426424468b9bdf3d845237cab26ce78d7 (diff) | |
download | gcc-d4cbcb9e45c6d45cdbc15583e1a418c13150d8c7.tar.gz |
tree-optimization/108950 - widen-sum reduction ICE
When we end up with a widen-sum with an invariant smaller operand
the reduction code uses a wrong vector type for it, causing
IL checking ICEs. The following fixes that and the inefficiency
of using a widen-sum with a widenend invariant operand as well
by actually performing the check the following comment wants.
PR tree-optimization/108950
* tree-vect-patterns.c (vect_recog_widen_sum_pattern):
Check oprnd0 is defined in the loop.
* tree-vect-loop.c (vectorizable_reduction): Record all
operands vector types, compute that of invariants and
properly update their SLP nodes.
* gcc.dg/vect/pr108950.c: New testcase.
(cherry picked from commit e3837b6f6c28a1d2cea3a69efbda795ea3fb8816)
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr108950.c | 13 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 19 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.c | 4 |
3 files changed, 28 insertions, 8 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr108950.c b/gcc/testsuite/gcc.dg/vect/pr108950.c new file mode 100644 index 00000000000..2163866dfa7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr108950.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ + +int m; +short int n; + +__attribute__ ((simd)) int +foo (void) +{ + m += n; + m += n; +} + +/* { dg-final { scan-tree-dump-not "widen_sum" "vect" } } */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index ebdba65c55e..2f2346a366e 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6483,6 +6483,7 @@ vectorizable_reduction (loop_vec_info loop_vinfo, { tree scalar_dest; tree vectype_in = NULL_TREE; + tree vectype_op[3] = { NULL_TREE, NULL_TREE, NULL_TREE }; class loop *loop = LOOP_VINFO_LOOP (loop_vinfo); enum vect_def_type cond_reduc_dt = vect_unknown_def_type; stmt_vec_info cond_stmt_vinfo = NULL; @@ -6493,7 +6494,6 @@ vectorizable_reduction (loop_vec_info loop_vinfo, bool nested_cycle = false; bool double_reduc = false; int vec_num; - tree tem; tree cr_index_scalar_type = NULL_TREE, cr_index_vector_type = NULL_TREE; tree cond_reduc_val = NULL_TREE; @@ -6740,8 +6740,8 @@ vectorizable_reduction (loop_vec_info loop_vinfo, enum vect_def_type dt; tree op; if (!vect_is_simple_use (loop_vinfo, stmt_info, slp_for_stmt_info, - i + opno_adjust, &op, &slp_op[i], &dt, &tem, - &def_stmt_info)) + i + opno_adjust, &op, &slp_op[i], &dt, + &vectype_op[i], &def_stmt_info)) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, @@ -6756,15 +6756,20 @@ vectorizable_reduction (loop_vec_info loop_vinfo, if (VECTORIZABLE_CYCLE_DEF (dt)) return false; + if (!vectype_op[i]) + vectype_op[i] + = get_vectype_for_scalar_type (loop_vinfo, + TREE_TYPE (op), slp_op[i]); + /* To properly compute ncopies we are interested in the widest non-reduction input type in case we're looking at a widening accumulation that we later handle in vect_transform_reduction. */ if (lane_reduc_code_p - && tem + && vectype_op[i] && (!vectype_in || (GET_MODE_SIZE (SCALAR_TYPE_MODE (TREE_TYPE (vectype_in))) - < GET_MODE_SIZE (SCALAR_TYPE_MODE (TREE_TYPE (tem)))))) - vectype_in = tem; + < GET_MODE_SIZE (SCALAR_TYPE_MODE (TREE_TYPE (vectype_op[i])))))) + vectype_in = vectype_op[i]; if (code == COND_EXPR) { @@ -7287,7 +7292,7 @@ vectorizable_reduction (loop_vec_info loop_vinfo, && code != SAD_EXPR && reduction_type != FOLD_LEFT_REDUCTION)) for (i = 0; i < op_type; i++) - if (!vect_maybe_update_slp_op_vectype (slp_op[i], vectype_in)) + if (!vect_maybe_update_slp_op_vectype (slp_op[i], vectype_op[i])) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 09282dabc5c..01bcea9dca2 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -1537,7 +1537,9 @@ vect_recog_widen_sum_pattern (vec_info *vinfo, of the above pattern. */ if (!vect_reassociating_reduction_p (vinfo, stmt_vinfo, PLUS_EXPR, - &oprnd0, &oprnd1)) + &oprnd0, &oprnd1) + || TREE_CODE (oprnd0) != SSA_NAME + || !vinfo->lookup_def (oprnd0)) return NULL; type = gimple_expr_type (last_stmt); |