簡體   English   中英

gcc __builtin_expect 似乎沒有生成正確的代碼

[英]gcc __builtin_expect doesn't seem to generate a correct code

以下兩個代碼片段生成完全相同的匯編代碼,即使分支包含不同的分支預測。

假設我們有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 box(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"

如果有人可以解釋這一點,那將是一個很大的幫助。 提前感謝您的幫助!

您發布的兩個文件是相同的——我認為這不是您真正做過的。

-O2或更高版本編譯,需要開啟優化。 這應該會生成不同的代碼。

我在 ARM7 (Allwinner sun71 A20) 和 gcc 6.3 (-O3) 上做了一些測量,#likely 和 #unlikely 之間沒有性能差異,盡管從其他測試中可以明顯看出采用分支比不采用更昂貴它,即使在完美的分支預測的情況下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM