https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81015

            Bug ID: 81015
           Summary: Bad codegen for __builtin_clz(unsigned short)
           Product: gcc
           Version: 7.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: m101010a at gmail dot com
  Target Milestone: ---

When compiling with "-O1 -mlzcnt", __builtin_clz applied to an unsigned short
generates the lzcntw instruction instead of lzcntl.  Given the following source
code:

int main()
{
    // volatile ensures the clz happens at runtime
    volatile unsigned short bits_ = 1;
    return __builtin_clz(bits_);
}

Compiling with no optimization produces a binary that correctly returns 31, as
does compiling it with gcc 6.3, but with gcc 7.1 and optimization the binary
returns 15 instead.  This happens for both 64-bit and 32-bit code, for both C
and C++, and for -O1, -O2, and -O3.

Reply via email to