[libcxx-commits] [PATCH] D59999: Allow the compiler to optimize `string == "literal string"`.
Samuel Benzaquen via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Mon May 6 08:24:27 PDT 2019
sbenza added a comment.
As an example of code reduction.
`str == ""`:
Before the change
Dump of assembler code for function StringEqCStrLiteralEmpty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&):
0x0000000000407a10 <+0>: push %rax
0x0000000000407a11 <+1>: movzbl (%rdi),%eax
0x0000000000407a14 <+4>: test $0x1,%al
0x0000000000407a16 <+6>: je 0x407a25 <StringEqCStrLiteralEmpty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+21>
0x0000000000407a18 <+8>: mov 0x8(%rdi),%rax
0x0000000000407a1c <+12>: test %rax,%rax
0x0000000000407a1f <+15>: je 0x407a2d <StringEqCStrLiteralEmpty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+29>
0x0000000000407a21 <+17>: xor %eax,%eax
0x0000000000407a23 <+19>: pop %rcx
0x0000000000407a24 <+20>: retq
0x0000000000407a25 <+21>: shr %rax
0x0000000000407a28 <+24>: test %rax,%rax
0x0000000000407a2b <+27>: jne 0x407a21 <StringEqCStrLiteralEmpty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+17>
0x0000000000407a2d <+29>: lea 0x791ab(%rip),%rcx # 0x480bdf
0x0000000000407a34 <+36>: xor %esi,%esi
0x0000000000407a36 <+38>: mov $0xffffffffffffffff,%rdx
0x0000000000407a3d <+45>: xor %r8d,%r8d
0x0000000000407a40 <+48>: callq 0x405250 <_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm at plt>
0x0000000000407a45 <+53>: test %eax,%eax
0x0000000000407a47 <+55>: sete %al
0x0000000000407a4a <+58>: pop %rcx
0x0000000000407a4b <+59>: retq
0x0000000000407a4c <+60>: mov %rax,%rdi
0x0000000000407a4f <+63>: callq 0x408000 <__clang_call_terminate>
End of assembler dump.
After the change
Dump of assembler code for function StringEqCStrLiteralEmpty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&):
0x0000000000407a10 <+0>: movzbl (%rdi),%eax
0x0000000000407a13 <+3>: test $0x1,%al
0x0000000000407a15 <+5>: je 0x407a1d <StringEqCStrLiteralEmpty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+13>
0x0000000000407a17 <+7>: mov 0x8(%rdi),%rax
0x0000000000407a1b <+11>: jmp 0x407a20 <StringEqCStrLiteralEmpty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+16>
0x0000000000407a1d <+13>: shr %rax
0x0000000000407a20 <+16>: test %rax,%rax
0x0000000000407a23 <+19>: sete %al
0x0000000000407a26 <+22>: retq
End of assembler dump.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D59999/new/
https://reviews.llvm.org/D59999
More information about the libcxx-commits
mailing list