https://gcc.gnu.org/g:21a487046f4acda0d7d3aaed08a99501bd0430d3

commit r16-822-g21a487046f4acda0d7d3aaed08a99501bd0430d3
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Tue May 20 14:48:58 2025 -0700

    expand: Use rtx_cost directly instead of gen_move_insn for 
canonicalize_comparison.
    
    This is the first part in fixing PR target/120372.
    The current code for canonicalize_comparison, uses gen_move_insn and 
rtx_cost to find
    out the cost of generating a constant. This is ok in most cases except 
sometimes
    the comparison instruction can handle different constants than a simple set
    intruction can do. This changes to use rtx_cost directly with the outer 
being COMPARE
    just like how prepare_cmp_insn handles that.
    
    Note this is also a small speedup and small memory improvement because we 
are not creating
    a move for the constant any more. Since we are not creating a 
psedu-register any more, this
    also removes the check on that.
    
    Also adds a dump so we can see why one choice was chosen over the other.
    
    Build and tested for aarch64-linux-gnu.
    
    gcc/ChangeLog:
    
            * expmed.cc (canonicalize_comparison): Use rtx_cost directly
            instead of gen_move_insn. Print out the choice if dump is enabled.
    
    Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>

Diff:
---
 gcc/expmed.cc | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/gcc/expmed.cc b/gcc/expmed.cc
index 72dbafe5d9f8..d5da199d033d 100644
--- a/gcc/expmed.cc
+++ b/gcc/expmed.cc
@@ -6408,18 +6408,25 @@ canonicalize_comparison (machine_mode mode, enum 
rtx_code *code, rtx *imm)
   if (overflow)
     return;
 
-  /* The following creates a pseudo; if we cannot do that, bail out.  */
-  if (!can_create_pseudo_p ())
-    return;
-
-  rtx reg = gen_rtx_REG (mode, LAST_VIRTUAL_REGISTER + 1);
   rtx new_imm = immed_wide_int_const (imm_modif, mode);
 
-  rtx_insn *old_rtx = gen_move_insn (reg, *imm);
-  rtx_insn *new_rtx = gen_move_insn (reg, new_imm);
+  int old_cost = rtx_cost (*imm, mode, COMPARE, 0, true);
+  int new_cost = rtx_cost (new_imm, mode, COMPARE, 0, true);
+
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    {
+      fprintf (dump_file, ";; cmp: %s, old cst: ",
+              GET_RTX_NAME (*code));
+      print_rtl (dump_file, *imm);
+      fprintf (dump_file, " new cst: ");
+      print_rtl (dump_file, new_imm);
+      fprintf (dump_file, "\n");
+      fprintf (dump_file, ";; old cst cost: %d, new cst cost: %d\n",
+              old_cost, new_cost);
+    }
 
   /* Update the immediate and the code.  */
-  if (insn_cost (old_rtx, true) > insn_cost (new_rtx, true))
+  if (old_cost > new_cost)
     {
       *code = equivalent_cmp_code (*code);
       *imm = new_imm;

Reply via email to