Hi Richard,
Thanks for your comments.
在 2024/6/12 15:51, Richard Sandiford 写道:
> It should only be necessary to call change_is_worthwhile once,
> with strict == !prop.likely_profitable_p ()
>
> So something like:
>
> bool ok = recog (attempt, use_change);
> if (ok && !prop.changed_mem_p () && !use_insn->is_asm ())
> {
> 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;
> }
> }
I will modify the code. Thanks.
> The:
>
> bool ok = recog (attempt, use_change);
>
> should leave INSN_CODE set to the result of the successful recog.
> Why isn't that true in the example you hit?
>
> I wondered whether we might be trying to cost a NOOP_MOVE_INSN_CODE,
> since I couldn't see anything in the current code to stop that.
> But if so, that's a bug. NOOP_MOVE_INSN_CODE should have zero cost,
> and shouldn't go through insn_cost.
Yes, the recog sets the recog data for the new rtl. But
changes_are_worthwhile calls change->old_cost and finally calls
calculate_cost to get the insn cost for old rtl. The undo/redo_changes
don't restore/recover the recog_data, which causes insn_cost takes the
wrong number of operands (recog_data.n_operands) and wrong operands
(recog_data.operand[]). Note, rs6000_insn_cost checks if the recog data
is cached. If so, it doesn't recog the insn again.
void
insn_info::calculate_cost () const
{
basic_block cfg_bb = BLOCK_FOR_INSN (m_rtl);
temporarily_undo_changes (0);
m_cost_or_uid = insn_cost (m_rtl, optimize_bb_for_speed_p (cfg_bb));
redo_changes (0);
}
// A simple debug output for calculate_cost
before undo
INSN CODE 850
n_operands 3
after undo
INSN CODE 685
n_operands 3
Actually insn pattern 850 has 3 operands and insn pattern 685 has 2
operands.
IMHO, we should invalidate recog data after each undo/redo or before
calling the insn cost.
Looking forward to your advice.
Thanks
Gui Haochen