------- 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