The following makes the recognized INSN_CODEs available to the
backends for costing via insn_cost.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

I have not tried to follow the maze of recog calls in try_combine
to validate that the three INSN_CODE variables line up with
the insns costed in combine_validate_cost, but for the single
i2->i3 combination I looked at it works out.

IMO calling insn_cost on a non recognized (aka possibly unrecognizable)
insn doesn't make much sense.

OK?  Or am I on the wrong track?

Thanks,
Richard.

        PR target/126328
        * combine.cc (combine_validate_cost): New arguments for
        the insn codes.  Set INSN_CODE to recognized values
        before calling insn_cost.
        (try_combine): Adjust.
---
 gcc/combine.cc | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/gcc/combine.cc b/gcc/combine.cc
index 53ea168a44b..0711db3f9a6 100644
--- a/gcc/combine.cc
+++ b/gcc/combine.cc
@@ -825,7 +825,8 @@ do_SUBST_LINK (struct insn_link **into, struct insn_link 
*newval)
 
 static bool
 combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3,
-                      rtx newpat, rtx newi2pat, rtx newotherpat)
+                      rtx newpat, rtx newi2pat, rtx newotherpat,
+                      int insn_code, int i2_code, int other_code)
 {
   int i0_cost, i1_cost, i2_cost, i3_cost;
   int new_i2_cost, new_i3_cost;
@@ -867,7 +868,7 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn 
*i2, rtx_insn *i3,
   rtx tmp = PATTERN (i3);
   PATTERN (i3) = newpat;
   int tmpi = INSN_CODE (i3);
-  INSN_CODE (i3) = -1;
+  INSN_CODE (i3) = insn_code;
   new_i3_cost = insn_cost (i3, optimize_this_for_speed_p);
   PATTERN (i3) = tmp;
   INSN_CODE (i3) = tmpi;
@@ -876,7 +877,7 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn 
*i2, rtx_insn *i3,
       tmp = PATTERN (i2);
       PATTERN (i2) = newi2pat;
       tmpi = INSN_CODE (i2);
-      INSN_CODE (i2) = -1;
+      INSN_CODE (i2) = i2_code;
       new_i2_cost = insn_cost (i2, optimize_this_for_speed_p);
       PATTERN (i2) = tmp;
       INSN_CODE (i2) = tmpi;
@@ -897,7 +898,7 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn 
*i2, rtx_insn *i3,
       tmp = PATTERN (undobuf.other_insn);
       PATTERN (undobuf.other_insn) = newotherpat;
       tmpi = INSN_CODE (undobuf.other_insn);
-      INSN_CODE (undobuf.other_insn) = -1;
+      INSN_CODE (undobuf.other_insn) = other_code;
       new_other_cost = insn_cost (undobuf.other_insn,
                                  optimize_this_for_speed_p);
       PATTERN (undobuf.other_insn) = tmp;
@@ -4134,7 +4135,9 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, 
rtx_insn *i0,
 
   /* Reject this combination if insn_cost reports that the replacement
      instructions are more expensive than the originals.  */
-  if (!combine_validate_cost (i0, i1, i2, i3, newpat, newi2pat, other_pat))
+  if (!combine_validate_cost (i0, i1, i2, i3, newpat, newi2pat, other_pat,
+                             insn_code_number, i2_code_number,
+                             other_code_number))
     {
       undo_all ();
       return 0;
-- 
2.51.0

Reply via email to