<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/56662>56662</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Extra stack save+restore with memset loop idiom transformation
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hiraditya
</td>
</tr>
</table>
<pre>
Test case:
```cpp
#include <stdio.h>
#include <string.h>
#include <array>
constexpr size_t N = 1120;
float buffer[N];
void zero_int_memset(int* buffer) {
memset(buffer, 0, N * sizeof(int) );
}
void zero_int_loop(int* buffer) {
for(int i = 0; i < N; ++i){
buffer[i] = 0;
}
}
```
$ clang -O2 -std=c++17
```
zero_int_memset(int*): # @zero_int_memset(int*)
mov edx, 4480
xor esi, esi
jmp memset@PLT # TAILCALL
zero_int_loop(int*): # @zero_int_loop(int*)
push rax
mov edx, 4480
xor esi, esi
call memset@PLT
pop rax
ret
buffer:
.zero 4480
```
https://godbolt.org/z/7T8T1hhTP
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVEtvozAQ_jXmYiUyBkI4cEibVlop6vaQe2XABHcNRrbJJv31O4YQmtfuZS3jB_ON55uHnanimG65sThnhqNghcgakXFckKHnbXv6QwPR5LIrOEbBs7GFUPMKBS_3pVo0u4dipjU7TrJ-zFVjLD-0GhvxxT8sfgPkGvs-JSh4GjClVMzirCtLrlH09Iai9Vk2jHslCvzFtfoQjf2oeW24RXQJG0RXoyZNMIpPahjaGTbKnzFxAzAAJUdHleMhoEqTyWi8fmxdKtX-03ap9IDBovfXOdsvwbxbIvoEXTij39VcO8dBQBzOyhNmIndejEm9yDQNcS5Zs8OznxTPILFwVD7Y9eO7NTFsH4W5D9CZ5dSgBjAKyd_ULvyr1b6feXFw2QjDJbkEHJQeAEY4gJsu5J91i7_lNyTvm-0trZHadvVj87zabK6cu8jiI9dunbtRu2DWdqZys2aH_-xzzqS89vnKthqicmNbA77_cSqs8UEY5XPnHMwTqbv1VFnbGqdMX6HvVJEpaedK72D3BV-8XW79qtq-D3CvSIMiCRLmWWElT18OVjNsLMt_YcP2HKpQwxulNMe_ha1OjmEXXyzgDaox4BsD96hmVqjG67RMrziAXpfNc1XDRsr9OM1arT55Dhl6FcZ03MAiWiwW1KtS5hdJTpdLQvMoDhMahUFEszgKMloEhR95kmVcmhSuH9w-T6SUUEpi6vtJ6Ef-3KclK0iyWIZJGZAsh0zwmgk5d4ZdNDyd9hyybmdAKIWxZhIyY8Su4Xw8n3W2UjqthGaFsEfm9YTTnu0fGGeUOA">