https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98028
Bug ID: 98028 Summary: __builtin_sub_overflow_p not folded to const when some constraints are known Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: denis.campredon at gmail dot com Target Milestone: --- According to godbolt, f1 used to be optimised with gcc 7. The same problem can be seen with signed types (and maybe more conditions?). All the following functions should be only one instruction plus ret with O2 ----------------- unsigned f1(unsigned i, unsigned j) { if (j != i) __builtin_unreachable(); return __builtin_sub_overflow_p(i, j, (unsigned)0); } unsigned f2(unsigned i, unsigned j) { if (j > i) __builtin_unreachable(); return __builtin_sub_overflow_p(i, j, (unsigned)0); } unsigned f3(unsigned i, unsigned j) { if (j >= i) __builtin_unreachable(); return __builtin_sub_overflow_p(i, j, (unsigned)0); } unsigned f4(unsigned i, unsigned j) { if (j < i) __builtin_unreachable(); return __builtin_sub_overflow_p(i, j, (unsigned)0); } -----------------