Dávid Bolvanský via llvm-dev
2018-May-09 17:57 UTC
[llvm-dev] Ignored branch predictor hints
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 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180509/2e5eaa99/attachment.html>
David Zarzycki via llvm-dev
2018-May-09 18:29 UTC
[llvm-dev] Ignored branch predictor hints
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 <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-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180509/8eaed29c/attachment.html>
Dávid Bolvanský via llvm-dev
2018-May-09 18:33 UTC
[llvm-dev] Ignored branch predictor hints
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 >> >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180509/012baba4/attachment.html>
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>