Я взял приведенный ниже пример из 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/IC0aif с arm 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?