<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63430>63430</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clobber between alloca and stack arg
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86,
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nikic
</td>
</tr>
</table>
<pre>
```llvm
define i32 @test(ptr %a0, ptr %a1, ptr %a2, ptr %a3, ptr %a4, ptr %a5, i128 %x) {
%alloca = alloca i128
store i128 %x, ptr %alloca
store i128 0, ptr %alloca
%cmp = icmp eq i128 %x, -1
br i1 %cmp, label %if, label %else
if:
ret i32 0
else:
ret i32 1
}
```
Results in:
```asm
movq 8(%rsp), %rax
xorps %xmm0, %xmm0
movaps %xmm0, 8(%rsp)
andq 16(%rsp), %rax
cmpq $-1, %rax
je .LBB0_1
# %bb.2: # %else
movl $1, %eax
retq
.LBB0_1: # %if
xorl %eax, %eax
retq
```
The final argument is passed in `8(%rsp)` and `16(%rsp)`. The zero store writes 128 bits to `8(%rsp)`, clobbering the second half of the argument before it is read.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVE1z5CYU_DVPF8oq9NDnQQd7p-aUUyqH3FJIepphjYQMzK6TX58CSbbGceJMTUk0NN3QiCedU5eZqIXiCYpTIm_-amw7q2fVJ50Z_myh5Otf6x8T8BPwx4FGNRNTAhnk3JPzgPXiLQMsJAf8xnaQHQEegTiC_AiKAFSGdUCvgA2D6mk1ZpGgteklA3FiWzOQd4LzxtJx-rtwJH_C4_9KAiz6aYlWKjTo5V75IduZnWUq2_hhRMuOdMBqvIOkHa1z1AjicZ9uycc4-doRWf8c3dygOm2N_WhW-Cu5m_aOqflt7htDuu3sgDeT-fECvKkBa8DCugWwCYsMQL6-0V6NXRzwJmx2mvjGiM2DkvzIuZfdmXIegmdWfmHaT8tL1Msfsk-GvxPwJv3l6Yn_sYeBIpC6LkUQj-yL38Z-P4V1E3q13B3p4GjJv6xgt_3fLmo8Zrl6RO3_cvlwpuvztyuxUc1SM2kvt4lmz5Rji3SOBqZmBiW_j73kTM5D6P-QeMlTFtT-Imu2O_DTKk-Ohe-6U94xbz7TC4vutek6smq-MH8l5qg388CuUo_MjLHrbXkdjfF-xYVakkOaDK0YGtHIhNqsrCtRYI6YXFuOedVlQymauhwEDlUmuBjqoamzJu9lkagWOQpeYpYJzjNMK1FUTdfnY12Nos8KyDlNUuk0lKjU2EuinLtRW4pc8CTePRcLHGIn-2eaBxCPv9clYChJgDgp15tpUVp6ZebQXZwS2wa5h-52cZBzrZx37wZeeU3ttzUQ1pH_STTv9ShE77zsn0Meyc3q9ur94sKtxDPg-aL89dalvZkAz7Gsrq-HxZrv1HvAc9yAAzzHPfwdAAD__3C8ikc">