David Zarzycki via llvm-dev
2018-May-09 18:40 UTC
[llvm-dev] Ignored branch predictor hints
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>
Dávid Bolvanský via llvm-dev
2018-May-09 18:48 UTC
[llvm-dev] Ignored branch predictor hints
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>
Tim Northover via llvm-dev
2018-May-09 19:02 UTC
[llvm-dev] Ignored branch predictor hints
On 9 May 2018 at 19:48, Dávid Bolvanský via llvm-dev <llvm-dev at lists.llvm.org> wrote:> But a fix needs to be made since branch predictor hints are broken in a > valid C++20 code:They don't affect performance in the expected way, but they also don't actually break code. I'm not saying it's not a bug, but it's certainly not on the same level as a miscompilation. Tim.