]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fwprop: invoke change_is_worthwhile to judge if a replacement is worthwhile
authorHaochen Gui <guihaoc@gcc.gnu.org>
Mon, 24 Jun 2024 05:12:51 +0000 (13:12 +0800)
committerHaochen Gui <guihaoc@gcc.gnu.org>
Mon, 24 Jun 2024 05:17:27 +0000 (13:17 +0800)
gcc/
* fwprop.cc (try_fwprop_subst_pattern): Invoke change_is_worthwhile
to judge if a replacement is worthwhile.  Remove single_set check
and add is_debug_insn check.
* recog.cc (swap_change): Invalidate recog_data when the cached INSN
is swapped out.
* rtl-ssa/changes.cc (rtl_ssa::changes_are_worthwhile): Check if the
insn cost of new rtl is unknown and fail the replacement.

gcc/fwprop.cc
gcc/recog.cc
gcc/rtl-ssa/changes.cc

index de543923b92fa94a44c59b816728d2a490bdc72c..bfdc7a1b7492029a8479efad67cca656e60edfe6 100644 (file)
@@ -453,7 +453,7 @@ try_fwprop_subst_pattern (obstack_watermark &attempt, insn_change &use_change,
       && (prop.changed_mem_p ()
          || contains_mem_rtx_p (src)
          || use_insn->is_asm ()
-         || !single_set (use_rtl)))
+         || use_insn->is_debug_insn ()))
     {
       if (dump_file && (dump_flags & TDF_DETAILS))
        fprintf (dump_file, "cannot propagate from insn %d into"
@@ -471,29 +471,20 @@ try_fwprop_subst_pattern (obstack_watermark &attempt, insn_change &use_change,
       redo_changes (0);
     }
 
-  /* ??? In theory, it should be better to use insn costs rather than
-     set_src_costs here.  That would involve replacing this code with
-     change_is_worthwhile.  */
   bool ok = recog (attempt, use_change);
-  if (ok && !prop.changed_mem_p () && !use_insn->is_asm ())
-    if (rtx use_set = single_set (use_rtl))
-      {
-       bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (use_rtl));
-       temporarily_undo_changes (0);
-       auto old_cost = set_src_cost (SET_SRC (use_set),
-                                     GET_MODE (SET_DEST (use_set)), speed);
-       redo_changes (0);
-       auto new_cost = set_src_cost (SET_SRC (use_set),
-                                     GET_MODE (SET_DEST (use_set)), speed);
-       if (new_cost > old_cost
-           || (new_cost == old_cost && !prop.likely_profitable_p ()))
-         {
-           if (dump_file)
-             fprintf (dump_file, "change not profitable"
-                      " (cost %d -> cost %d)\n", old_cost, new_cost);
-           ok = false;
-         }
-      }
+  if (ok
+      && !prop.changed_mem_p ()
+      && !use_insn->is_asm ()
+      && !use_insn->is_debug_insn ())
+    {
+      bool strict_p = !prop.likely_profitable_p ();
+      if (!change_is_worthwhile (use_change, strict_p))
+       {
+         if (dump_file)
+           fprintf (dump_file, "change not profitable");
+         ok = false;
+       }
+    }
 
   if (!ok)
     {
index a6799e3f5e662be60b1002b9a86ff0a6231ae6b8..56370e40e01f0218083e111c1167483f9a8d33a6 100644 (file)
@@ -614,7 +614,11 @@ swap_change (int num)
   else
     std::swap (*changes[num].loc, changes[num].old);
   if (changes[num].object && !MEM_P (changes[num].object))
-    std::swap (INSN_CODE (changes[num].object), changes[num].old_code);
+    {
+      std::swap (INSN_CODE (changes[num].object), changes[num].old_code);
+      if (recog_data.insn == changes[num].object)
+       recog_data.insn = nullptr;
+    }
 }
 
 /* Temporarily undo all the changes numbered NUM and up, with a view
index 3101f2dc4fc1611bf820f170f7095f547f13f176..bc80d7da8296c75aacb07f10fedfbe870ac224bb 100644 (file)
@@ -190,6 +190,14 @@ rtl_ssa::changes_are_worthwhile (array_slice<insn_change *const> changes,
          && INSN_CODE (change->rtl ()) != NOOP_MOVE_INSN_CODE)
        {
          change->new_cost = insn_cost (change->rtl (), for_speed);
+         /* If the cost is unknown, replacement is not worthwhile.  */
+         if (!change->new_cost)
+           {
+             if (dump_file && (dump_flags & TDF_DETAILS))
+               fprintf (dump_file,
+                        "Reject replacement due to unknown insn cost.\n");
+             return false;
+           }
          new_cost += change->new_cost;
          if (for_speed)
            weighted_new_cost += (cfg_bb->count.to_sreal_scale (entry_count)