Richard Biener <rguent...@suse.de> writes:
> When querying a single set of vector defs with the overloaded
> vect_get_vec_defs API then when you try to use the overload with
> the vector type specified the call will be ambiguous with the
> variant without the vector type.  The following fixes this by
> re-ordering the vector type argument to come before the output
> def vector argument.
>
> I've changed vectorizable_conversion as that triggered this
> so it has coverage showing this works.  The motivation is to
> reduce the number of (redundant) get_vectype_for_scalar_type
> calls.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
>
> OK for trunk or shall I defer to stage1?

LGTM.  Think it's probably worth having now, in case we need it for
other fixes.

Thanks,
Richard

>
> Thanks,
> Richard.
>
>       * tree-vectorizer.h (vect_get_vec_defs): Re-order arguments.
>       * tree-vect-stmts.cc (vect_get_vec_defs): Likewise.
>       (vectorizable_condition): Update caller.
>       (vectorizable_comparison_1): Likewise.
>       (vectorizable_conversion): Specify the vector type to be
>       used for invariant/external defs.
>       * tree-vect-loop.cc (vect_transform_reduction): Update caller.
> ---
>  gcc/tree-vect-loop.cc  |  6 +++---
>  gcc/tree-vect-stmts.cc | 42 +++++++++++++++++++++---------------------
>  gcc/tree-vectorizer.h  |  8 ++++----
>  3 files changed, 28 insertions(+), 28 deletions(-)
>
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index 3df020d2228..dd584ab4a42 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -8504,11 +8504,11 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
>        gcc_assert (single_defuse_cycle
>                 && (reduc_index == 1 || reduc_index == 2));
>        vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, ncopies,
> -                      op.ops[0], &vec_oprnds0, truth_type_for (vectype_in),
> +                      op.ops[0], truth_type_for (vectype_in), &vec_oprnds0,
>                        reduc_index == 1 ? NULL_TREE : op.ops[1],
> -                      &vec_oprnds1, NULL_TREE,
> +                      NULL_TREE, &vec_oprnds1,
>                        reduc_index == 2 ? NULL_TREE : op.ops[2],
> -                      &vec_oprnds2, NULL_TREE);
> +                      NULL_TREE, &vec_oprnds2);
>      }
>  
>    /* For single def-use cycles get one copy of the vectorized reduction
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index bf8c99779ae..067abac3917 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -1267,10 +1267,10 @@ vect_get_vec_defs_for_operand (vec_info *vinfo, 
> stmt_vec_info stmt_vinfo,
>  void
>  vect_get_vec_defs (vec_info *vinfo, stmt_vec_info stmt_info, slp_tree 
> slp_node,
>                  unsigned ncopies,
> -                tree op0, vec<tree> *vec_oprnds0, tree vectype0,
> -                tree op1, vec<tree> *vec_oprnds1, tree vectype1,
> -                tree op2, vec<tree> *vec_oprnds2, tree vectype2,
> -                tree op3, vec<tree> *vec_oprnds3, tree vectype3)
> +                tree op0, tree vectype0, vec<tree> *vec_oprnds0,
> +                tree op1, tree vectype1, vec<tree> *vec_oprnds1,
> +                tree op2, tree vectype2, vec<tree> *vec_oprnds2,
> +                tree op3, tree vectype3, vec<tree> *vec_oprnds3)
>  {
>    if (slp_node)
>      {
> @@ -1309,10 +1309,10 @@ vect_get_vec_defs (vec_info *vinfo, stmt_vec_info 
> stmt_info, slp_tree slp_node,
>                  tree op3, vec<tree> *vec_oprnds3)
>  {
>    vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies,
> -                  op0, vec_oprnds0, NULL_TREE,
> -                  op1, vec_oprnds1, NULL_TREE,
> -                  op2, vec_oprnds2, NULL_TREE,
> -                  op3, vec_oprnds3, NULL_TREE);
> +                  op0, NULL_TREE, vec_oprnds0,
> +                  op1, NULL_TREE, vec_oprnds1,
> +                  op2, NULL_TREE, vec_oprnds2,
> +                  op3, NULL_TREE, vec_oprnds3);
>  }
>  
>  /* Helper function called by vect_finish_replace_stmt and
> @@ -5657,7 +5657,7 @@ vectorizable_conversion (vec_info *vinfo,
>      {
>      case NONE:
>        vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies,
> -                      op0, &vec_oprnds0);
> +                      op0, vectype_in, &vec_oprnds0);
>        /* vec_dest is intermediate type operand when multi_step_cvt.  */
>        if (multi_step_cvt)
>       {
> @@ -5696,9 +5696,9 @@ vectorizable_conversion (vec_info *vinfo,
>        generate more than one vector stmt - i.e - we need to "unroll"
>        the vector stmt by a factor VF/nunits.  */
>        vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies * ninputs,
> -                      op0, &vec_oprnds0,
> +                      op0, vectype_in, &vec_oprnds0,
>                        code == WIDEN_LSHIFT_EXPR ? NULL_TREE : op1,
> -                      &vec_oprnds1);
> +                      vectype_in, &vec_oprnds1);
>        if (code == WIDEN_LSHIFT_EXPR)
>       {
>         int oprnds_size = vec_oprnds0.length ();
> @@ -5753,7 +5753,7 @@ vectorizable_conversion (vec_info *vinfo,
>        generate more than one vector stmt - i.e - we need to "unroll"
>        the vector stmt by a factor VF/nunits.  */
>        vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies * ninputs,
> -                      op0, &vec_oprnds0);
> +                      op0, vectype_in, &vec_oprnds0);
>        /* Arguments are ready.  Create the new vector stmts.  */
>        if (cvt_type && modifier == NARROW_DST)
>       FOR_EACH_VEC_ELT (vec_oprnds0, i, vop0)
> @@ -12248,17 +12248,17 @@ vectorizable_condition (vec_info *vinfo,
>    /* Handle cond expr.  */
>    if (masked)
>      vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies,
> -                    cond_expr, &vec_oprnds0, comp_vectype,
> -                    then_clause, &vec_oprnds2, vectype,
> +                    cond_expr, comp_vectype, &vec_oprnds0,
> +                    then_clause, vectype, &vec_oprnds2,
>                      reduction_type != EXTRACT_LAST_REDUCTION
> -                    ? else_clause : NULL, &vec_oprnds3, vectype);
> +                    ? else_clause : NULL, vectype, &vec_oprnds3);
>    else
>      vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies,
> -                    cond_expr0, &vec_oprnds0, comp_vectype,
> -                    cond_expr1, &vec_oprnds1, comp_vectype,
> -                    then_clause, &vec_oprnds2, vectype,
> +                    cond_expr0, comp_vectype, &vec_oprnds0,
> +                    cond_expr1, comp_vectype, &vec_oprnds1,
> +                    then_clause, vectype, &vec_oprnds2,
>                      reduction_type != EXTRACT_LAST_REDUCTION
> -                    ? else_clause : NULL, &vec_oprnds3, vectype);
> +                    ? else_clause : NULL, vectype, &vec_oprnds3);
>  
>    /* Arguments are ready.  Create the new vector stmt.  */
>    FOR_EACH_VEC_ELT (vec_oprnds0, i, vec_cond_lhs)
> @@ -12621,8 +12621,8 @@ vectorizable_comparison_1 (vec_info *vinfo, tree 
> vectype,
>    mask = vect_create_destination_var (lhs, mask_type);
>  
>    vect_get_vec_defs (vinfo, stmt_info, slp_node, ncopies,
> -                  rhs1, &vec_oprnds0, vectype,
> -                  rhs2, &vec_oprnds1, vectype);
> +                  rhs1, vectype, &vec_oprnds0,
> +                  rhs2, vectype, &vec_oprnds1);
>    if (swap_p)
>      std::swap (vec_oprnds0, vec_oprnds1);
>  
> diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
> index e4d7ab4567c..1810833a324 100644
> --- a/gcc/tree-vectorizer.h
> +++ b/gcc/tree-vectorizer.h
> @@ -2263,10 +2263,10 @@ void vect_get_vec_defs (vec_info *, stmt_vec_info, 
> slp_tree, unsigned,
>                       tree = NULL, vec<tree> * = NULL,
>                       tree = NULL, vec<tree> * = NULL);
>  void vect_get_vec_defs (vec_info *, stmt_vec_info, slp_tree, unsigned,
> -                     tree, vec<tree> *, tree,
> -                     tree = NULL, vec<tree> * = NULL, tree = NULL,
> -                     tree = NULL, vec<tree> * = NULL, tree = NULL,
> -                     tree = NULL, vec<tree> * = NULL, tree = NULL);
> +                     tree, tree, vec<tree> *,
> +                     tree = NULL, tree = NULL, vec<tree> * = NULL,
> +                     tree = NULL, tree = NULL, vec<tree> * = NULL,
> +                     tree = NULL, tree = NULL, vec<tree> * = NULL);
>  extern tree vect_init_vector (vec_info *, stmt_vec_info, tree, tree,
>                                gimple_stmt_iterator *);
>  extern tree vect_get_slp_vect_def (slp_tree, unsigned);

Reply via email to