diff mbox series

[1/3] isel: Move duplicate comparisons to its own function

Message ID 20240726043600.47858-1-quic_apinski@quicinc.com
State New
Headers show
Series [1/3] isel: Move duplicate comparisons to its own function | expand

Commit Message

Andrew Pinski July 26, 2024, 4:35 a.m. UTC
This is just a small cleanup to isel and no functional changes just.
The loop inside pass_gimple_isel::execute looked was getting too
deap so let's fix that by moving it to its own function.

Bootstrapped and tested on x86_64-linux-gnu with no regressions.

gcc/ChangeLog:

	* gimple-isel.cc (pass_gimple_isel::execute): Factor out
	duplicate comparisons out to ...
	(duplicate_comparison): New function.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
---
 gcc/gimple-isel.cc | 66 ++++++++++++++++++++++++----------------------
 1 file changed, 35 insertions(+), 31 deletions(-)

Comments

Richard Biener July 26, 2024, 6:39 a.m. UTC | #1
On Fri, Jul 26, 2024 at 6:37 AM Andrew Pinski <quic_apinski@quicinc.com> wrote:
>
> This is just a small cleanup to isel and no functional changes just.
> The loop inside pass_gimple_isel::execute looked was getting too
> deap so let's fix that by moving it to its own function.
>
> Bootstrapped and tested on x86_64-linux-gnu with no regressions.

OK

> gcc/ChangeLog:
>
>         * gimple-isel.cc (pass_gimple_isel::execute): Factor out
>         duplicate comparisons out to ...
>         (duplicate_comparison): New function.
>
> Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
> ---
>  gcc/gimple-isel.cc | 66 ++++++++++++++++++++++++----------------------
>  1 file changed, 35 insertions(+), 31 deletions(-)
>
> diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
> index 57f7281bb50..327a78ea408 100644
> --- a/gcc/gimple-isel.cc
> +++ b/gcc/gimple-isel.cc
> @@ -395,6 +395,40 @@ gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
>                                      5, op0a, op0b, op1, op2, tcode_tree);
>  }
>
> +/* Duplicate COND_EXPR condition defs of STMT located in BB when they are
> +   comparisons so RTL expansion with the help of TER
> +   can perform better if conversion.  */
> +static void
> +duplicate_comparison (gassign *stmt, basic_block bb)
> +{
> +  imm_use_iterator imm_iter;
> +  use_operand_p use_p;
> +  auto_vec<gassign *, 4> cond_exprs;
> +  unsigned cnt = 0;
> +  tree lhs = gimple_assign_lhs (stmt);
> +  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
> +    {
> +      if (is_gimple_debug (USE_STMT (use_p)))
> +       continue;
> +      cnt++;
> +      if (gimple_bb (USE_STMT (use_p)) == bb
> +         && is_gimple_assign (USE_STMT (use_p))
> +         && gimple_assign_rhs1_ptr (USE_STMT (use_p)) == use_p->use
> +         && gimple_assign_rhs_code (USE_STMT (use_p)) == COND_EXPR)
> +       cond_exprs.safe_push (as_a <gassign *> (USE_STMT (use_p)));
> +      }
> +  for (unsigned i = cond_exprs.length () == cnt ? 1 : 0;
> +       i < cond_exprs.length (); ++i)
> +    {
> +      gassign *copy = as_a <gassign *> (gimple_copy (stmt));
> +      tree new_def = duplicate_ssa_name (lhs, copy);
> +      gimple_assign_set_lhs (copy, new_def);
> +      auto gsi2 = gsi_for_stmt (cond_exprs[i]);
> +      gsi_insert_before (&gsi2, copy, GSI_SAME_STMT);
> +      gimple_assign_set_rhs1 (cond_exprs[i], new_def);
> +      update_stmt (cond_exprs[i]);
> +    }
> +}
>
>
>  namespace {
> @@ -469,37 +503,7 @@ pass_gimple_isel::execute (struct function *fun)
>           tree lhs = gimple_assign_lhs (stmt);
>           if (TREE_CODE_CLASS (code) == tcc_comparison
>               && !has_single_use (lhs))
> -           {
> -             /* Duplicate COND_EXPR condition defs when they are
> -                comparisons so RTL expansion with the help of TER
> -                can perform better if conversion.  */
> -             imm_use_iterator imm_iter;
> -             use_operand_p use_p;
> -             auto_vec<gassign *, 4> cond_exprs;
> -             unsigned cnt = 0;
> -             FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
> -               {
> -                 if (is_gimple_debug (USE_STMT (use_p)))
> -                   continue;
> -                 cnt++;
> -                 if (gimple_bb (USE_STMT (use_p)) == bb
> -                     && is_gimple_assign (USE_STMT (use_p))
> -                     && gimple_assign_rhs1_ptr (USE_STMT (use_p)) == use_p->use
> -                     && gimple_assign_rhs_code (USE_STMT (use_p)) == COND_EXPR)
> -                   cond_exprs.safe_push (as_a <gassign *> (USE_STMT (use_p)));
> -               }
> -             for (unsigned i = cond_exprs.length () == cnt ? 1 : 0;
> -                  i < cond_exprs.length (); ++i)
> -               {
> -                 gassign *copy = as_a <gassign *> (gimple_copy (stmt));
> -                 tree new_def = duplicate_ssa_name (lhs, copy);
> -                 gimple_assign_set_lhs (copy, new_def);
> -                 auto gsi2 = gsi_for_stmt (cond_exprs[i]);
> -                 gsi_insert_before (&gsi2, copy, GSI_SAME_STMT);
> -                 gimple_assign_set_rhs1 (cond_exprs[i], new_def);
> -                 update_stmt (cond_exprs[i]);
> -               }
> -           }
> +           duplicate_comparison (stmt, bb);
>         }
>      }
>
> --
> 2.43.0
>
diff mbox series

