<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/70947>70947</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Duplicate XMM/YMM constant data
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
When we are working with different vector widths but the same constant data, we often see cases where the constants are repeated at each vector width:
```c
void fabs_cvt(const double *src, int *dst) {
for(int i = 0; i != 6; ++i) {
*dst++ = __builtin_fabs(*src++);
}
}
```
```ll
define void @fabs_cvt(ptr nocapture noundef readonly %src, ptr nocapture noundef writeonly %dst) {
entry:
%incdec.ptr.3 = getelementptr inbounds double, ptr %src, i64 4
%incdec.ptr1.3 = getelementptr inbounds i32, ptr %dst, i64 4
%0 = load <4 x double>, ptr %src, align 8
%1 = tail call <4 x double> @llvm.fabs.v4f64(<4 x double> %0)
%2 = fptosi <4 x double> %1 to <4 x i32>
store <4 x i32> %2, ptr %dst, align 4
%3 = load <2 x double>, ptr %incdec.ptr.3, align 8
%4 = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %3)
%5 = fptosi <2 x double> %4 to <2 x i32>
store <2 x i32> %5, ptr %incdec.ptr1.3, align 4
ret void
}
declare <4 x double> @llvm.fabs.v4f64(<4 x double>)
declare <2 x double> @llvm.fabs.v2f64(<2 x double>)
```
AVX1:
```s
.LCPI0_0:
.quad 0x7fffffffffffffff # double NaN
.quad 0x7fffffffffffffff # double NaN
.quad 0x7fffffffffffffff # double NaN
.quad 0x7fffffffffffffff # double NaN
.LCPI0_1:
.quad 0x7fffffffffffffff # double NaN
.quad 0x7fffffffffffffff # double NaN
fabs_cvt(double const*, int*): # @fabs_cvt(double const*, int*)
vmovupd (%rdi), %ymm0
vandpd .LCPI0_0(%rip), %ymm0, %ymm0
vcvttpd2dq %ymm0, %xmm0
vmovupd %xmm0, (%rsi)
vmovupd 32(%rdi), %xmm0
vandpd .LCPI0_1(%rip), %xmm0, %xmm0
vcvttpd2dq %xmm0, %xmm0
vmovlpd %xmm0, 16(%rsi)
retq
```
AVX2:
```
.LCPI0_0:
.quad 0x7fffffffffffffff # double NaN
.LCPI0_1:
.quad 0x7fffffffffffffff # double NaN
.quad 0x7fffffffffffffff # double NaN
fabs_cvt(double const*, int*): # @fabs_cvt(double const*, int*)
vbroadcastsd .LCPI0_0(%rip), %ymm0 # ymm0 = [NaN,NaN,NaN,NaN]
vandpd (%rdi), %ymm0, %ymm0
vcvttpd2dq %ymm0, %xmm0
vmovupd %xmm0, (%rsi)
vmovupd 32(%rdi), %xmm0
vandpd .LCPI0_1(%rip), %xmm0, %xmm0
vcvttpd2dq %xmm0, %xmm0
vmovlpd %xmm0, 16(%rsi)
vzeroupper
retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsV1uP6jYX_TXmZeugxE4gPPAAw0H69HWOqlZqp08jJ96AexI7Y-_AzPn1lc1lCJepWlVVVRWhmThZe3mt5RuR3uu1QZyyfM7yxUB2tLFu-sP_f9SNNYPSqrfpzxs0sEOQDmFn3Vdt1rDTtAGlVyt0aAi2WJF1sNOKNh7KjoA2CF42CJU1nqQhUJIk4w-Bya4IDXhEqKRHD7sNOowlR7SPvTlsURIqkAQoq02vHyZmLFmwZMZGyf5b7dtbqxWsZOmfqy0xXkROULYrawTGZ95VQYc2FFrKE-MTYOP5vhoAYGUd40UAaGBiAQkT83DJ09AahRbjc8bn-qo0fI6sARHrn5_LTtekzXOQxXhxVDGP3wkTRwY2XhxMnS6O7i6adb2_oXClDUI0zbLkzHdLDoytZEudQzC2MwpX4FAqa-o3YDw_JHEbuHOa8Ii8TAkNubfTCASENpXCatiSG4poeo2ENTZoKPBrUwZefxiHY7fvIvQog-wWXfoxnxb8jCzq7JOF20lkqK1UwMRDBq9HGeLztRJZ67WB4qw8jeUkdQ2VrOsrjhB8XW-bYUh_uM1WoywM8hWK50kY7XdiHolXLVmvb7CGnskeHwSn4vOx2pN12H8UGa_D2Ps5j0P04uB34jgf0du5ZNe58A9y4adc-KVP0c8lv8jlCp8dcuH3c-G9XPKbxtJzZ6eEHFJcTxcrUWFVy_fM_-Donwye0fyJsE40F_vC7Ken9HpH9Pv28LuH7_-XPCfvCxaGL51UkLyOV_0PMC6Oe-UX-eUfCD-YSf8mM2cb6uFRPE8Ynx0OkXg1YWIWy_tb8IcVBzXbxm67VkE8FnKnwpkSgIznb02TnGDSqFbBaSj3aN1eoG8UVluiVnH1cgF6PQedROxvR0TswesbWsOee6X29a7a9Iba1ztCemrvgRq7rftq09ENvQ7p5d5q4der5a9ZLP-6-Vk6K1UlPfnfnX6xi_2FWADL50Emf7j8my8u5sm9uf_fbO7p_YbOdm2L7uykupzgAzUVaiImcoDTdDQpipwXWTLYTCfjcY5ZjhlPRJ7LKs9QCZWKYjIZlQLHAz3lCRdpmqRpLrIkGZYyHad5mmBWFFlRpCxLsJG6HsZjyrr1QHvf4XScTLLxoJYl1j6-SHBeyuorGsXE7KkYMR5-lTDOG-09qk-2Jd3ob5K0NeFZvhi4aeD8VHZrH45B7cm_90Ka6viGErjyBSy6ttaVJISnx0fGl788PvZfMwadq6cbotaHRciXjC_XmjZdOaxsw_gyMB_-fWqd_RUrYnwZzXjGl9HPbwEAAP__dMDBCA">