[04/46] Factor out the test for a valid reduction input

Message ID 87fu09rmbf.fsf@arm.com
State New
Headers show
Series
  • Remove vinfo_for_stmt etc.
Related show

Commit Message

Richard Sandiford July 24, 2018, 9:54 a.m.
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.


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.

Comments

Richard Biener July 25, 2018, 8:45 a.m. | #1
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)

>         {

Patch

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