[llvm-dev] Ignored branch predictor hints

David Zarzycki via llvm-dev llvm-dev at lists.llvm.org
Wed May 9 11:40:10 PDT 2018


Hi Dávid,

Looks like you can defeat the switch conversion by adding a dummy asm(“”):

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

// switch like
char * b(int e) {
    if (likely(e == 0))
        return "0";
    asm("");
    if (e == 1)
        return "1";
    else return "f";
}

Dave

> On May 9, 2018, at 2:33 PM, Dávid Bolvanský via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> I did 
> https://bugs.llvm.org/show_bug.cgi?id=37368 <https://bugs.llvm.org/show_bug.cgi?id=37368>
> 
> 2018-05-09 20:33 GMT+02:00 Dávid Bolvanský <david.bolvansky at gmail.com <mailto:david.bolvansky at gmail.com>>:
> I did 
> 
> https://bugs.llvm.org/show_bug.cgi?id=37368 <https://bugs.llvm.org/show_bug.cgi?id=37368>
> 
> 2018-05-09 20:29 GMT+02:00 David Zarzycki <dave at znu.io <mailto:dave at znu.io>>:
> I’d wager that the if-else chain is being converted to a "switch statement” during an optimization pass and the __builtin_expect() hint is lost. Can you file a bug? https://bugs.llvm.org <https://bugs.llvm.org/>
> 
> 
>> On May 9, 2018, at 1:57 PM, Dávid Bolvanský via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>> 
>> Hello,
>> #define likely(x)       __builtin_expect((x),1)
>> 
>> // switch like
>> char * b(int e) {
>>     if (likely(e == 0))
>>         return "0";
>>     else if (e == 1)
>>         return "1";
>>     else return "f";
>> }
>> GCC correctly prefers the first case:
>> b(int):
>>   mov eax, OFFSET FLAT:.LC0
>>   test edi, edi
>>   jne .L7
>>   ret
>> 
>> But Clang seems to ignore _builtin_expect hints in this case.
>> b(int): # @b(int)
>>   cmp edi, 1
>>   mov eax, offset .L.str.1
>>   mov ecx, offset .L.str.2
>>   cmove rcx, rax
>>   test edi, edi
>>   mov eax, offset .L.str
>>   cmovne rax, rcx
>>   ret
>> https://godbolt.org/g/tuAVT7 <https://godbolt.org/g/tuAVT7>_______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
> 
> 
> 
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180509/9c99036c/attachment.html>


More information about the llvm-dev mailing list