summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-02-28 15:34:27 +0100
committerRichard Biener <rguenther@suse.de>2023-05-09 12:29:45 +0200
commitd4cbcb9e45c6d45cdbc15583e1a418c13150d8c7 (patch)
tree629eb918f40039a27203840366558e3e9e8b1ea3
parent0697a1a426424468b9bdf3d845237cab26ce78d7 (diff)
downloadgcc-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.c13
-rw-r--r--gcc/tree-vect-loop.c19
-rw-r--r--gcc/tree-vect-patterns.c4
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);