<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59344>59344</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Failure to consolidate integer/double loads of the same bit constant
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
Reduced: https://godbolt.org/z/q1qW9xd4o
clang -g0 -O3 -march=znver2
```
#include <x86intrin.h>
__m256d foo(__m256d x, __m256i sign) {
sign = _mm256_andnot_si256( _mm256_set1_epi64x( 0x7fffffffffffffffULL ), sign );
__m256i offset = _mm256_or_si256( _mm256_set1_epi64x( 0x3fe0000000000000ULL ), sign );
__m256d base = _mm256_mul_pd( x, _mm256_set1_pd( 0.5 ) );
return _mm256_add_pd( base, _mm256_castsi256_pd( offset ) );
}
define <4 x double> @foo(<4 x double> %x, <4 x i64> %sign) {
entry:
%and.i = and <4 x i64> %sign, <i64 -9223372036854775808, i64 -9223372036854775808, i64 -9223372036854775808, i64 -9223372036854775808>
%or.i = or <4 x i64> %and.i, <i64 4602678819172646912, i64 4602678819172646912, i64 4602678819172646912, i64 4602678819172646912>
%mul.i = fmul <4 x double> %x, <double 5.000000e-01, double 5.000000e-01, double 5.000000e-01, double 5.000000e-01>
%0 = bitcast <4 x i64> %or.i to <4 x double>
%add.i = fadd <4 x double> %mul.i, %0
ret <4 x double> %add.i
}
.LCPI0_0:
.quad -9223372036854775808 # 0x8000000000000000
.LCPI0_1:
.quad 4602678819172646912 # 0x3fe0000000000000
foo(double __vector(4), long long __vector(4)): # @foo(double __vector(4), long long __vector(4))
vbroadcastsd .LCPI0_1(%rip), %ymm3 # ymm3 = [4602678819172646912,4602678819172646912,4602678819172646912,4602678819172646912]
vbroadcastsd .LCPI0_0(%rip), %ymm2 # ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
vbroadcastsd .LCPI0_1(%rip), %ymm4 # ymm4 = [4602678819172646912,4602678819172646912,4602678819172646912,4602678819172646912]
vmulpd %ymm3, %ymm0, %ymm0
vandpd %ymm2, %ymm1, %ymm1
vorpd %ymm4, %ymm1, %ymm1
vaddpd %ymm1, %ymm0, %ymm0
retq
```
We've broadcast the same constant twice - 128-bit variants sometimes do something similar (although not usually as broadcasts)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vk1v4zYQ_TX0hbBBjUh9HHxI4jVQNECLLYrtzaBE2mZLkQ5Juc7--oL6iOVE2S2aRYlAEYfDN2_ejGhy79XBSLlG7B6xzYK34Wjd-vPPv6nGmkVlxfP6sxRtLQVK7_AxhJNH6R2CLYLtwYrK6rCy7oBg-xXB9il5-lJeBLWIbBC565-15uaAlweCl7-keNlwVx9RuvlqztLB4JiR4a-fQqpMrVshMUofLkWmTHDKrI4o_dR77HYNsEzgvbUIinF2QfCA-4nCMTEEJUb5fb8HY9wZMUo3eNdErx03wtiw8wpYhqAYzV6GZCdPKqOXaCWXfH87fn98xAjKGK-HhBKlkzgjCbvfexmmEa37frR0L8l0_LtoAlfcy2msptW7k4iYvTKTcL2ZrBjuNHoF6GRonXkRSYjBPwaYINXchy6ZYXnM9hUiyjfTfhByr0xXWYovWNi20hKlnzCipC_n2xVgXQLDgsroYB1rfC2yNME9xw4dckHAuBEr1cnCjXgPowNXGcXLEiBNcyBpVjCa56wgRVz-4WtjK3ccrRsoWveWYZfAhCLNCGR5USRlkkNGszKBMdKPW7qh17R64LdvWj1TumuBeiNmq7515ZIkceXj5htCpCNTqRBb8K1inZzBviE67QoxdsWeCzGbUpd1lxYwMm51Msw6d3iz_b56fPj1J7Ijk67sx-qp5QLj2fbACFJMLgW5HTeIybuIMwUdAF8fLf3-_rsbVN_tzrIO1iEo6HDqaGsO_ePNYhl_F-ZHjPjyUf9H8Jv0zpWzXHSnjujSHXWAAgFz6jQgImDPTZMOFLrXWGjE7uc_go9a2VDv9wiSeYJwJQgjwflT5KPW7xF8R0F6JUj_LwWbVp8EHkt45UKmr7ddwY24boGrXzJ9HeCti65jft_0fYEXE_jkm4ycDE-zN5ovEkF-lvhFfhyOEnveSFxb4wM3AYe_VS3xEidQLCsV8Jk7xU3w2NtGBtVIj4XtJ0dlDtirRmnuMIKC63C07eGIjQ249S3X-hlzfw3nEZQLsU5FmZZ8IddJlhPIoCzY4riGkiaFEKQmjFJaVZBzqFKaJUTIhIp0odZAABIgLMlZBmxFyz1lZVrSmuQVzymiRDZc6ZXW5ybeBxfK-1auWZlSutC8ktp3V0yAitd_SRNvk38UGYJY-oVbx33Lqj14RIlWPvgrUlBBd_fT6M82eMuVbp2Mx3uUzmoleJBYmSAP0iHYDieNtlx4bPdXpaOoo9qL1un1q-usCse2WtW2QbCN4Yd_y5Ozf8o6INh2WXkE2y6xfwIAAP__eGT6_A">