https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115040
Bug ID: 115040 Summary: Missed optimization opportunity in std::find Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: hiraditya at msn dot com Target Milestone: --- https://gcc.godbolt.org/z/s3hv15935 ``` #include <algorithm> #include <vector> #include <cstdint> bool find_epi8(const std::vector<int8_t>& v) { return std::find(v.begin(), v.end(), 42) != v.end(); } bool find_epi32(const std::vector<int32_t>& v) { return std::find(v.begin(), v.end(), 42) != v.end(); } ``` $ gcc -O3 -ftree-vectorize -march=pantherlake ``` find_epi8(std::vector<signed char, std::allocator<signed char> > const&): mov rcx, QWORD PTR [rdi+8] mov rdx, QWORD PTR [rdi] mov rsi, rcx sub rsi, rdx mov rax, rsi sar rax, 2 test rax, rax jle .L2 lea rax, [rdx+rax*4] jmp .L8 .L3: cmp BYTE PTR [rdx+1], 42 je .L23 cmp BYTE PTR [rdx+2], 42 je .L24 cmp BYTE PTR [rdx+3], 42 je .L25 add rdx, 4 cmp rdx, rax je .L26 .L8: cmp BYTE PTR [rdx], 42 jne .L3 .L21: cmp rcx, rdx setne al ret .L26: mov rsi, rcx sub rsi, rdx .L2: cmp rsi, 2 je .L9 cmp rsi, 3 je .L10 cmp rsi, 1 je .L11 xor eax, eax ret .L10: cmp BYTE PTR [rdx], 42 je .L21 add rdx, 1 .L9: cmp BYTE PTR [rdx], 42 je .L21 add rdx, 1 .L11: cmp BYTE PTR [rdx], 42 sete al cmp rcx, rdx setne dl and eax, edx ret .L23: add rdx, 1 cmp rcx, rdx setne al ret .L24: add rdx, 2 cmp rcx, rdx setne al ret .L25: add rdx, 3 cmp rcx, rdx setne al ret find_epi32(std::vector<int, std::allocator<int> > const&): mov rcx, QWORD PTR [rdi+8] mov rdx, QWORD PTR [rdi] mov rax, rcx sub rax, rdx mov rsi, rax sar rax, 4 sar rsi, 2 test rax, rax jle .L28 sal rax, 4 add rax, rdx jmp .L34 .L29: cmp DWORD PTR [rdx+4], 42 je .L48 cmp DWORD PTR [rdx+8], 42 je .L49 cmp DWORD PTR [rdx+12], 42 je .L50 add rdx, 16 cmp rdx, rax je .L51 .L34: cmp DWORD PTR [rdx], 42 jne .L29 .L47: cmp rcx, rdx setne al ret .L51: mov rsi, rcx sub rsi, rdx sar rsi, 2 .L28: cmp rsi, 2 je .L35 cmp rsi, 3 je .L36 cmp rsi, 1 je .L37 xor eax, eax ret .L36: cmp DWORD PTR [rdx], 42 je .L47 add rdx, 4 .L35: cmp DWORD PTR [rdx], 42 je .L47 add rdx, 4 .L37: cmp DWORD PTR [rdx], 42 sete al cmp rcx, rdx setne dl and eax, edx ret .L48: add rdx, 4 cmp rcx, rdx setne al ret .L49: add rdx, 8 cmp rcx, rdx setne al ret .L50: add rdx, 12 cmp rcx, rdx setne al ret ``` clang lowers both the calls to (w)memchr --- Comment #1 from Sam James <sjames at gcc dot gnu.org> --- *** Bug 115041 has been marked as a duplicate of this bug. ***