This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [04/46] Factor out the test for a valid reduction input
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, richard dot sandiford at arm dot com
- Date: Wed, 25 Jul 2018 10:45:38 +0200
- Subject: Re: [04/46] Factor out the test for a valid reduction input
- References: <87wotlrmen.fsf@arm.com> <87fu09rmbf.fsf@arm.com>
On Tue, Jul 24, 2018 at 11:54 AM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> vect_is_slp_reduction and vect_is_simple_reduction had two instances
> each of:
>
> && (is_gimple_assign (def_stmt)
> || is_gimple_call (def_stmt)
> || STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
> == vect_induction_def
> || (gimple_code (def_stmt) == GIMPLE_PHI
> && STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
> == vect_internal_def
> && !is_loop_header_bb_p (gimple_bb (def_stmt)))))
>
> This patch splits it out in a subroutine.
OK
>
> 2018-07-24 Richard Sandiford <richard.sandiford@arm.com>
>
> gcc/
> * tree-vect-loop.c (vect_valid_reduction_input_p): New function,
> split out from...
> (vect_is_slp_reduction): ...here...
> (vect_is_simple_reduction): ...and here. Remove repetition of tests
> that are already known to be false.
>
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c 2018-07-24 10:22:09.237496975 +0100
> +++ gcc/tree-vect-loop.c 2018-07-24 10:22:12.737465897 +0100
> @@ -2501,6 +2501,21 @@ report_vect_op (dump_flags_t msg_type, g
> dump_gimple_stmt (msg_type, TDF_SLIM, stmt, 0);
> }
>
> +/* DEF_STMT occurs in a loop that contains a potential reduction operation.
> + Return true if the results of DEF_STMT are something that can be
> + accumulated by such a reduction. */
> +
> +static bool
> +vect_valid_reduction_input_p (gimple *def_stmt)
> +{
> + stmt_vec_info def_stmt_info = vinfo_for_stmt (def_stmt);
> + return (is_gimple_assign (def_stmt)
> + || is_gimple_call (def_stmt)
> + || STMT_VINFO_DEF_TYPE (def_stmt_info) == vect_induction_def
> + || (gimple_code (def_stmt) == GIMPLE_PHI
> + && STMT_VINFO_DEF_TYPE (def_stmt_info) == vect_internal_def
> + && !is_loop_header_bb_p (gimple_bb (def_stmt))));
> +}
>
> /* Detect SLP reduction of the form:
>
> @@ -2624,16 +2639,9 @@ vect_is_slp_reduction (loop_vec_info loo
> ("vect_internal_def"), or it's an induction (defined by a
> loop-header phi-node). */
> if (def_stmt
> - && gimple_bb (def_stmt)
> + && gimple_bb (def_stmt)
> && flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
> - && (is_gimple_assign (def_stmt)
> - || is_gimple_call (def_stmt)
> - || STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
> - == vect_induction_def
> - || (gimple_code (def_stmt) == GIMPLE_PHI
> - && STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
> - == vect_internal_def
> - && !is_loop_header_bb_p (gimple_bb (def_stmt)))))
> + && vect_valid_reduction_input_p (def_stmt))
> {
> lhs = gimple_assign_lhs (next_stmt);
> next_stmt = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> @@ -2654,16 +2662,9 @@ vect_is_slp_reduction (loop_vec_info loo
> ("vect_internal_def"), or it's an induction (defined by a
> loop-header phi-node). */
> if (def_stmt
> - && gimple_bb (def_stmt)
> + && gimple_bb (def_stmt)
> && flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
> - && (is_gimple_assign (def_stmt)
> - || is_gimple_call (def_stmt)
> - || STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
> - == vect_induction_def
> - || (gimple_code (def_stmt) == GIMPLE_PHI
> - && STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
> - == vect_internal_def
> - && !is_loop_header_bb_p (gimple_bb (def_stmt)))))
> + && vect_valid_reduction_input_p (def_stmt))
> {
> if (dump_enabled_p ())
> {
> @@ -3196,15 +3197,7 @@ vect_is_simple_reduction (loop_vec_info
> && (code == COND_EXPR
> || !def1 || gimple_nop_p (def1)
> || !flow_bb_inside_loop_p (loop, gimple_bb (def1))
> - || (def1 && flow_bb_inside_loop_p (loop, gimple_bb (def1))
> - && (is_gimple_assign (def1)
> - || is_gimple_call (def1)
> - || STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def1))
> - == vect_induction_def
> - || (gimple_code (def1) == GIMPLE_PHI
> - && STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def1))
> - == vect_internal_def
> - && !is_loop_header_bb_p (gimple_bb (def1)))))))
> + || vect_valid_reduction_input_p (def1)))
> {
> if (dump_enabled_p ())
> report_vect_op (MSG_NOTE, def_stmt, "detected reduction: ");
> @@ -3215,15 +3208,7 @@ vect_is_simple_reduction (loop_vec_info
> && (code == COND_EXPR
> || !def2 || gimple_nop_p (def2)
> || !flow_bb_inside_loop_p (loop, gimple_bb (def2))
> - || (def2 && flow_bb_inside_loop_p (loop, gimple_bb (def2))
> - && (is_gimple_assign (def2)
> - || is_gimple_call (def2)
> - || STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def2))
> - == vect_induction_def
> - || (gimple_code (def2) == GIMPLE_PHI
> - && STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def2))
> - == vect_internal_def
> - && !is_loop_header_bb_p (gimple_bb (def2)))))))
> + || vect_valid_reduction_input_p (def2)))
> {
> if (! nested_in_vect_loop && orig_code != MINUS_EXPR)
> {