Hi, This patch replaces rtx_cost with insn_cost in forward propagation. In the PR, one constant vector should be propagated and replace a pseudo in a store insn if we know it's a duplicated constant vector. It reduces the insn cost but not rtx cost. In this case, the kind of destination operand (memory or pseudo) decides the cost and rtx cost can't reflect it.
The test case is added in the second target specific patch. Bootstrapped and tested on x86 and powerpc64-linux BE and LE with no regressions. Is it OK for next stage 1? Thanks Gui Haochen ChangeLog fwprop: Replace rtx_cost with insn_cost in try_fwprop_subst_pattern gcc/ PR target/113325 * fwprop.cc (try_fwprop_subst_pattern): Replace rtx_cost with insn_cost. patch.diff diff --git a/gcc/fwprop.cc b/gcc/fwprop.cc index 0707a234726..b05b2538edc 100644 --- a/gcc/fwprop.cc +++ b/gcc/fwprop.cc @@ -467,20 +467,17 @@ 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)) + if (single_set (use_rtl)) { bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (use_rtl)); + auto new_cost = insn_cost (use_rtl, speed); temporarily_undo_changes (0); - auto old_cost = set_src_cost (SET_SRC (use_set), - GET_MODE (SET_DEST (use_set)), speed); + /* Invalidate recog data. */ + INSN_CODE (use_rtl) = -1; + auto old_cost = insn_cost (use_rtl, 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) { if (dump_file)