Почему вероятные и маловероятные макросы не влияют на код сборки ARM? - PullRequest
1 голос
/ 01 июня 2019

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

1 Ответ

1 голос
/ 01 июня 2019

Как сказал @rici, ваш код достаточно прост, чтобы его можно было реализовать с помощью условных инструкций. Вы можете увидеть разницу, например, если вы вызываете функции, которые реализованы в другом модуле компиляции:

#define likely(x)    __builtin_expect(!!(x), 1)
#define unlikely(x)  __builtin_expect(!!(x), 0)

// only forward declarations:
void foo();
void bar();

int main(char *argv[], int argc)
{
   if (likely (argc == 2))
      foo();
   else
      bar();
}

Изменение likely на unlikely переключает порядок ветвей if и else для ARM и x86: https://godbolt.org/z/UDzvf0. Если это действительно имеет значение, вероятно, зависит от используемого оборудования Если вы вызываете функцию в первый раз (в противном случае внутреннее предсказание ветвления ЦП, вероятно, оказывает более сильное влияние, чем порядок команд), и, вероятно, на многие другие вещи.

...