2013-03-27 77 views
1

以下兩個代碼片段會生成完全相同的彙編代碼,即使分支包含在不同的分支預測中。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 32位,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" 

如果有人能解釋這一點,這將是一個很大的幫助。 感謝您的幫助!

回答

2

你發佈的兩個文件是相同的 - 我認爲這不是你真正做的。

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

+0

是的,你是對的!我還修復了代碼。非常感謝你的幫助! – kjee 2013-03-27 18:28:23

+1

@ user1036234 - 不客氣 – teppic 2013-03-27 18:42:37