<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/81883>81883</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Possible missed optimization with truncating vector cast
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
okaneco
</td>
</tr>
</table>
<pre>
This function produces the following assembly
https://llvm.godbolt.org/z/q8YEhevbo
```llvm
define void @cast_i16x4_to_u8x4(ptr sret(<4 x i8>) %_0, ptr %x) unnamed_addr #0 {
%1 = load <4 x i16>, ptr %x
%2 = trunc <4 x i16> %1 to <4 x i8>
store <4 x i8> %2, ptr %_0
ret void
}
```
```asm
cast_i16x4_to_u8x4: # @cast_i16x4_to_u8x4
mov rax, rdi
mov rcx, qword ptr [rsi]
movq xmm0, rcx
movdqa xmmword ptr [rsp - 24], xmm0
movzx ecx, cl
movzx edx, byte ptr [rsp - 22]
shl edx, 8
or edx, ecx
movzx ecx, byte ptr [rsp - 20]
shl ecx, 16
or ecx, edx
movzx edx, byte ptr [rsp - 18]
shl edx, 24
or edx, ecx
mov dword ptr [rdi], edx
ret
```
but I expected something like this instead.
```asm
.LCPI0_0:
.short 255 # 0xff
.short 255 # 0xff
.short 255 # 0xff
.short 255 # 0xff
.short 255 # 0xff
.short 255 # 0xff
.short 255 # 0xff
.short 255 # 0xff
cast_i16x4_to_u8x4: # @cast_i16x4_to_u8x4
mov rax, rdi
movq xmm0, qword ptr [rsi]
pand xmm0, xmmword ptr [rip + .LCPI0_0]
packuswb xmm0, xmm0
movd dword ptr [rdi], xmm0
ret
```
---
Original Rust code https://rust.godbolt.org/z/WrKdjx9sa
Originally found in Rust `portable-simd` code for casting an `i16x4` to `u8x4` https://github.com/rust-lang/portable-simd/issues/369#issuecomment-1751887458
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVt9v4ygQ_mvwyygRxj_iPPihbTbS6k661emku3uKsCExWwwu4MTtX38Cp9s4jXe1fTmtFQXZM983HwMMQ60VB8V5ibJ7lG0i2rtGm1I_UsVrHVWaPZd_NcLCvle1E1pBZzTra27BNRz2Wkp9EuoA1FreVvIZ4Q3Cd41znUXJHSJbRLZSHtvlQbNKS7fU5oDI9gWR7VPx76eGHys9YlCOx593Hz8xvheKw1ELBijFNbVuJ-J8SHdO7_piSBEpOmfAGu4QKVDykMIAokDJJ0TWgEi2w4g8gPdBJBv8x14p2nK2o4z5jwkGtLofw4F3igElG5CaMnjli_NAeMHz5k6CuzO9qqf-I5fTMFF1BlqnDZ9YAtdFjB1-9TXchQycs7TaXKXr6pXac_JuZCu5g1sPIslMes8SxqfVxzAaOnihhokZex3sTydt2Did7N5YgbLNO_8nPw5tG1bJ464d2BMNDlOuDhZAUk9IHkb4Ne5lAAA-CqnljJkFc_Xs-BU1eafVNjKMZ0wxtWoDl1Z-YyIvw6ucG_HwfLwRE-czAUezj_tzU4yLH02RpD89xzCyyVIxcV6lN4n-rN7awVXv4DPwoeO14wysbrlrfGmR4pGD80VIKOs4Zcu5Lb_8_eHLZ7zDvvJMxC1to40DIFkWdjse9vt5j-89V-gPwj4k65cQ_n9UnUkV-WHZ6ahil4Dr6iI6QOQevu2lb_iO1o-9PVWvRBcE7wtQCDFzFi4Ac4dh_F8sFpevfxhxEIpK-LO3DmrNOEwvWtNbd-Oi_dv8xr4Oa0unNPIZ9rpXDIQaGVGOO20crSRfWNEylOMxyl4b8OsULnrl_cKCebu_4HIcli3HV3IOwjV9tax1e9a2kFR5UdMoZCus7blFZJvka0SS8FrrtuXKLeJVFhfFKs2KiJUJWydrGvEyXuECx0VG4qgpSU1JlaerNM9XCSlYEZM6z2iSs2SNk5REoiSYpJjEWbxKMhIvOU4ysmLrak9IytY1SjFvqZDL0Kpoc4iChrKIiyKJJK24tKFFIkTxEwQjCtdEZEqPWVT9waIUS2GdfWNxwsnQW_1T5CjbwBdtragkh1ZYyxnozolWvNDQWZ2Ea8ZOgoZMH3ntzomPeiPL7yQ3tEzjsOiM_sprd5nWMI3_AgAA__9Px7Yq">