https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104610
--- Comment #2 from Hongtao.liu <crazylht at gmail dot com> --- in Gimple, there're _1 = __builtin_memcmp_eq (a_5(D), &t[0], 32); _2 = _1 == 0; _6 = (int) _2; So it's related to codegen optimization with vectorized codes for __builtin_memcmp_eq, guess we can start with size multiple of 16 bytes? also i saw when size is 9, llvm generates f(char*): # @f(char*) movabs rcx, 3979270244072042800 xor rcx, qword ptr [rdi] movzx edx, byte ptr [rdi + 8] xor eax, eax or rdx, rcx setne al ret while gcc f(char*): movabsq $3979270244072042800, %rax cmpq %rax, (%rdi) je .L5 .L2: movl $1, %eax ret .L5: cmpb $0, 8(%rdi) jne .L2 xorl %eax, %eax ret