[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