https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108446
Bug ID: 108446 Summary: GCC fails to elide udiv/msub when doing modulus by select of constants Product: gcc Version: unknown Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: ktkachov at gcc dot gnu.org Target Milestone: --- unsigned foo(int vl, unsigned len) { unsigned pad = vl <= 256 ? 128 : 256; return len % pad; } At -O2 aarch64 gcc generates: foo: cmp w0, 256 mov w2, 256 mov w0, 128 csel w2, w2, w0, gt udiv w0, w1, w2 msub w0, w0, w2, w1 ret clang, for example can generate the cheaper: foo: // @foo cmp w0, #256 mov w8, #127 mov w9, #255 csel w8, w9, w8, gt and w0, w8, w1 ret Similar situation on x86. I suppose this could be a match.pd fix or otherwise something during expand-time?