https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105799

            Bug ID: 105799
           Summary: Miss optimization to simplify (v + A) * B + C in rtl.
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: crazylht at gmail dot com
  Target Milestone: ---

This case is from pr53533

int foo (int a)
{
  int tmp = a + 12345;
  tmp *= 914237;
  tmp += 12332;
  tmp *= 914237;
  tmp += 12332;
  tmp *= 914237;
  tmp -= 13;
  tmp *= 8000;
  return tmp;
}

with -O2, gcc generates

        add     edi, 12345
        imul    edi, edi, -1564285888
        lea     eax, [rdi-333519936]

llvm generates:

        imul    eax, edi, -1564285888
        add     eax, -1269844480

It looks like rtl simplifies (v * A + B ) * C -> AC * v + BC
but not (v + A) * B + C -> B * v + ABC.

Reply via email to