https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105776
Bug ID: 105776 Summary: Failure to recognize __builtin_mul_overflow pattern Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: gabravier at gmail dot com Target Milestone: --- int f4(unsigned x, unsigned y) { if (x == 0) return 1; return ((int)(x * y) / (int)x) == y; } can be optimized to int f4(unsigned x, unsigned y) { int z; return !__builtin_mul_overflow((int)x, (int)y, &z); } This transformation is done by LLVM, but not by GCC. Note that this derivates from another function written as such: int f3 (unsigned x, unsigned y) { unsigned int r = x * y; return !x || ((int) r / (int) x) == (int) y; } which does optimize correctly on x86 but not on aarch64 (where it generates tree-optimized GIMPLE corresponding to the code above)