Eric Fiselier
78153b3a97
Optimize operator=(const basic_string&) for tail call.
Patch by Martijn Vels (mvels@google.com)
Reviewed as https://reviews.llvm.org/D68276
This is a non trivial win for externally templated assignment operator.
x86 without tail call (current libc++)
0000000000000000 <std::string::operator=(std::string const&)>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 53 push %rbx
5: 50 push %rax
6: 48 89 fb mov %rdi,%rbx
9: 48 39 f7 cmp %rsi,%rdi
c: 74 17 je 25 <std::string::operator=(std::string const&)+0x25>
e: 0f b6 56 17 movzbl 0x17(%rsi),%edx
12: 84 d2 test %dl,%dl
14: 79 07 jns 1d <std::string::operator=(std::string const&)+0x1d>
16: 48 8b 56 08 mov 0x8(%rsi),%rdx
1a: 48 8b 36 mov (%rsi),%rsi
1d: 48 89 df mov %rbx,%rdi
20: e8 00 00 00 00 callq 25 <std::string::operator=(std::string const&)+0x25>
25: 48 89 d8 mov %rbx,%rax
28: 48 83 c4 08 add $0x8,%rsp
2c: 5b pop %rbx
2d: 5d pop %rbp
2e: c3 retq
After:
0000000000000000 <std::string::operator=(std::string const&)>:
0: 48 39 f7 cmp %rsi,%rdi
3: 74 14 je 19 <std::string::operator=(std::string const&)+0x19>
5: 0f b6 56 17 movzbl 0x17(%rsi),%edx
9: 84 d2 test %dl,%dl
b: 79 07 jns 14 <std::string::operator=(std::string const&)+0x14>
d: 48 8b 56 08 mov 0x8(%rsi),%rdx
11: 48 8b 36 mov (%rsi),%rsi
14: e9 00 00 00 00 jmpq 19 <std::string::operator=(std::string const&)+0x19>
19: 48 89 f8 mov %rdi,%rax
1c: c3 retq
Benchmark (pending per https://reviews.llvm.org/D67667)
```
BM_StringAssignStr_Empty_Opaque 6.23ns ± 0% 5.19ns ± 0% -16.70% (p=0.016 n=5+4)
BM_StringAssignStr_Empty_Transparent 5.86ns ± 0% 5.14ns ± 0% -12.24% (p=0.008 n=5+5)
BM_StringAssignStr_Small_Opaque 8.79ns ± 1% 7.69ns ± 0% -12.53% (p=0.008 n=5+5)
BM_StringAssignStr_Small_Transparent 9.44ns ± 0% 8.00ns ± 0% -15.26% (p=0.008 n=5+5)
BM_StringAssignStr_Large_Opaque 25.2ns ± 0% 24.3ns ± 0% -3.50% (p=0.008 n=5+5)
BM_StringAssignStr_Large_Transparent 23.6ns ± 0% 22.5ns ± 0% -4.76% (p=0.008 n=5+5)
BM_StringAssignStr_Huge_Opaque 319ns ± 5% 317ns ± 5% ~ (p=0.690 n=5+5)
BM_StringAssignStr_Huge_Transparent 319ns ± 5% 317ns ± 5% ~ (p=0.421 n=5+5)
BM_StringAssignAsciiz_Empty_Opaque 7.41ns ± 0% 7.77ns ± 0% +4.89% (p=0.008 n=5+5)
BM_StringAssignAsciiz_Empty_Transparent 7.54ns ± 3% 7.30ns ± 0% -3.24% (p=0.008 n=5+5)
BM_StringAssignAsciiz_Small_Opaque 9.87ns ± 0% 10.24ns ± 1% +3.76% (p=0.008 n=5+5)
BM_StringAssignAsciiz_Small_Transparent 10.4ns ± 1% 9.8ns ± 2% -5.78% (p=0.008 n=5+5)
BM_StringAssignAsciiz_Large_Opaque 30.1ns ± 0% 30.1ns ± 0% ~ (p=0.167 n=5+5)
BM_StringAssignAsciiz_Large_Transparent 27.1ns ± 0% 27.4ns ± 0% +0.92% (p=0.016 n=4+5)
BM_StringAssignAsciiz_Huge_Opaque 383ns ± 4% 382ns ± 4% ~ (p=0.548 n=5+5)
BM_StringAssignAsciiz_Huge_Transparent 375ns ± 0% 380ns ± 0% +1.37% (p=0.029 n=4+4)
BM_StringAssignAsciizMix_Opaque 14.0ns ± 0% 14.0ns ± 0% ~ (p=0.881 n=5+5)
BM_StringAssignAsciizMix_Transparent 13.7ns ± 1% 13.8ns ± 0% ~ (p=0.056 n=5+5)
```
llvm-svn: 374137
2019-10-09 03:07:02 +00:00
..
2019-09-26 11:12:29 +00:00
2019-08-01 19:48:29 +00:00
2019-03-11 15:41:51 +00:00
2019-07-12 01:01:55 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-09-18 18:13:32 +00:00
2019-08-05 18:29:14 +00:00
2019-03-18 21:50:12 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-09-26 14:51:10 +00:00
2019-01-19 10:56:40 +00:00
2019-07-12 01:01:55 +00:00
2019-07-18 11:51:05 +00:00
2019-08-20 10:19:55 +00:00
2019-09-26 14:51:10 +00:00
2019-04-24 09:43:44 +00:00
2019-01-19 10:56:40 +00:00
2019-08-12 07:51:05 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-09-14 19:55:28 +00:00
2019-08-21 15:38:24 +00:00
2019-07-11 23:13:38 +00:00
2019-09-30 20:55:30 +00:00
2019-01-19 08:50:56 +00:00
2019-08-20 22:23:35 +00:00
2019-06-19 16:33:28 +00:00
2019-04-01 16:39:34 +00:00
2019-09-04 12:44:19 +00:00
2019-07-23 04:20:19 +00:00
2019-07-01 19:59:34 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-06-13 22:27:24 +00:00
2019-09-23 06:16:41 +00:00
2019-01-19 08:50:56 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-08-05 18:29:14 +00:00
2019-10-01 12:12:21 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-05-29 16:01:36 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-09-07 22:18:20 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 08:50:56 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-08-12 07:51:05 +00:00
2019-01-19 10:56:40 +00:00
2019-06-21 15:20:55 +00:00
2019-08-06 21:11:24 +00:00
2019-03-29 16:03:57 +00:00
2019-08-13 15:02:53 +00:00
2019-01-19 10:56:40 +00:00
2019-07-08 03:45:28 +00:00
2019-09-16 19:26:41 +00:00
2019-08-04 07:13:43 +00:00
2019-06-21 13:56:13 +00:00
2019-05-29 16:01:36 +00:00
2019-06-20 15:36:32 +00:00
2019-05-29 16:01:36 +00:00
2019-05-29 16:01:36 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-08-20 18:21:06 +00:00
2019-08-04 07:13:43 +00:00
2019-07-01 16:13:31 +00:00
2019-01-19 10:56:40 +00:00
2019-07-08 03:45:28 +00:00
2019-05-29 16:01:36 +00:00
2019-01-19 10:56:40 +00:00
2019-07-19 17:13:39 +00:00
2019-09-04 13:35:03 +00:00
2019-10-07 21:41:15 +00:00
2019-08-05 18:29:14 +00:00
2019-09-26 14:51:10 +00:00
2019-09-26 14:51:10 +00:00
2019-08-06 21:11:24 +00:00
2019-06-27 18:40:55 +00:00
2019-09-25 18:56:54 +00:00
2019-05-29 16:01:36 +00:00
2019-08-20 15:39:20 +00:00
2019-01-19 10:56:40 +00:00
2019-09-25 16:40:30 +00:00
2019-01-19 10:56:40 +00:00
2019-07-19 17:13:39 +00:00
2019-01-19 10:56:40 +00:00
2019-08-04 07:13:43 +00:00
2019-04-01 16:39:34 +00:00
2019-02-01 21:59:27 +00:00
2019-05-29 16:01:36 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-03-06 20:31:57 +00:00
2019-06-20 15:36:32 +00:00
2019-01-19 10:56:40 +00:00
2019-04-23 18:01:58 +00:00
2019-01-19 10:56:40 +00:00
2019-10-09 03:07:02 +00:00
2019-09-25 18:56:54 +00:00
2019-01-19 08:50:56 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00
2019-08-14 16:21:27 +00:00
2019-09-30 20:55:30 +00:00
2019-09-26 14:51:10 +00:00
2019-01-19 10:56:40 +00:00
2019-05-29 02:38:19 +00:00
2019-07-16 03:21:01 +00:00
2019-07-16 03:21:01 +00:00
2019-09-30 20:55:30 +00:00
2019-04-25 21:31:58 +00:00
2019-07-14 21:29:39 +00:00
2019-09-13 16:09:33 +00:00
2019-05-23 23:46:44 +00:00
2019-01-19 10:56:40 +00:00
2019-01-19 10:56:40 +00:00