diff mbox series

[5/8] vect: Use an array to replace 3 relevant variables

Message ID LV2PR01MB783901639CC4191FBBC4CF4FF7CC2@LV2PR01MB7839.prod.exchangelabs.com
State New
Headers show
Series [PATH,1/8] vect: Add a function to check lane-reducing stmt | expand

Commit Message

Feng Xue OS June 16, 2024, 7:27 a.m. UTC
It's better to place 3 relevant independent variables into array, since we
have requirement to access them via an index in the following patch. At the
same time, this change may get some duplicated code be more compact.

Thanks,
Feng

---
gcc/
	* tree-vect-loop.cc (vect_transform_reduction): Replace vec_oprnds0/1/2
	with one new array variable vec_oprnds[3].
---
 gcc/tree-vect-loop.cc | 42 +++++++++++++++++-------------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

Comments

Richard Biener June 19, 2024, 1:04 p.m. UTC | #1
On Sun, Jun 16, 2024 at 9:27 AM Feng Xue OS <fxue@os.amperecomputing.com> wrote:
>
> It's better to place 3 relevant independent variables into array, since we
> have requirement to access them via an index in the following patch. At the
> same time, this change may get some duplicated code be more compact.

OK.  I might have caused a conflict for this patch, so even OK after conflict
resolution.

Thanks,
Richard.

> Thanks,
> Feng
>
> ---
> gcc/
>         * tree-vect-loop.cc (vect_transform_reduction): Replace vec_oprnds0/1/2
>         with one new array variable vec_oprnds[3].
> ---
>  gcc/tree-vect-loop.cc | 42 +++++++++++++++++-------------------------
>  1 file changed, 17 insertions(+), 25 deletions(-)
>
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index 39aa5cb1197..7909d63d4df 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -8605,9 +8605,7 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
>
>    /* Transform.  */
>    tree new_temp = NULL_TREE;
> -  auto_vec<tree> vec_oprnds0;
> -  auto_vec<tree> vec_oprnds1;
> -  auto_vec<tree> vec_oprnds2;
> +  auto_vec<tree> vec_oprnds[3];
>
>    if (dump_enabled_p ())
>      dump_printf_loc (MSG_NOTE, vect_location, "transform reduction.\n");
> @@ -8657,12 +8655,12 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
>      {
>        vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, ncopies,
>                          single_defuse_cycle && reduc_index == 0
> -                        ? NULL_TREE : op.ops[0], &vec_oprnds0,
> +                        ? NULL_TREE : op.ops[0], &vec_oprnds[0],
>                          single_defuse_cycle && reduc_index == 1
> -                        ? NULL_TREE : op.ops[1], &vec_oprnds1,
> +                        ? NULL_TREE : op.ops[1], &vec_oprnds[1],
>                          op.num_ops == 3
>                          && !(single_defuse_cycle && reduc_index == 2)
> -                        ? op.ops[2] : NULL_TREE, &vec_oprnds2);
> +                        ? op.ops[2] : NULL_TREE, &vec_oprnds[2]);
>      }
>    else
>      {
> @@ -8670,12 +8668,12 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
>          vectype.  */
>        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], truth_type_for (vectype_in), &vec_oprnds0,
> +      vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, ncopies, op.ops[0],
> +                        truth_type_for (vectype_in), &vec_oprnds[0],
>                          reduc_index == 1 ? NULL_TREE : op.ops[1],
> -                        NULL_TREE, &vec_oprnds1,
> +                        NULL_TREE, &vec_oprnds[1],
>                          reduc_index == 2 ? NULL_TREE : op.ops[2],
> -                        NULL_TREE, &vec_oprnds2);
> +                        NULL_TREE, &vec_oprnds[2]);
>      }
>
>    /* For single def-use cycles get one copy of the vectorized reduction
> @@ -8683,20 +8681,21 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
>    if (single_defuse_cycle)
>      {
>        vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, 1,
> -                        reduc_index == 0 ? op.ops[0] : NULL_TREE, &vec_oprnds0,
> -                        reduc_index == 1 ? op.ops[1] : NULL_TREE, &vec_oprnds1,
> +                        reduc_index == 0 ? op.ops[0] : NULL_TREE,
> +                        &vec_oprnds[0],
> +                        reduc_index == 1 ? op.ops[1] : NULL_TREE,
> +                        &vec_oprnds[1],
>                          reduc_index == 2 ? op.ops[2] : NULL_TREE,
> -                        &vec_oprnds2);
> +                        &vec_oprnds[2]);
>      }
>
>    bool emulated_mixed_dot_prod = vect_is_emulated_mixed_dot_prod (stmt_info);
> +  unsigned num = vec_oprnds[reduc_index == 0 ? 1 : 0].length ();
>
> -  unsigned num = (reduc_index == 0
> -                 ? vec_oprnds1.length () : vec_oprnds0.length ());
>    for (unsigned i = 0; i < num; ++i)
>      {
>        gimple *new_stmt;
> -      tree vop[3] = { vec_oprnds0[i], vec_oprnds1[i], NULL_TREE };
> +      tree vop[3] = { vec_oprnds[0][i], vec_oprnds[1][i], NULL_TREE };
>        if (masked_loop_p && !mask_by_cond_expr)
>         {
>           /* No conditional ifns have been defined for dot-product yet.  */
> @@ -8721,7 +8720,7 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
>        else
>         {
>           if (op.num_ops >= 3)
> -           vop[2] = vec_oprnds2[i];
> +           vop[2] = vec_oprnds[2][i];
>
>           if (masked_loop_p && mask_by_cond_expr)
>             {
> @@ -8752,14 +8751,7 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
>         }
>
>        if (single_defuse_cycle && i < num - 1)
> -       {
> -         if (reduc_index == 0)
> -           vec_oprnds0.safe_push (gimple_get_lhs (new_stmt));
> -         else if (reduc_index == 1)
> -           vec_oprnds1.safe_push (gimple_get_lhs (new_stmt));
> -         else if (reduc_index == 2)
> -           vec_oprnds2.safe_push (gimple_get_lhs (new_stmt));
> -       }
> +       vec_oprnds[reduc_index].safe_push (gimple_get_lhs (new_stmt));
>        else if (slp_node)
>         slp_node->push_vec_def (new_stmt);
>        else
> --
> 2.17.1
diff mbox series

Patch

From 168a55952ae317fca34af55d025c1235b4ff34b5 Mon Sep 17 00:00:00 2001
From: Feng Xue <fxue@os.amperecomputing.com>
Date: Sun, 16 Jun 2024 13:21:13 +0800
Subject: [PATCH 5/8] vect: Use an array to replace 3 relevant variables

It's better to place 3 relavent independent variables into array, since we
have requirement to access them via an index in the following patch. At the
same time, this change may get some duplicated code be more compact.

2024-06-16 Feng Xue <fxue@os.amperecomputing.com>

gcc/
	* tree-vect-loop.cc (vect_transform_reduction): Replace vec_oprnds0/1/2
	with one new array variable vec_oprnds[3].
---
 gcc/tree-vect-loop.cc | 42 +++++++++++++++++-------------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 39aa5cb1197..7909d63d4df 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -8605,9 +8605,7 @@  vect_transform_reduction (loop_vec_info loop_vinfo,
 
   /* Transform.  */
   tree new_temp = NULL_TREE;
-  auto_vec<tree> vec_oprnds0;
-  auto_vec<tree> vec_oprnds1;
-  auto_vec<tree> vec_oprnds2;
+  auto_vec<tree> vec_oprnds[3];
 
   if (dump_enabled_p ())
     dump_printf_loc (MSG_NOTE, vect_location, "transform reduction.\n");
@@ -8657,12 +8655,12 @@  vect_transform_reduction (loop_vec_info loop_vinfo,
     {
       vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, ncopies,
 			 single_defuse_cycle && reduc_index == 0
-			 ? NULL_TREE : op.ops[0], &vec_oprnds0,
+			 ? NULL_TREE : op.ops[0], &vec_oprnds[0],
 			 single_defuse_cycle && reduc_index == 1
-			 ? NULL_TREE : op.ops[1], &vec_oprnds1,
+			 ? NULL_TREE : op.ops[1], &vec_oprnds[1],
 			 op.num_ops == 3
 			 && !(single_defuse_cycle && reduc_index == 2)
-			 ? op.ops[2] : NULL_TREE, &vec_oprnds2);
+			 ? op.ops[2] : NULL_TREE, &vec_oprnds[2]);
     }
   else
     {
@@ -8670,12 +8668,12 @@  vect_transform_reduction (loop_vec_info loop_vinfo,
 	 vectype.  */
       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], truth_type_for (vectype_in), &vec_oprnds0,
+      vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, ncopies, op.ops[0],
+			 truth_type_for (vectype_in), &vec_oprnds[0],
 			 reduc_index == 1 ? NULL_TREE : op.ops[1],
-			 NULL_TREE, &vec_oprnds1,
+			 NULL_TREE, &vec_oprnds[1],
 			 reduc_index == 2 ? NULL_TREE : op.ops[2],
-			 NULL_TREE, &vec_oprnds2);
+			 NULL_TREE, &vec_oprnds[2]);
     }
 
   /* For single def-use cycles get one copy of the vectorized reduction
@@ -8683,20 +8681,21 @@  vect_transform_reduction (loop_vec_info loop_vinfo,
   if (single_defuse_cycle)
     {
       vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, 1,
-			 reduc_index == 0 ? op.ops[0] : NULL_TREE, &vec_oprnds0,
-			 reduc_index == 1 ? op.ops[1] : NULL_TREE, &vec_oprnds1,
+			 reduc_index == 0 ? op.ops[0] : NULL_TREE,
+			 &vec_oprnds[0],
+			 reduc_index == 1 ? op.ops[1] : NULL_TREE,
+			 &vec_oprnds[1],
 			 reduc_index == 2 ? op.ops[2] : NULL_TREE,
-			 &vec_oprnds2);
+			 &vec_oprnds[2]);
     }
 
   bool emulated_mixed_dot_prod = vect_is_emulated_mixed_dot_prod (stmt_info);
+  unsigned num = vec_oprnds[reduc_index == 0 ? 1 : 0].length ();
 
-  unsigned num = (reduc_index == 0
-		  ? vec_oprnds1.length () : vec_oprnds0.length ());
   for (unsigned i = 0; i < num; ++i)
     {
       gimple *new_stmt;
-      tree vop[3] = { vec_oprnds0[i], vec_oprnds1[i], NULL_TREE };
+      tree vop[3] = { vec_oprnds[0][i], vec_oprnds[1][i], NULL_TREE };
       if (masked_loop_p && !mask_by_cond_expr)
 	{
 	  /* No conditional ifns have been defined for dot-product yet.  */
@@ -8721,7 +8720,7 @@  vect_transform_reduction (loop_vec_info loop_vinfo,
       else
 	{
 	  if (op.num_ops >= 3)
-	    vop[2] = vec_oprnds2[i];
+	    vop[2] = vec_oprnds[2][i];
 
 	  if (masked_loop_p && mask_by_cond_expr)
 	    {
@@ -8752,14 +8751,7 @@  vect_transform_reduction (loop_vec_info loop_vinfo,
 	}
 
       if (single_defuse_cycle && i < num - 1)
-	{
-	  if (reduc_index == 0)
-	    vec_oprnds0.safe_push (gimple_get_lhs (new_stmt));
-	  else if (reduc_index == 1)
-	    vec_oprnds1.safe_push (gimple_get_lhs (new_stmt));
-	  else if (reduc_index == 2)
-	    vec_oprnds2.safe_push (gimple_get_lhs (new_stmt));
-	}
+	vec_oprnds[reduc_index].safe_push (gimple_get_lhs (new_stmt));
       else if (slp_node)
 	slp_node->push_vec_def (new_stmt);
       else
-- 
2.17.1