CPU_EMPTY() optimalization for _NCPUWORDS == 1 on clang
Svatopluk Kraus
skra at freebsd.org
Thu Dec 17 11:27:47 UTC 2015
Hi,
I got weird disassembled code for CPU_EMPTY() on arm where cpu bit
array is just one int. The C code was compiled by clang with -O2 flag.
I expanded the macro in dummy1() to show it more clearly. The dummy2()
shows expected disassembled code.
void
dummy1(uint32_t* bits)
{
size_t i;
for (i = 0; i < 1; i++)
if (bits[i])
break;
if (i == 1)
tlb_flush(0);
}
void
dummy2(uint32_t* bits)
{
size_t i;
for (i = 0; i < 1; i++)
if (bits[i])
return;
tlb_flush(0);
}
The dis-assembled code is the following:
c0556b50 <dummy1>:
c0556b50: e3a01000 mov r1, #0
c0556b54: e3510000 cmp r1, #0
c0556b58: 1a000004 bne c0556b70 <dummy1+0x20>
c0556b5c: e5902000 ldr r2, [r0]
c0556b60: e3a01001 mov r1, #1
c0556b64: e3520000 cmp r2, #0
c0556b68: 0afffff9 beq c0556b54 <dummy1+0x4>
c0556b6c: ea000005 b c0556b88 <dummy1+0x38>
c0556b70: e3510001 cmp r1, #1
c0556b74: 112fff1e bxne lr
c0556b78: e3a00000 mov r0, #0
c0556b7c: f57ff04f dsb sy
c0556b80: ee080f73 mcr 15, 0, r0, cr8, cr3, {3}
c0556b84: f57ff04f dsb sy
c0556b88: e12fff1e bx lr
c0556b8c <dummy2>:
c0556b8c: e5900000 ldr r0, [r0]
c0556b90: e3500000 cmp r0, #0
c0556b94: 112fff1e bxne lr
c0556b98: e3a00000 mov r0, #0
c0556b9c: f57ff04f dsb sy
c0556ba0: ee080f73 mcr 15, 0, r0, cr8, cr3, {3}
c0556ba4: f57ff04f dsb sy
c0556ba8: e12fff1e bx lr
I tried another thing:
void
dummy3(uint32_t* bits)
{
size_t i;
for (i = 0; i < 4; i++)
if (bits[i])
break;
if (i == 1)
tlb_flush(0);
}
and got
c0556bac <dummy3>:
c0556bac: e5901000 ldr r1, [r0]
c0556bb0: e3510000 cmp r1, #0
c0556bb4: 1a000006 bne c0556bd4 <dummy3+0x28>
c0556bb8: e5900004 ldr r0, [r0, #4]
c0556bbc: e3500000 cmp r0, #0
c0556bc0: 012fff1e bxeq lr
c0556bc4: e3a00000 mov r0, #0
c0556bc8: f57ff04f dsb sy
c0556bcc: ee080f73 mcr 15, 0, r0, cr8, cr3, {3}
c0556bd0: f57ff04f dsb sy
c0556bd4: e12fff1e bx lr
This looks well. So, IMO, there is some small bug in clang optimalization.
Svatopluk Kraus
More information about the freebsd-current
mailing list