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.

Reply via email to