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

            Bug ID: 62262
           Summary: aarch64 gcc generates invalid assembler
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: carrot at google dot com
            Target: aarch64

Compile following source code with options -fprofile-use -O2


static inline int CLZ(int mask) {
   return mask ? __builtin_clz(mask) : 32;
}

int foo(int value)
{
    if (value == 0)
        return 0;

    int bias = CLZ(value);
    value >>= bias;
    int zeros = CLZ(value << 1);
    value <<= zeros;

    int packed = (unsigned)(value << 9) >> 9;
    return packed;
}

Without any actual profiling data, trunk gcc generates

/tmp/cctLq1F0.s: Assembler messages:
/tmp/cctLq1F0.s:20: Error: immediate value out of range 0 to 31 at operand 3 --
`ubfiz w0,w2,32,23'

The generated assembler code is:

foo:
    cbz    w0, .L4
    clz    w1, w0
    asr    w2, w0, w1
    adds    w0, w2, w2
    beq    .L3
    clz    w3, w0
    lsl    w4, w2, w3
    and    w0, w4, 8388607
    ret
.L3:
    ubfiz    w0, w2, 32, 23       // Wrong code
    ret
.L4:
    mov    w0, 0
    ret

4.9 gcc generates the same error.

Reply via email to