<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/81469>81469</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Prefer trunc(reduce(x)) over reduce(trunc(x))
</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>
Reported here: https://discourse.llvm.org/t/avx2-popcount-regression/76926
```cpp
int popcount8(uint64_t data[8]) {
int count = 0;
for (int i = 0; i < 8; ++i)
count += __builtin_popcountll(data[i]);
return count;
}
```
```ll
define i32 @popcount8(ptr %data) {
entry:
%0 = load <8 x i64>, ptr %data, align 8
%1 = tail call <8 x i64> @llvm.ctpop.v8i64(<8 x i64> %0)
%2 = trunc <8 x i64> %1 to <8 x i32>
%3 = tail call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %2)
ret i32 %3
}
declare <8 x i64> @llvm.ctpop.v8i64(<8 x i64>)
declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)
```
We can avoid the vector truncation replacing with a free scalar truncation if we perform the reduction on the v8i64:
```ll
define i32 @popcount8(ptr %data) {
entry:
%0 = load <8 x i64>, ptr %data, align 8
%1 = tail call <8 x i64> @llvm.ctpop.v8i64(<8 x i64> %0)
%2 = tail call i64 @llvm.vector.reduce.add.v8i64 (<8 x i64 > %1)
%3 = trunc i64 %2 to i32
ret i32 %3
}
declare <8 x i64> @llvm.ctpop.v8i64(<8 x i64>) #1
declare i64 @llvm.vector.reduce.add.v8i64(<8 x i64>)
```
Godbolt: https://simd.godbolt.org/z/ooK497x7s
We might be best off attempting this in vector-combine
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVU2P4zYM_TXMhUjgUP485DCZND3spdge2ttAtuhErWwZkpyd3V9fyE4yiYu22AI9FAgcmx-Pj-ITKL3Xp555B9kessNKjuFs3e7zp591Z_tVbdXX3WcerAus8MyOQbzgOYTBg3gBOgIdlfaNHZ3njTGXbmPdCegYgI7y8k7rwQ6NHfuwdnxy7L22PdCxyCvKITlA8nJ95sn8a4Zhtug-4C25BCpH3Yc8fQuoZJCQ7UvIDkAVQrGfExBjyhSPIA6YgLh7WusQqIwB-u6cXl-xjK9Ae6C9BqpuKXiDon1MeHurR22C7t9upIwBKq9k9EzmoaLjMLp-xriboTgs2l18GjMbFLe6Z9SCENLk8RiGEDvJprqP3XMf3Nc4k2t9oCyZOjVWqthnie-o8xTED0Cv-ATzitLoU4_lQ_J2Sg5SG2ykMc8IkdQ07CYMdthcymimchFDWfJwnkAZzZhu7JslXiwY7N0qKPL8yBQLNteDmThcuAnWbRyrseGNVCryEfTAZ0KbCDzwcRxmGMrEYjqKGyMdf3_Pd_gbwr_gecdYamR6_sLYyB7lxWqF4cw4o86HKoO2PToejGx0f8IvOpxRYuuY0TfSyKc43eIXxoFda103YU3UJp_tZ_CpSbG8o9-t0v-lTD_Elqd_P8Tof4TFm6SfccWD_OecjKLo49z_W1EikNgulPnPTf2luhfK_NGq2prw583gdac2p9l73QvfgI7Wfkqr4r3wC2F3-nQOWDPW7APatkUZAndDiFoOZ-1R91e9rxvb1brnldoJVYlKrni3LZKiEEWeJ6vzTlSJbIUUQjVlItNSVFxst5KrVmVlScVK7yihNKEtbbcipWST19y2ZZtkqUq45hTShDupzX2rrbT3I-_KbZpXKyNrNn7amkS1bH7nXoF4-bXMgQjoFYg67T2rtR2C7vS36c5FX3ZYuV3EXNfjyccRaB_8R5Wgg5nWccTKDviT45avFxeonIcEVL7HcVCF9sIO79Zb2NW7Gp3ZPQ_lpMN5rDeN7YCOser1bz04-xs3cXFPjXqg49TrHwEAAP__M9tQnw">