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.