[cfe-dev] [libc++] inlining of char_trats<T>::eq() and friends wrt r217961
Dan Albert
danalbert at google.com
Thu Sep 18 12:49:21 PDT 2014
Following r217961, mclow asked me to verify that it didn't interfere too
badly with inlining of these calls on clang, and to send a summary here for
the record.
I used the following (trivial) test:
#include <string>
int main(int argc, char** argv) {
// Use values from argv to prevent the result from being
// constexpr evaluated.
if (std::char_traits<char>::eq(argv[1][0], argv[1][1])) {
return 0;
} else {
return 1;
}
}
Level 2 and 3 both inline the call, before and after r217961:
$ clang -O2 ...
$ objdump -d a.out
0000000000400670 <main>:
400670: 48 8b 46 08 mov rax,QWORD PTR [rsi+0x8]
400674: 0f b6 48 01 movzx ecx,BYTE PTR [rax+0x1]
400678: 0f b6 00 movzx eax,BYTE PTR [rax]
40067b: 39 c8 cmp eax,ecx
40067d: 0f 95 c0 setne al
400680: 0f b6 c0 movzx eax,al
400683: c3 ret
400684: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0]
40068b: 00 00 00
40068e: 66 90 xchg ax,ax
Before r217961, -O0 and -O1 both inline:
$ clang -O1 ...
$ objdump -d a.out
0000000000400670 <main>:
400670: 48 8b 46 08 mov rax,QWORD PTR [rsi+0x8]
400674: 0f b6 48 01 movzx ecx,BYTE PTR [rax+0x1]
400678: 0f b6 00 movzx eax,BYTE PTR [rax]
40067b: 39 c8 cmp eax,ecx
40067d: 0f 95 c0 setne al
400680: 0f b6 c0 movzx eax,al
400683: c3 ret
400684: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0]
40068b: 00 00 00
40068e: 66 90 xchg ax,ax
After r217961, neither -O0 nor -O1 inline:
$ clang -O1 ...
$ objdump -d a.out
...
4006bc: e8 0f 00 00 00 call 4006d0
<_ZNSt3__111char_traitsIcE2eqEcc>
...
Talked about this with mclow, and we're not worried about it, since it
still inlines for the optimized modes, and the patch does fix compatibility
with GCC.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140918/38d4a573/attachment.html>
More information about the cfe-dev
mailing list