optimize small_vector::clear
Summary:
clang fails to optimize the current version even in the opt mode
code:
```
void clear(folly::small_vector<int, 5>& vec) {
vec.clear();
}
```
before:
cat_huh
```
0000000000000000 <clear(folly::small_vector<int, 5ul, void, void, void>&)>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 41 57 push %r15
6: 41 56 push %r14
8: 53 push %rbx
9: 50 push %rax
a: 49 89 fe mov %rdi,%r14
d: 48 8b 07 mov (%rdi),%rax
10: 48 8d 4f 08 lea 0x8(%rdi),%rcx
14: 48 85 c0 test %rax,%rax
17: 78 5a js 73 <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x73>
19: 48 89 cf mov %rcx,%rdi
1c: 49 bf ff ff ff ff ff movabs $0x7fffffffffffffff,%r15
23: ff ff 7f
26: 48 89 c3 mov %rax,%rbx
29: 4c 21 fb and %r15,%rbx
2c: 74 3a je 68 <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x68>
2e: 48 8d 34 9f lea (%rdi,%rbx,4),%rsi
32: 48 85 c0 test %rax,%rax
35: 78 53 js 8a <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x8a>
37: 48 8d 14 99 lea (%rcx,%rbx,4),%rdx
3b: 48 89 d9 mov %rbx,%rcx
3e: 48 29 f2 sub %rsi,%rdx
41: 74 0e je 51 <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x51>
43: e8 00 00 00 00 callq 48 <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x48>
48: 49 8b 06 mov (%r14),%rax
4b: 48 89 c1 mov %rax,%rcx
4e: 4c 21 f9 and %r15,%rcx
51: 48 c1 e3 02 shl $0x2,%rbx
55: 48 c1 fb 02 sar $0x2,%rbx
59: 48 29 d9 sub %rbx,%rcx
5c: 49 ff c7 inc %r15
5f: 49 21 c7 and %rax,%r15
62: 49 09 cf or %rcx,%r15
65: 4d 89 3e mov %r15,(%r14)
68: 48 83 c4 08 add $0x8,%rsp
6c: 5b pop %rbx
6d: 41 5e pop %r14
6f: 41 5f pop %r15
71: 5d pop %rbp
72: c3 retq
73: 48 8b 39 mov (%rcx),%rdi
76: 49 bf ff ff ff ff ff movabs $0x7fffffffffffffff,%r15
7d: ff ff 7f
80: 48 89 c3 mov %rax,%rbx
83: 4c 21 fb and %r15,%rbx
86: 75 a6 jne 2e <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x2e>
88: eb de jmp 68 <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x68>
8a: 48 8b 09 mov (%rcx),%rcx
8d: 48 8d 14 99 lea (%rcx,%rbx,4),%rdx
91: 48 89 d9 mov %rbx,%rcx
94: 48 29 f2 sub %rsi,%rdx
97: 75 aa jne 43 <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x43>
99: eb b6 jmp 51 <clear(folly::small_vector<int, 5ul, void, void, void>&)+0x51>
```
after (much better but still 3 instructions too many):
```
0000000000000000 <clear(folly::small_vector<int, 5ul, void, void, void>&)>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 b8 00 00 00 00 00 movabs $0x8000000000000000,%rax
b: 00 00 80
e: 48 21 07 and %rax,(%rdi)
11: 5d pop %rbp
12: c3 retq
```
Reviewed By: ot, philippv, luciang
Differential Revision: D19890921
fbshipit-source-id: 62f1b5325b4deda95976894b476849b5098fad4f
Showing
Please register or sign in to comment