Issue 167397
Summary [clang] `memcmp`-like function with pointer parameters and written as a for loop never transformed into `memcmp`
Labels clang
Assignees
Reporter davidstone
    Given the following code

```c++
auto equal(
	int const * const lhs,
	int const * const rhs
) -> bool {
	for (int n = 0; n != 10; ++n) {
		if (lhs[n] != rhs[n]) {
			return false;
		}
	}
	return true;
}
```

I would expect something like a call to `memcmp` for sufficiently large size. Instead, at `-O3` it follows this pattern for 2 <= size <= 59:

```asm
equal(int const*, int const*):
        mov     eax, dword ptr [rdi]
        cmp     eax, dword ptr [rsi]
        jne .LBB0_10
        mov     eax, dword ptr [rdi + 4]
        cmp     eax, dword ptr [rsi + 4]
        jne     .LBB0_10
        mov     eax, dword ptr [rdi + 8]
        cmp     eax, dword ptr [rsi + 8]
        jne .LBB0_10
        mov     eax, dword ptr [rdi + 12]
        cmp     eax, dword ptr [rsi + 12]
        jne     .LBB0_10
        mov     eax, dword ptr [rdi + 16]
        cmp     eax, dword ptr [rsi + 16]
        jne .LBB0_10
        mov     eax, dword ptr [rdi + 20]
        cmp     eax, dword ptr [rsi + 20]
        jne     .LBB0_10
        mov     eax, dword ptr [rdi + 24]
        cmp     eax, dword ptr [rsi + 24]
        jne .LBB0_10
        mov     eax, dword ptr [rdi + 28]
        cmp     eax, dword ptr [rsi + 28]
        jne     .LBB0_10
        mov     eax, dword ptr [rdi + 32]
        cmp     eax, dword ptr [rsi + 32]
        jne .LBB0_10
        mov     eax, dword ptr [rdi + 36]
        cmp     eax, dword ptr [rsi + 36]
        sete    al
        ret
.LBB0_10:
        xor eax, eax
        ret
```

And then for size >= 60 it does (with the constant adjusted appropriately)

```asm
equal(int const*, int const*):
 xor     eax, eax
.LBB0_1:
        mov     ecx, dword ptr [rdi + 4*rax]
        mov     edx, dword ptr [rsi + 4*rax]
        cmp     ecx, edx
        jne     .LBB0_3
        cmp     rax, 59
        lea     rax, [rax + 1]
        jne     .LBB0_1
.LBB0_3:
        cmp     ecx, edx
 sete    al
        ret
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to