[llvm-dev] Ignored branch predictor hints

Dávid Bolvanský via llvm-dev
Wed, 09 May 2018 18:48:53 -0000

Thanks, interesting.

But a fix needs to be made since branch predictor hints are broken in a
valid C++20 code:
https://godbolt.org/g/dpSDqd

Dňa st 9. 5. 2018, 20:40 David Zarzycki <dave at znu.io> napísal(a):

> 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
>
> 2018-05-09 20:33 GMT+02:00 Dávid Bolvanský <david.bolvansky at
gmail.com>:
>
>> I did
>>
>> https://bugs.llvm.org/show_bug.cgi?id=37368
>>
>> 2018-05-09 20:29 GMT+02:00 David Zarzycki <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
>>>
>>>
>>> On May 9, 2018, at 1:57 PM, Dávid Bolvanský via llvm-dev <
>>> 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
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> 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/e33d8486/attachment-0001.html>