https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90088
--- Comment #4 from Hongtao.liu <crazylht at gmail dot com> ---
(In reply to Richard Biener from comment #3)
> We have two related tunables, X86_TUNE_OPT_AGU and
> X86_TUNE_AVOID_LEA_FOR_ADDR.
>
> Probably related is that most uarchs have extra cost for complex addressing
> modes for moves (extra uop to generate the addres). But I wasn't aware
> that there's extra costs for the AGU op itself.
Yes, m_SANDYBRIDGE is not in X86_TUNE_OPT_AGU and X86_TUNE_AVOID_LEA_FOR_ADDR.
But when I try
gcc -O2 test.c -S -mtune=bonnell
It fails to avoid LEAL instruction, since m_BONNELL is in both tunables,
I believe there's other places need to be handled such as
/* Return true if usage of lea INSN has performance advantage
over a sequence of instructions. Instructions sequence has
SPLIT_COST cycles higher latency than lea latency. */
static bool
ix86_lea_outperforms (rtx_insn *insn, unsigned int regno0, unsigned int regno1,
unsigned int regno2, int split_cost, bool has_scale)
{
int dist_define, dist_use;