From: Richard Biener <richard.guenther@gmail.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>, richard.sandiford@arm.com
Subject: Re: [9a/n] PR85694: Reorder vect_is_simple_use arguments
Date: Thu, 28 Jun 2018 09:55:00 -0000 [thread overview]
Message-ID: <CAFiYyc1MNExTmBa4THHG8Ngv_muSF9suV6wSuXrA07fjLekAcQ@mail.gmail.com> (raw)
In-Reply-To: <87y3f0bmp4.fsf_-_@arm.com>
On Wed, Jun 27, 2018 at 11:31 AM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> Richard Sandiford <richard.sandiford@arm.com> writes:
> > Richard Biener <richard.guenther@gmail.com> writes:
> >> On Mon, Jun 18, 2018 at 5:04 PM Richard Sandiford
> >> <richard.sandiford@arm.com> wrote:
> >>>
> >>> When following the definitions of SSA names, some recognisers
> >>> already cope with statements that have been replaced by patterns.
> >>> This patch makes that happen automatically for users of
> >>> type_conversion_p and vect_get_internal_def. It also adds
> >>> a vect_look_through_pattern helper that can be used directly.
> >>>
> >>> The reason for doing this is that the main patch for PR85694
> >>> makes over_widening handle more general cases. These over-widened
> >>> patterns can still be useful when matching later statements;
> >>> e.g. an overwidened MULT_EXPR could be the input to a DOT_PROD_EXPR.
> >>>
> >>> The patch doesn't do anything with the STMT_VINFO_IN_PATTERN_P checks
> >>> in vect_recog_over_widening_pattern or vect_recog_widen_shift_pattern
> >>> since later patches rewrite them anyway.
> >>>
> >>> Doing this fixed an XFAIL in vect-reduc-dot-u16b.c.
> >>>
> >>> Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
> >>
> >> Hmm. It seems to me that *def_stmt for vect_is_simple_use should
> >> eventually be the pattern def given the vectype overload takes the
> >> vectype from the pattern def already but oddly enough the
> >> DEF_TYPE is taken from the non-pattern stmt.
> >>
> >> I wonder which callers look at def_stmt at all (and how...)
> >>
> >> I guess swapping the def_stmt and dt arguments and adding yet another
> >> overload to remove all unused &def_stmt args might this easier to review...
> >>
> >> So - I'm suggesting to change vect_is_simple_use.
> >
> > OK, I'll try that. Might end up being its own mini-series. :-)
>
> Turned out to be simpler than feared. :-)
>
> This patch does the first bit: reorder the arguments to
> vect_is_simple_use so that def_stmt comes last and is optional.
> Many callers can then drop it, making it more obvious which of the
> remaining calls would be affected by the next patch.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
OK.
Richard.
> Richard
>
>
> 2018-06-27 Richard Sandiford <richard.sandiford@arm.com>
>
> gcc/
> * tree-vectorizer.h (vect_is_simple_use): Move the gimple ** to the
> end and default to null.
> * tree-vect-loop.c (vect_create_epilog_for_reduction)
> (vectorizable_reduction): Update calls accordingly, dropping the
> gimple ** argument if the passed-back statement isn't needed.
> * tree-vect-patterns.c (vect_get_internal_def, type_conversion_p)
> (vect_recog_rotate_pattern): Likewise.
> (vect_recog_mask_conversion_pattern): Likewise.
> * tree-vect-slp.c (vect_get_and_check_slp_defs): Likewise.
> (vect_mask_constant_operand_p): Likewise.
> * tree-vect-stmts.c (is_simple_and_all_uses_invariant, process_use):
> (vect_model_simple_cost, vect_get_vec_def_for_operand): Likewise.
> (get_group_load_store_type, get_load_store_type): Likewise.
> (vect_check_load_store_mask, vect_check_store_rhs): Likewise.
> (vectorizable_call, vectorizable_simd_clone_call): Likewise.
> (vectorizable_conversion, vectorizable_assignment): Likewise.
> (vectorizable_shift, vectorizable_operation): Likewise.
> (vectorizable_store, vect_is_simple_cond): Likewise.
> (vectorizable_condition, vectorizable_comparison): Likewise.
> (get_same_sized_vectype, vect_get_mask_type_for_stmt): Likewise.
> (vect_is_simple_use): Rename the def_stmt argument to def_stmt_out
> and move it to the end. Cope with null def_stmt_outs.
>
> Index: gcc/tree-vectorizer.h
> ===================================================================
> --- gcc/tree-vectorizer.h 2018-06-27 10:27:12.366628072 +0100
> +++ gcc/tree-vectorizer.h 2018-06-27 10:27:31.782458413 +0100
> @@ -1476,10 +1476,10 @@ extern tree get_vectype_for_scalar_type_
> extern tree get_mask_type_for_scalar_type (tree);
> extern tree get_same_sized_vectype (tree, tree);
> extern bool vect_get_loop_mask_type (loop_vec_info);
> -extern bool vect_is_simple_use (tree, vec_info *, gimple **,
> - enum vect_def_type *);
> -extern bool vect_is_simple_use (tree, vec_info *, gimple **,
> - enum vect_def_type *, tree *);
> +extern bool vect_is_simple_use (tree, vec_info *, enum vect_def_type *,
> + gimple ** = NULL);
> +extern bool vect_is_simple_use (tree, vec_info *, enum vect_def_type *,
> + tree *, gimple ** = NULL);
> extern bool supportable_widening_operation (enum tree_code, gimple *, tree,
> tree, enum tree_code *,
> enum tree_code *, int *,
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c 2018-06-27 10:27:09.038657152 +0100
> +++ gcc/tree-vect-loop.c 2018-06-27 10:27:31.782458413 +0100
> @@ -4567,7 +4567,6 @@ vect_create_epilog_for_reduction (vec<tr
> {
> /* Get at the scalar def before the loop, that defines the initial value
> of the reduction variable. */
> - gimple *def_stmt;
> initial_def = PHI_ARG_DEF_FROM_EDGE (reduc_def_stmt,
> loop_preheader_edge (loop));
> /* Optimize: if initial_def is for REDUC_MAX smaller than the base
> @@ -4582,7 +4581,7 @@ vect_create_epilog_for_reduction (vec<tr
> || (induc_code == MIN_EXPR
> && tree_int_cst_lt (induc_val, initial_def))))
> induc_val = initial_def;
> - vect_is_simple_use (initial_def, loop_vinfo, &def_stmt, &initial_def_dt);
> + vect_is_simple_use (initial_def, loop_vinfo, &initial_def_dt);
> vec_initial_def = get_initial_def_for_reduction (stmt, initial_def,
> &adjustment_def);
> vec_initial_defs.create (1);
> @@ -6391,7 +6390,7 @@ vectorizable_reduction (gimple *stmt, gi
> continue;
>
> is_simple_use = vect_is_simple_use (ops[i], loop_vinfo,
> - &def_stmt, &dts[i], &tem);
> + &dts[i], &tem, &def_stmt);
> dt = dts[i];
> gcc_assert (is_simple_use);
> if (dt == vect_reduction_def)
> @@ -6587,8 +6586,7 @@ vectorizable_reduction (gimple *stmt, gi
> = PHI_ARG_DEF_FROM_EDGE (def_stmt, loop_preheader_edge (loop));
>
> gcc_assert (cond_reduc_val != NULL_TREE);
> - vect_is_simple_use (cond_initial_val, loop_vinfo,
> - &def_stmt, &cond_initial_dt);
> + vect_is_simple_use (cond_initial_val, loop_vinfo, &cond_initial_dt);
> if (cond_initial_dt == vect_constant_def
> && types_compatible_p (TREE_TYPE (cond_initial_val),
> TREE_TYPE (cond_reduc_val)))
> Index: gcc/tree-vect-patterns.c
> ===================================================================
> --- gcc/tree-vect-patterns.c 2018-06-27 10:27:12.366628072 +0100
> +++ gcc/tree-vect-patterns.c 2018-06-27 10:27:31.782458413 +0100
> @@ -160,7 +160,7 @@ vect_get_internal_def (vec_info *vinfo,
> vect_def_type dt;
> gimple *def_stmt;
> if (TREE_CODE (op) != SSA_NAME
> - || !vect_is_simple_use (op, vinfo, &def_stmt, &dt)
> + || !vect_is_simple_use (op, vinfo, &dt, &def_stmt)
> || dt != vect_internal_def)
> return NULL;
>
> @@ -177,14 +177,13 @@ vect_get_internal_def (vec_info *vinfo,
> type_conversion_p (tree name, gimple *use_stmt, bool check_sign,
> tree *orig_type, gimple **def_stmt, bool *promotion)
> {
> - gimple *dummy_gimple;
> stmt_vec_info stmt_vinfo;
> tree type = TREE_TYPE (name);
> tree oprnd0;
> enum vect_def_type dt;
>
> stmt_vinfo = vinfo_for_stmt (use_stmt);
> - if (!vect_is_simple_use (name, stmt_vinfo->vinfo, def_stmt, &dt))
> + if (!vect_is_simple_use (name, stmt_vinfo->vinfo, &dt, def_stmt))
> return false;
>
> if (dt != vect_internal_def
> @@ -219,7 +218,7 @@ type_conversion_p (tree name, gimple *us
> else
> *promotion = false;
>
> - if (!vect_is_simple_use (oprnd0, stmt_vinfo->vinfo, &dummy_gimple, &dt))
> + if (!vect_is_simple_use (oprnd0, stmt_vinfo->vinfo, &dt))
> return false;
>
> return true;
> @@ -1795,7 +1794,7 @@ vect_recog_rotate_pattern (vec<gimple *>
> || !TYPE_UNSIGNED (type))
> return NULL;
>
> - if (!vect_is_simple_use (oprnd1, vinfo, &def_stmt, &dt))
> + if (!vect_is_simple_use (oprnd1, vinfo, &dt, &def_stmt))
> return NULL;
>
> if (dt != vect_internal_def
> @@ -3930,13 +3929,10 @@ vect_recog_mask_conversion_pattern (vec<
> && known_le (TYPE_VECTOR_SUBPARTS (vectype1),
> TYPE_VECTOR_SUBPARTS (vectype2)))
> {
> - gimple *dummy;
> enum vect_def_type dt;
> - if (vect_is_simple_use (TREE_OPERAND (rhs1, 0), stmt_vinfo->vinfo,
> - &dummy, &dt)
> + if (vect_is_simple_use (TREE_OPERAND (rhs1, 0), vinfo, &dt)
> && dt == vect_external_def
> - && vect_is_simple_use (TREE_OPERAND (rhs1, 1), stmt_vinfo->vinfo,
> - &dummy, &dt)
> + && vect_is_simple_use (TREE_OPERAND (rhs1, 1), vinfo, &dt)
> && (dt == vect_external_def
> || dt == vect_constant_def))
> {
> Index: gcc/tree-vect-slp.c
> ===================================================================
> --- gcc/tree-vect-slp.c 2018-06-27 10:27:10.106647819 +0100
> +++ gcc/tree-vect-slp.c 2018-06-27 10:27:31.782458413 +0100
> @@ -348,7 +348,7 @@ vect_get_and_check_slp_defs (vec_info *v
>
> oprnd_info = (*oprnds_info)[i];
>
> - if (!vect_is_simple_use (oprnd, vinfo, &def_stmt, &dt))
> + if (!vect_is_simple_use (oprnd, vinfo, &dt, &def_stmt))
> {
> if (dump_enabled_p ())
> {
> @@ -3105,7 +3105,6 @@ vect_mask_constant_operand_p (gimple *st
> stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
> enum tree_code code = gimple_expr_code (stmt);
> tree op, vectype;
> - gimple *def_stmt;
> enum vect_def_type dt;
>
> /* For comparison and COND_EXPR type is chosen depending
> @@ -3117,8 +3116,7 @@ vect_mask_constant_operand_p (gimple *st
> else
> op = gimple_assign_rhs2 (stmt);
>
> - if (!vect_is_simple_use (op, stmt_vinfo->vinfo, &def_stmt,
> - &dt, &vectype))
> + if (!vect_is_simple_use (op, stmt_vinfo->vinfo, &dt, &vectype))
> gcc_unreachable ();
>
> return !vectype || VECTOR_BOOLEAN_TYPE_P (vectype);
> @@ -3135,8 +3133,7 @@ vect_mask_constant_operand_p (gimple *st
> else
> op = TREE_OPERAND (cond, 0);
>
> - if (!vect_is_simple_use (op, stmt_vinfo->vinfo, &def_stmt,
> - &dt, &vectype))
> + if (!vect_is_simple_use (op, stmt_vinfo->vinfo, &dt, &vectype))
> gcc_unreachable ();
>
> return !vectype || VECTOR_BOOLEAN_TYPE_P (vectype);
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c 2018-06-27 10:27:09.042657117 +0100
> +++ gcc/tree-vect-stmts.c 2018-06-27 10:27:31.782458413 +0100
> @@ -260,7 +260,6 @@ vect_mark_relevant (vec<gimple *> *workl
> is_simple_and_all_uses_invariant (gimple *stmt, loop_vec_info loop_vinfo)
> {
> tree op;
> - gimple *def_stmt;
> ssa_op_iter iter;
>
> if (!is_gimple_assign (stmt))
> @@ -270,7 +269,7 @@ is_simple_and_all_uses_invariant (gimple
> {
> enum vect_def_type dt = vect_uninitialized_def;
>
> - if (!vect_is_simple_use (op, loop_vinfo, &def_stmt, &dt))
> + if (!vect_is_simple_use (op, loop_vinfo, &dt))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -472,7 +471,7 @@ process_use (gimple *stmt, tree use, loo
> if (!force && !exist_non_indexing_operands_for_use_p (use, stmt))
> return true;
>
> - if (!vect_is_simple_use (use, loop_vinfo, &def_stmt, &dt))
> + if (!vect_is_simple_use (use, loop_vinfo, &dt, &def_stmt))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -908,11 +907,10 @@ vect_model_simple_cost (stmt_vec_info st
> for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
> {
> tree op = gimple_op (stmt, i);
> - gimple *def_stmt;
> enum vect_def_type dt;
> if (!op || op == lhs)
> continue;
> - if (vect_is_simple_use (op, stmt_info->vinfo, &def_stmt, &dt)
> + if (vect_is_simple_use (op, stmt_info->vinfo, &dt)
> && (dt == vect_constant_def || dt == vect_external_def))
> prologue_cost += vect_prologue_cost_for_slp_op (node, stmt_info,
> i, dt, cost_vec);
> @@ -1567,7 +1565,7 @@ vect_get_vec_def_for_operand (tree op, g
> dump_printf (MSG_NOTE, "\n");
> }
>
> - is_simple_use = vect_is_simple_use (op, loop_vinfo, &def_stmt, &dt);
> + is_simple_use = vect_is_simple_use (op, loop_vinfo, &dt, &def_stmt);
> gcc_assert (is_simple_use);
> if (def_stmt && dump_enabled_p ())
> {
> @@ -2336,9 +2334,8 @@ get_group_load_store_type (gimple *stmt,
> while (next_stmt)
> {
> tree op = vect_get_store_rhs (next_stmt);
> - gimple *def_stmt;
> enum vect_def_type dt;
> - if (!vect_is_simple_use (op, vinfo, &def_stmt, &dt))
> + if (!vect_is_simple_use (op, vinfo, &dt))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -2436,10 +2433,9 @@ get_load_store_type (gimple *stmt, tree
> if (STMT_VINFO_GATHER_SCATTER_P (stmt_info))
> {
> *memory_access_type = VMAT_GATHER_SCATTER;
> - gimple *def_stmt;
> if (!vect_check_gather_scatter (stmt, loop_vinfo, gs_info))
> gcc_unreachable ();
> - else if (!vect_is_simple_use (gs_info->offset, vinfo, &def_stmt,
> + else if (!vect_is_simple_use (gs_info->offset, vinfo,
> &gs_info->offset_dt,
> &gs_info->offset_vectype))
> {
> @@ -2536,11 +2532,9 @@ vect_check_load_store_mask (gimple *stmt
> }
>
> stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> - gimple *def_stmt;
> enum vect_def_type mask_dt;
> tree mask_vectype;
> - if (!vect_is_simple_use (mask, stmt_info->vinfo, &def_stmt, &mask_dt,
> - &mask_vectype))
> + if (!vect_is_simple_use (mask, stmt_info->vinfo, &mask_dt, &mask_vectype))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -2601,11 +2595,9 @@ vect_check_store_rhs (gimple *stmt, tree
> }
>
> stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> - gimple *def_stmt;
> enum vect_def_type rhs_dt;
> tree rhs_vectype;
> - if (!vect_is_simple_use (rhs, stmt_info->vinfo, &def_stmt, &rhs_dt,
> - &rhs_vectype))
> + if (!vect_is_simple_use (rhs, stmt_info->vinfo, &rhs_dt, &rhs_vectype))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -3136,7 +3128,6 @@ vectorizable_call (gimple *gs, gimple_st
> bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
> vec_info *vinfo = stmt_info->vinfo;
> tree fndecl, new_temp, rhs_type;
> - gimple *def_stmt;
> enum vect_def_type dt[3]
> = {vect_unknown_def_type, vect_unknown_def_type, vect_unknown_def_type};
> int ndts = 3;
> @@ -3210,7 +3201,7 @@ vectorizable_call (gimple *gs, gimple_st
> if (!rhs_type)
> rhs_type = TREE_TYPE (op);
>
> - if (!vect_is_simple_use (op, vinfo, &def_stmt, &dt[i], &opvectype))
> + if (!vect_is_simple_use (op, vinfo, &dt[i], &opvectype))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -3731,7 +3722,6 @@ vectorizable_simd_clone_call (gimple *st
> vec_info *vinfo = stmt_info->vinfo;
> struct loop *loop = loop_vinfo ? LOOP_VINFO_LOOP (loop_vinfo) : NULL;
> tree fndecl, new_temp;
> - gimple *def_stmt;
> gimple *new_stmt = NULL;
> int ncopies, j;
> auto_vec<simd_call_arg_info> arginfo;
> @@ -3794,7 +3784,7 @@ vectorizable_simd_clone_call (gimple *st
> thisarginfo.simd_lane_linear = false;
>
> op = gimple_call_arg (stmt, i);
> - if (!vect_is_simple_use (op, vinfo, &def_stmt, &thisarginfo.dt,
> + if (!vect_is_simple_use (op, vinfo, &thisarginfo.dt,
> &thisarginfo.vectype)
> || thisarginfo.dt == vect_uninitialized_def)
> {
> @@ -4575,7 +4565,6 @@ vectorizable_conversion (gimple *stmt, g
> enum tree_code codecvt1 = ERROR_MARK, codecvt2 = ERROR_MARK;
> tree decl1 = NULL_TREE, decl2 = NULL_TREE;
> tree new_temp;
> - gimple *def_stmt;
> enum vect_def_type dt[2] = {vect_unknown_def_type, vect_unknown_def_type};
> int ndts = 2;
> gimple *new_stmt = NULL;
> @@ -4651,7 +4640,7 @@ vectorizable_conversion (gimple *stmt, g
> }
>
> /* Check the operands of the operation. */
> - if (!vect_is_simple_use (op0, vinfo, &def_stmt, &dt[0], &vectype_in))
> + if (!vect_is_simple_use (op0, vinfo, &dt[0], &vectype_in))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -4667,9 +4656,9 @@ vectorizable_conversion (gimple *stmt, g
> /* For WIDEN_MULT_EXPR, if OP0 is a constant, use the type of
> OP1. */
> if (CONSTANT_CLASS_P (op0))
> - ok = vect_is_simple_use (op1, vinfo, &def_stmt, &dt[1], &vectype_in);
> + ok = vect_is_simple_use (op1, vinfo, &dt[1], &vectype_in);
> else
> - ok = vect_is_simple_use (op1, vinfo, &def_stmt, &dt[1]);
> + ok = vect_is_simple_use (op1, vinfo, &dt[1]);
>
> if (!ok)
> {
> @@ -5171,7 +5160,6 @@ vectorizable_assignment (gimple *stmt, g
> stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
> tree new_temp;
> - gimple *def_stmt;
> enum vect_def_type dt[1] = {vect_unknown_def_type};
> int ndts = 1;
> int ncopies;
> @@ -5224,7 +5212,7 @@ vectorizable_assignment (gimple *stmt, g
>
> gcc_assert (ncopies >= 1);
>
> - if (!vect_is_simple_use (op, vinfo, &def_stmt, &dt[0], &vectype_in))
> + if (!vect_is_simple_use (op, vinfo, &dt[0], &vectype_in))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -5380,7 +5368,6 @@ vectorizable_shift (gimple *stmt, gimple
> optab optab;
> int icode;
> machine_mode optab_op2_mode;
> - gimple *def_stmt;
> enum vect_def_type dt[2] = {vect_unknown_def_type, vect_unknown_def_type};
> int ndts = 2;
> gimple *new_stmt = NULL;
> @@ -5430,7 +5417,7 @@ vectorizable_shift (gimple *stmt, gimple
> }
>
> op0 = gimple_assign_rhs1 (stmt);
> - if (!vect_is_simple_use (op0, vinfo, &def_stmt, &dt[0], &vectype))
> + if (!vect_is_simple_use (op0, vinfo, &dt[0], &vectype))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -5457,7 +5444,7 @@ vectorizable_shift (gimple *stmt, gimple
> return false;
>
> op1 = gimple_assign_rhs2 (stmt);
> - if (!vect_is_simple_use (op1, vinfo, &def_stmt, &dt[1], &op1_vectype))
> + if (!vect_is_simple_use (op1, vinfo, &dt[1], &op1_vectype))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -5746,7 +5733,6 @@ vectorizable_operation (gimple *stmt, gi
> int op_type;
> optab optab;
> bool target_support_p;
> - gimple *def_stmt;
> enum vect_def_type dt[3]
> = {vect_unknown_def_type, vect_unknown_def_type, vect_unknown_def_type};
> int ndts = 3;
> @@ -5817,7 +5803,7 @@ vectorizable_operation (gimple *stmt, gi
> }
>
> op0 = gimple_assign_rhs1 (stmt);
> - if (!vect_is_simple_use (op0, vinfo, &def_stmt, &dt[0], &vectype))
> + if (!vect_is_simple_use (op0, vinfo, &dt[0], &vectype))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -5871,7 +5857,7 @@ vectorizable_operation (gimple *stmt, gi
> if (op_type == binary_op || op_type == ternary_op)
> {
> op1 = gimple_assign_rhs2 (stmt);
> - if (!vect_is_simple_use (op1, vinfo, &def_stmt, &dt[1]))
> + if (!vect_is_simple_use (op1, vinfo, &dt[1]))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -5882,7 +5868,7 @@ vectorizable_operation (gimple *stmt, gi
> if (op_type == ternary_op)
> {
> op2 = gimple_assign_rhs3 (stmt);
> - if (!vect_is_simple_use (op2, vinfo, &def_stmt, &dt[2]))
> + if (!vect_is_simple_use (op2, vinfo, &dt[2]))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -6196,7 +6182,6 @@ vectorizable_store (gimple *stmt, gimple
> machine_mode vec_mode;
> tree dummy;
> enum dr_alignment_support alignment_support_scheme;
> - gimple *def_stmt;
> enum vect_def_type rhs_dt = vect_unknown_def_type;
> enum vect_def_type mask_dt = vect_unknown_def_type;
> stmt_vec_info prev_stmt_info = NULL;
> @@ -6757,7 +6742,7 @@ vectorizable_store (gimple *stmt, gimple
> vec_oprnd = vec_oprnds[j];
> else
> {
> - vect_is_simple_use (op, vinfo, &def_stmt, &rhs_dt);
> + vect_is_simple_use (op, vinfo, &rhs_dt);
> vec_oprnd = vect_get_vec_def_for_stmt_copy (rhs_dt,
> vec_oprnd);
> }
> @@ -7003,7 +6988,7 @@ vectorizable_store (gimple *stmt, gimple
> for (i = 0; i < group_size; i++)
> {
> op = oprnds[i];
> - vect_is_simple_use (op, vinfo, &def_stmt, &rhs_dt);
> + vect_is_simple_use (op, vinfo, &rhs_dt);
> vec_oprnd = vect_get_vec_def_for_stmt_copy (rhs_dt, op);
> dr_chain[i] = vec_oprnd;
> oprnds[i] = vec_oprnd;
> @@ -8588,9 +8573,7 @@ vect_is_simple_cond (tree cond, vec_info
> if (TREE_CODE (cond) == SSA_NAME
> && VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (cond)))
> {
> - gimple *lhs_def_stmt = SSA_NAME_DEF_STMT (cond);
> - if (!vect_is_simple_use (cond, vinfo, &lhs_def_stmt,
> - &dts[0], comp_vectype)
> + if (!vect_is_simple_use (cond, vinfo, &dts[0], comp_vectype)
> || !*comp_vectype
> || !VECTOR_BOOLEAN_TYPE_P (*comp_vectype))
> return false;
> @@ -8605,8 +8588,7 @@ vect_is_simple_cond (tree cond, vec_info
>
> if (TREE_CODE (lhs) == SSA_NAME)
> {
> - gimple *lhs_def_stmt = SSA_NAME_DEF_STMT (lhs);
> - if (!vect_is_simple_use (lhs, vinfo, &lhs_def_stmt, &dts[0], &vectype1))
> + if (!vect_is_simple_use (lhs, vinfo, &dts[0], &vectype1))
> return false;
> }
> else if (TREE_CODE (lhs) == INTEGER_CST || TREE_CODE (lhs) == REAL_CST
> @@ -8617,8 +8599,7 @@ vect_is_simple_cond (tree cond, vec_info
>
> if (TREE_CODE (rhs) == SSA_NAME)
> {
> - gimple *rhs_def_stmt = SSA_NAME_DEF_STMT (rhs);
> - if (!vect_is_simple_use (rhs, vinfo, &rhs_def_stmt, &dts[1], &vectype2))
> + if (!vect_is_simple_use (rhs, vinfo, &dts[1], &vectype2))
> return false;
> }
> else if (TREE_CODE (rhs) == INTEGER_CST || TREE_CODE (rhs) == REAL_CST
> @@ -8750,12 +8731,9 @@ vectorizable_condition (gimple *stmt, gi
> || !comp_vectype)
> return false;
>
> - gimple *def_stmt;
> - if (!vect_is_simple_use (then_clause, stmt_info->vinfo, &def_stmt, &dts[2],
> - &vectype1))
> + if (!vect_is_simple_use (then_clause, stmt_info->vinfo, &dts[2], &vectype1))
> return false;
> - if (!vect_is_simple_use (else_clause, stmt_info->vinfo, &def_stmt, &dts[3],
> - &vectype2))
> + if (!vect_is_simple_use (else_clause, stmt_info->vinfo, &dts[3], &vectype2))
> return false;
>
> if (vectype1 && !useless_type_conversion_p (vectype, vectype1))
> @@ -8892,26 +8870,24 @@ vectorizable_condition (gimple *stmt, gi
> }
> else
> {
> - gimple *gtemp;
> if (masked)
> {
> vec_cond_lhs
> = vect_get_vec_def_for_operand (cond_expr, stmt,
> comp_vectype);
> - vect_is_simple_use (cond_expr, stmt_info->vinfo,
> - >emp, &dts[0]);
> + vect_is_simple_use (cond_expr, stmt_info->vinfo, &dts[0]);
> }
> else
> {
> vec_cond_lhs
> = vect_get_vec_def_for_operand (cond_expr0,
> stmt, comp_vectype);
> - vect_is_simple_use (cond_expr0, loop_vinfo, >emp, &dts[0]);
> + vect_is_simple_use (cond_expr0, loop_vinfo, &dts[0]);
>
> vec_cond_rhs
> = vect_get_vec_def_for_operand (cond_expr1,
> stmt, comp_vectype);
> - vect_is_simple_use (cond_expr1, loop_vinfo, >emp, &dts[1]);
> + vect_is_simple_use (cond_expr1, loop_vinfo, &dts[1]);
> }
> if (reduc_index == 1)
> vec_then_clause = reduc_def;
> @@ -8919,8 +8895,7 @@ vectorizable_condition (gimple *stmt, gi
> {
> vec_then_clause = vect_get_vec_def_for_operand (then_clause,
> stmt);
> - vect_is_simple_use (then_clause, loop_vinfo,
> - >emp, &dts[2]);
> + vect_is_simple_use (then_clause, loop_vinfo, &dts[2]);
> }
> if (reduc_index == 2)
> vec_else_clause = reduc_def;
> @@ -8928,7 +8903,7 @@ vectorizable_condition (gimple *stmt, gi
> {
> vec_else_clause = vect_get_vec_def_for_operand (else_clause,
> stmt);
> - vect_is_simple_use (else_clause, loop_vinfo, >emp, &dts[3]);
> + vect_is_simple_use (else_clause, loop_vinfo, &dts[3]);
> }
> }
> }
> @@ -9089,7 +9064,6 @@ vectorizable_comparison (gimple *stmt, g
> bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
> vec<tree> vec_oprnds0 = vNULL;
> vec<tree> vec_oprnds1 = vNULL;
> - gimple *def_stmt;
> tree mask_type;
> tree mask;
>
> @@ -9132,12 +9106,10 @@ vectorizable_comparison (gimple *stmt, g
> rhs1 = gimple_assign_rhs1 (stmt);
> rhs2 = gimple_assign_rhs2 (stmt);
>
> - if (!vect_is_simple_use (rhs1, stmt_info->vinfo, &def_stmt,
> - &dts[0], &vectype1))
> + if (!vect_is_simple_use (rhs1, stmt_info->vinfo, &dts[0], &vectype1))
> return false;
>
> - if (!vect_is_simple_use (rhs2, stmt_info->vinfo, &def_stmt,
> - &dts[1], &vectype2))
> + if (!vect_is_simple_use (rhs2, stmt_info->vinfo, &dts[1], &vectype2))
> return false;
>
> if (vectype1 && vectype2
> @@ -10043,7 +10015,7 @@ get_same_sized_vectype (tree scalar_type
> VINFO - the vect info of the loop or basic block that is being vectorized.
> OPERAND - operand in the loop or bb.
> Output:
> - DEF_STMT - the defining stmt in case OPERAND is an SSA_NAME.
> + DEF_STMT_OUT (optional) - the defining stmt in case OPERAND is an SSA_NAME.
> DT - the type of definition
>
> Returns whether a stmt with OPERAND can be vectorized.
> @@ -10055,10 +10027,11 @@ get_same_sized_vectype (tree scalar_type
> For now, operands defined outside the basic block are not supported. */
>
> bool
> -vect_is_simple_use (tree operand, vec_info *vinfo,
> - gimple **def_stmt, enum vect_def_type *dt)
> +vect_is_simple_use (tree operand, vec_info *vinfo, enum vect_def_type *dt,
> + gimple **def_stmt_out)
> {
> - *def_stmt = NULL;
> + if (def_stmt_out)
> + *def_stmt_out = NULL;
> *dt = vect_unknown_def_type;
>
> if (dump_enabled_p ())
> @@ -10095,18 +10068,20 @@ vect_is_simple_use (tree operand, vec_in
> return true;
> }
>
> - *def_stmt = SSA_NAME_DEF_STMT (operand);
> + gimple *def_stmt = SSA_NAME_DEF_STMT (operand);
> + if (def_stmt_out)
> + *def_stmt_out = def_stmt;
> if (dump_enabled_p ())
> {
> dump_printf_loc (MSG_NOTE, vect_location, "def_stmt: ");
> - dump_gimple_stmt (MSG_NOTE, TDF_SLIM, *def_stmt, 0);
> + dump_gimple_stmt (MSG_NOTE, TDF_SLIM, def_stmt, 0);
> }
>
> - if (! vect_stmt_in_region_p (vinfo, *def_stmt))
> + if (! vect_stmt_in_region_p (vinfo, def_stmt))
> *dt = vect_external_def;
> else
> {
> - stmt_vec_info stmt_vinfo = vinfo_for_stmt (*def_stmt);
> + stmt_vec_info stmt_vinfo = vinfo_for_stmt (def_stmt);
> *dt = STMT_VINFO_DEF_TYPE (stmt_vinfo);
> }
>
> @@ -10153,7 +10128,7 @@ vect_is_simple_use (tree operand, vec_in
> return false;
> }
>
> - switch (gimple_code (*def_stmt))
> + switch (gimple_code (def_stmt))
> {
> case GIMPLE_PHI:
> case GIMPLE_ASSIGN:
> @@ -10179,12 +10154,16 @@ vect_is_simple_use (tree operand, vec_in
> scalar operand. */
>
> bool
> -vect_is_simple_use (tree operand, vec_info *vinfo,
> - gimple **def_stmt, enum vect_def_type *dt, tree *vectype)
> +vect_is_simple_use (tree operand, vec_info *vinfo, enum vect_def_type *dt,
> + tree *vectype, gimple **def_stmt_out)
> {
> - if (!vect_is_simple_use (operand, vinfo, def_stmt, dt))
> + gimple *def_stmt;
> + if (!vect_is_simple_use (operand, vinfo, dt, &def_stmt))
> return false;
>
> + if (def_stmt_out)
> + *def_stmt_out = def_stmt;
> +
> /* Now get a vector type if the def is internal, otherwise supply
> NULL_TREE and leave it up to the caller to figure out a proper
> type for the use stmt. */
> @@ -10194,7 +10173,7 @@ vect_is_simple_use (tree operand, vec_in
> || *dt == vect_double_reduction_def
> || *dt == vect_nested_cycle)
> {
> - stmt_vec_info stmt_info = vinfo_for_stmt (*def_stmt);
> + stmt_vec_info stmt_info = vinfo_for_stmt (def_stmt);
>
> if (STMT_VINFO_IN_PATTERN_P (stmt_info)
> && !STMT_VINFO_RELEVANT (stmt_info)
> @@ -10869,13 +10848,11 @@ vect_get_mask_type_for_stmt (stmt_vec_in
> {
> tree rhs;
> ssa_op_iter iter;
> - gimple *def_stmt;
> enum vect_def_type dt;
>
> FOR_EACH_SSA_TREE_OPERAND (rhs, stmt, iter, SSA_OP_USE)
> {
> - if (!vect_is_simple_use (rhs, stmt_info->vinfo,
> - &def_stmt, &dt, &vectype))
> + if (!vect_is_simple_use (rhs, stmt_info->vinfo, &dt, &vectype))
> {
> if (dump_enabled_p ())
> {
next prev parent reply other threads:[~2018-06-28 9:55 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-18 15:04 [9/n] PR85694: Add a vect_look_through_pattern helper Richard Sandiford
2018-06-19 10:12 ` Richard Biener
2018-06-20 10:24 ` Richard Sandiford
2018-06-27 9:31 ` [9a/n] PR85694: Reorder vect_is_simple_use arguments Richard Sandiford
2018-06-28 9:55 ` Richard Biener [this message]
2018-06-27 9:34 ` [9b/n] PR85694: Make vect_is_simple_use look through pattern statements Richard Sandiford
2018-06-28 9:57 ` Richard Biener
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAFiYyc1MNExTmBa4THHG8Ngv_muSF9suV6wSuXrA07fjLekAcQ@mail.gmail.com \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=richard.sandiford@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).