<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61069>61069</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64][SLP] slp-vectorizer produce incorrect result
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ilinpv
</td>
</tr>
</table>
<pre>
Compiling with
`clang --target=aarch64-linux-gnu -O3 -fno-vectorize`
got the following test aborted with incorrect result `-606` in `dst[7]`:
```C
#include <stdlib.h>
struct cnum {
int real;
int img;
} src[1] = {{20000, 20000}};
inline int operations(int x, int y) {
return (2*y*x + 0x10) >> 16;
}
void slp_loop(int n, int val, int *dst) {
int idx = 0;
for (int i = 0; i < n; ++i) {
int tmp0 = src[i].img;
int tmp1 = src[i].real;
int tmp2 = 0x131 - abs(tmp1);
int tmp3 = 0x131 - abs(tmp0);
int tmp4 = 0x91 - abs(tmp2);
int tmp5 = 0x91 - abs(tmp3);
int tmp6 = 0x1 - abs(tmp4);
int tmp7 = 0x1 - abs(tmp5);
dst[idx++] = operations(tmp0, val);
dst[idx++] = operations(tmp1, val);
dst[idx++] = operations(tmp2, val);
dst[idx++] = operations(tmp3, val);
dst[idx++] = operations(tmp4, val);
dst[idx++] = operations(tmp5, val);
dst[idx++] = operations(tmp6, val);
dst[idx++] = operations(tmp7, val);
}
}
int main(void) {
int dst[8];
slp_loop(1, 1000, dst);
if(dst[7] != -597)
/* SLP vectorizer error */
abort();
return 0;
}
```
When slp-vectorizer disabled
`clang --target=aarch64-linux-gnu -O3 -fno-vectorize -fno-slp-vectorize`
the test passed.
Preliminary investigation showed that `llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp SLPVectorizerPass::tryToVectorizeList -> R.vectorizeTree()` is making things wrong.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVsuO6jgTfppiUwpyyiTAggWXw6qlv_Wfo5nlyCQm8YyxI9uh6Xn6kR2aSzctjQYUIbv81b1cZeG9aoyUCyhWUGxGog-tdQullemOo52t3xdre-jivsE3FVpEYBtgSyhZpYVpMMuCcI0MwDdCuKotJ5lWpj9ljekx-x_HbG9sdpRVsE79LaFkZwmNDRhaiXurtX2L8oP0AcXOuiDrQZkylXVOVgGd9L0OCCXLSlZGKcrEXe0DFKspFBsoGfDlxbrhW5_3xJWpdF9LBL72odZqN26B_xiOfXB9FbAy_QFhuhqIiIjKRM1CA1_hPVUdmisRphv0roJilUOxQeCbJGa6IsYYA1rjsJhu4sfPCoZ_ZbQyMsm0nXQiKGs80CwSTpE1Lt6B5reWORl6ZxBoRkDLd6DlCYFWyE45S1D-A_gPzMto4-V3MfZW_9GqGr3u_tDWdme95kPvUeiPJdAyxvrejhSJ-pQ8ZhfHEPfW4VmWuhym5RpNihutgFbqk7hBYDh0LDENIVVQbMZDuL_g8s-4c7K-AGmw4pTzHDMUuxjhyA80fwTnj-HsG_jkDJ_foekbdPEQzb9Blx-m3IIn34Cnj8DFZ_BwZ1R9GrLwUbJ35Td4ux4q4D-x54_Y_yUvPaeaP8c-eY69eI69fCJu04eqrzf-_urHojkIZYBmsQvcX8Z4OGidxeZ668hNt0hJzs9NbugP93W5B5pdezQC5dHurJhPI3TAAW2Blvjz5RUvc8KhdC51kSXQFoHNrx1s6GZpUADNPqs898ZrO7p6_TEVhu3vrTTRl-xGaa282GlZPznlhu2d7Ovgi0MvjbpOeC_r8UB9dVKrgzLCvaMyR-mDalJq0bf2TdYYWpHmn9bHA9BWqx3Q9pcTxu-tO3ig7W8XXbT9-fJ62bpx1XV4R3kV3sdpyZfBvf-yl4MX5QNmcXb8f3wx_ZeT8hzoOHc9HsRfaV63yjQe35w1zXhUL3g953Mxkou8nE5LKlhOo3Yxl5JPSsEqsRcV29ezmnLGeM2qmdzvxXykFsSIM6IZUVEWNOZ8zidFLmaSclGIAiZMHoTS4-j62LpmpLzv5aLMWTkfabGT2qcHDJGRb5gOgSi-Z9wi8mS7vvEwYVr54K9Sggo6vXyWy5TSWOfF6ufLa6zUT4XROVv3lfzyIhn1Ti_aELoUzljI20aFtt-NK5vSdM5WtKJz9k9ZBaBtMjGmLLnwTwAAAP__iS22AA">