[llvm-dev] Ignored branch predictor hints
Dávid Bolvanský via llvm-dev
llvm-dev at lists.llvm.org
Wed May 9 11:48:53 PDT 2018
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>
More information about the llvm-dev
mailing list