https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117323
Bug ID: 117323 Summary: GCC failed to optimize value / 128 to value >> 7 when the range of value must be positive Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: liuhongt at gcc dot gnu.org Target Milestone: --- #include <algorithm> void foo (short* p1, short* p2, char* __restrict p3, int n) { for (int i = 0; i != n; i++) { short sum0 = p1[i]; short sum1 = p2[i]; sum0 = std::max<int>(0, std::min<int>(127, sum0)); sum1 = std::max<int>(0, std::min<int>(127, sum1)); p3[i] = static_cast<char>(sum0 * sum1 / 128); } } here, sum0/sum1 is in [0, 127], and sum0 * sum1 / 128 is equal to sum0 * sum1 >> 7, but gcc still generates comparison code against zero to handle / 128. similar for other div_pow2 cases.