我从https://kernelnewbies.org/FAQ/LikelyUnlikely举了下面的例子
#include <stdio.h>
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
int main(char *argv[], int argc)
{
int a;
/* Get the value from somewhere GCC can't optimize */
a = atoi (argv[1]);
if (likely (a == 2))
a++;
else
a--;
printf ("%d\n", a);
return 0;
}
并用.https://godbolt.org/z/IC0aifarm gcc 8.2 compiler
编译它
在原始链接中,他们已经针对 X86 对其进行了测试,如果likely
(在上面代码中的 if 条件中)替换为,则汇编输出不同unlikely
,这表明编译器对分支预测进行了优化。
但是当我为 ARM (arm-gcc -O2) 编译上述代码时,我看不出汇编代码有什么不同。以下是两种情况下 ARM 程序集的输出 -likely
和unlikely
main:
push {r4, lr}
ldr r0, [r0, #4]
bl atoi
cmp r0, #2
subne r1, r0, #1
moveq r1, #3
ldr r0, .L6
bl printf
mov r0, #0
pop {r4, pc}
.L6:
.word .LC0
.LC0:
.ascii "%d\012\000"
为什么编译器不针对 ARM 的情况下的分支预测进行优化?