https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87654
Bug ID: 87654 Summary: Information about constants from condition is not propagated Product: gcc Version: 9.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: antoshkka at gmail dot com Target Milestone: --- Consider the following example: unsigned align_func1(bool big, unsigned value) { const unsigned mx_ = (big ? 1 << 14 : 1 << 12); return value / mx_ * mx_; } It is equivalent to the following code: unsigned align_func2(bool big, unsigned value) { if (big) { const unsigned mx_ = 1 << 14; return value / mx_ * mx_; } const unsigned mx_ = 1 << 12; return value / mx_ * mx_; } Assembly for the align_func2 seems optimal: mov eax, esi and esi, -4096 and eax, -16384 test dil, dil cmove eax, esi ret While the assembly for the first function is far from optimal: align_func1(bool, unsigned int): cmp dil, 1 mov eax, esi sbb ecx, ecx xor edx, edx and ecx, -12288 add ecx, 16384 div ecx ; <=== too bad imul eax, ecx ret