Patch

diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
index 57f7281bb50..327a78ea408 100644
--- a/gcc/gimple-isel.cc
+++ b/gcc/gimple-isel.cc
@@ -395,6 +395,40 @@  gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
 				     5, op0a, op0b, op1, op2, tcode_tree);
 }
 
+/* Duplicate COND_EXPR condition defs of STMT located in BB when they are
+   comparisons so RTL expansion with the help of TER
+   can perform better if conversion.  */
+static void
+duplicate_comparison (gassign *stmt, basic_block bb)
+{
+  imm_use_iterator imm_iter;
+  use_operand_p use_p;
+  auto_vec<gassign *, 4> cond_exprs;
+  unsigned cnt = 0;
+  tree lhs = gimple_assign_lhs (stmt);
+  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
+    {
+      if (is_gimple_debug (USE_STMT (use_p)))
+	continue;
+      cnt++;
+      if (gimple_bb (USE_STMT (use_p)) == bb
+	  && is_gimple_assign (USE_STMT (use_p))
+	  && gimple_assign_rhs1_ptr (USE_STMT (use_p)) == use_p->use
+	  && gimple_assign_rhs_code (USE_STMT (use_p)) == COND_EXPR)
+	cond_exprs.safe_push (as_a <gassign *> (USE_STMT (use_p)));
+      }
+  for (unsigned i = cond_exprs.length () == cnt ? 1 : 0;
+       i < cond_exprs.length (); ++i)
+    {
+      gassign *copy = as_a <gassign *> (gimple_copy (stmt));
+      tree new_def = duplicate_ssa_name (lhs, copy);
+      gimple_assign_set_lhs (copy, new_def);
+      auto gsi2 = gsi_for_stmt (cond_exprs[i]);
+      gsi_insert_before (&gsi2, copy, GSI_SAME_STMT);
+      gimple_assign_set_rhs1 (cond_exprs[i], new_def);
+      update_stmt (cond_exprs[i]);
+    }
+}
 
 
 namespace {
@@ -469,37 +503,7 @@  pass_gimple_isel::execute (struct function *fun)
 	  tree lhs = gimple_assign_lhs (stmt);
 	  if (TREE_CODE_CLASS (code) == tcc_comparison
 	      && !has_single_use (lhs))
-	    {
-	      /* Duplicate COND_EXPR condition defs when they are
-		 comparisons so RTL expansion with the help of TER
-		 can perform better if conversion.  */
-	      imm_use_iterator imm_iter;
-	      use_operand_p use_p;
-	      auto_vec<gassign *, 4> cond_exprs;
-	      unsigned cnt = 0;
-	      FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
-		{
-		  if (is_gimple_debug (USE_STMT (use_p)))
-		    continue;
-		  cnt++;
-		  if (gimple_bb (USE_STMT (use_p)) == bb
-		      && is_gimple_assign (USE_STMT (use_p))
-		      && gimple_assign_rhs1_ptr (USE_STMT (use_p)) == use_p->use
-		      && gimple_assign_rhs_code (USE_STMT (use_p)) == COND_EXPR)
-		    cond_exprs.safe_push (as_a <gassign *> (USE_STMT (use_p)));
-		}
-	      for (unsigned i = cond_exprs.length () == cnt ? 1 : 0;
-		   i < cond_exprs.length (); ++i)
-		{
-		  gassign *copy = as_a <gassign *> (gimple_copy (stmt));
-		  tree new_def = duplicate_ssa_name (lhs, copy);
-		  gimple_assign_set_lhs (copy, new_def);
-		  auto gsi2 = gsi_for_stmt (cond_exprs[i]);
-		  gsi_insert_before (&gsi2, copy, GSI_SAME_STMT);
-		  gimple_assign_set_rhs1 (cond_exprs[i], new_def);
-		  update_stmt (cond_exprs[i]);
-		}
-	    }
+	    duplicate_comparison (stmt, bb);
 	}
     }