Вы писали:
if(__builtin_expect(bit >= 32),0)
{
...
}
Код внутри фигурных скобок не будет никогда выполняться, потому что он окружен if(foo,0)
, что эквивалентно if(0)
для любого значения foo
, независимо от того, какую встроенную функцию вы пытаетесь использовать. Если вы включите оптимизацию с помощью -O2
, вы увидите, что компилятор полностью удаляет мертвый код, а не просто перепрыгивает через него. Я думаю, что вы, вероятно, хотели написать
if (__builtin_expect(bit >= 32, 0)) {
bit -= 32;
}
Если я сделаю это, я получу именно ту ветвь, которую я ожидаю (с clang -O1
или выше).
extern void something();
int foo(int bit)
{
++bit;
if (__builtin_expect(bit >= 32, 0)) {
bit -= 32; // "Decrement"
something();
}
bit = bit*2;
something();
return bit;
}
Вот код из clang -arch armv7 -O2 -S
:
_foo:
@ BB#0:
push {r4, r7, lr}
adds r4, r0, #1
add r7, sp, #4
cmp r4, #32
bge LBB0_2 // a forward branch for the unlikely case
LBB0_1:
lsls r4, r4, #1
blx _something
mov r0, r4
pop {r4, r7, pc}
LBB0_2: // "Decrement"
sub.w r4, r0, #31
blx _something
b LBB0_1