gcc __builtin_expect, похоже, не генерирует правильный код

Следующие два фрагмента кода создают точно такой же ассемблерный код, даже несмотря на то, что ветви заключены в разные прогнозы ветвлений.

Допустим, у нас есть test0.c

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

int bar0();
int bar1();
int bar2();
int bar3();

int foo(int arg0) {
  if (likely(arg0 > 100)) {
    return bar0();
  } else if (likely(arg0 < -100)) {
    return bar1();
  } else if (likely(arg0 > 0)) {
    return bar2();
  } else {
    return bar3();
  }
}

и test1.c

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

int bar0();
int bar1();
int bar2();
int bar3();

int foo(int arg0) {
  if (unlikely(arg0 > 100)) {
    return bar0();
  } else if (unlikely(arg0 < -100)) {
    return bar1();
  } else if (unlikely(arg0 > 0)) {
    return bar2();
  } else {
    return bar3();
  }
}

Как вы можете видеть, сравнивая два фрагмента, эти два имеют разные предсказания ветвления для каждой ветви (вероятно() против маловероятно()).

Однако, когда он скомпилирован из Linux-окна (ubuntu 12.04 32bit, gcc 4.6.3). Эти два источника дают практически одинаковый результат.

$gcc  -c -S -o test0.s test0.c
$gcc  -c -S -o test1.s test1.c
$ diff test0.s test1.s
1c1
<   .file   "test0.c"
---
>   .file   "test1.c"

Если кто-нибудь может объяснить это, это будет большая помощь. Заранее спасибо за помощь!


person kjee    schedule 27.03.2013    source источник


Ответы (2)


Два файла, которые вы разместили, идентичны - я предполагаю, что это не то, что вы действительно сделали.

Скомпилируйте с -O2 или выше, вам нужно включить оптимизацию. Затем это должно генерировать другой код.

person teppic    schedule 27.03.2013
comment
Да, ты прав! И я также исправил код. Большое спасибо за твою помощь! - person kjee; 27.03.2013

Я сделал некоторые измерения на ARM7 (Allwinner sun71 A20) и с gcc 6.3 (-O3), и не было никакой разницы в производительности между # вероятно и # маловероятно, хотя из других тестов было ясно, что брать ветку дороже, чем не брать. даже в случае идеального предсказания перехода.

person Bogi    schedule 02.07.2020