[Bug tree-optimization/39698] wrong types for vectorized reduction
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Thu Apr 16 10:34:00 GMT 2009
------- Comment #3 from rguenther at suse dot de 2009-04-16 10:34 -------
Subject: Re: wrong types for vectorized
reduction
On Thu, 16 Apr 2009, irar at il dot ibm dot com wrote:
> ------- Comment #2 from irar at il dot ibm dot com 2009-04-16 10:26 -------
> This patch fixes the type in pr34591.c (the vector type should be the type of
> the reduction variable because we are looking for its initial value, and not
> the type of the reduction statement, i.e., its RHS type):
>
> Index: tree-vect-loop.c
> ===================================================================
> --- tree-vect-loop.c (revision 145457)
> +++ tree-vect-loop.c (working copy)
> @@ -2267,33 +2267,33 @@ get_initial_def_for_reduction (gimple st
> stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
> loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo);
> struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
> - tree vectype = STMT_VINFO_VECTYPE (stmt_vinfo);
> - int nunits = TYPE_VECTOR_SUBPARTS (vectype);
> - tree scalar_type = TREE_TYPE (vectype);
> + tree scalar_type = TREE_TYPE (init_val);
> + tree vectype = get_vectype_for_scalar_type (scalar_type);
> + int nunits;
> enum tree_code code = gimple_assign_rhs_code (stmt);
> - tree type = TREE_TYPE (init_val);
> - tree vecdef;
> tree def_for_init;
> tree init_def;
> tree t = NULL_TREE;
> int i;
> bool nested_in_vect_loop = false;
>
> - gcc_assert (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type) ||
> SCALAR_FLOAT_TYPE_P (type));
> + gcc_assert (vectype);
> + nunits = TYPE_VECTOR_SUBPARTS (vectype);
> +
> + gcc_assert (POINTER_TYPE_P (scalar_type) || INTEGRAL_TYPE_P (scalar_type)
> + || SCALAR_FLOAT_TYPE_P (scalar_type));
> if (nested_in_vect_loop_p (loop, stmt))
> nested_in_vect_loop = true;
> else
> gcc_assert (loop == (gimple_bb (stmt))->loop_father);
>
> - vecdef = vect_get_vec_def_for_operand (init_val, stmt, NULL);
> -
> switch (code)
> case WIDEN_SUM_EXPR:
> case DOT_PROD_EXPR:
> case PLUS_EXPR:
> if (nested_in_vect_loop)
> - *adjustment_def = vecdef;
> + *adjustment_def = vect_get_vec_def_for_operand (init_val, stmt, NULL);
> else
> *adjustment_def = init_val;
> /* Create a vector of zeros for init_def. */
> @@ -2310,7 +2310,7 @@ get_initial_def_for_reduction (gimple st
> case MIN_EXPR:
> case MAX_EXPR:
> *adjustment_def = NULL_TREE;
> - init_def = vecdef;
> + init_def = vect_get_vec_def_for_operand (init_val, stmt, NULL);
> break;
>
> default:
>
> (I also removed the creation of definition for the cases where it is not used).
>
> Tested on vectorizer testsuite.
Thanks! I'll put it to the next bootstrap/regtest with the type
checker enabled.
Richard.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39698
More information about the Gcc-bugs
mailing list