<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63049>63049</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SLPVectorizer] Unsound transform: Target is more poisonous than source according to Alive2
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:SLPVectorizer
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
fhahn
</td>
</tr>
</table>
<pre>
Running `llvm/test/Transforms/PhaseOrdering/X86/vector-reductions-logical.ll` through Alive2 (with `opt-alive.sh`) shows that SLPVectorizer performs an unsound transformation, after which the target is more poisonous than source.
Reproducer IR for just running SLPVectorizer:
```
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64--"
define float @test_merge_anyof_v4sf(<4 x float> %t) local_unnamed_addr #0 {
entry:
%vecext = extractelement <4 x float> %t, i64 0
%cmp = fcmp olt float %vecext, 0.000000e+00
%vecext2 = extractelement <4 x float> %t, i64 1
%cmp4 = fcmp olt float %vecext2, 0.000000e+00
%or.cond = select i1 %cmp, i1 true, i1 %cmp4
%vecext7 = extractelement <4 x float> %t, i64 2
%cmp9 = fcmp olt float %vecext7, 0.000000e+00
%or.cond1 = select i1 %or.cond, i1 true, i1 %cmp9
%vecext12 = extractelement <4 x float> %t, i64 3
%cmp14 = fcmp olt float %vecext12, 0.000000e+00
%or.cond2 = select i1 %or.cond1, i1 true, i1 %cmp14
%cmp19 = fcmp ogt float %vecext, 1.000000e+00
%or.cond3 = select i1 %or.cond2, i1 true, i1 %cmp19
%cmp24 = fcmp ogt float %vecext2, 1.000000e+00
%or.cond4 = select i1 %or.cond3, i1 true, i1 %cmp24
%cmp29 = fcmp ogt float %vecext7, 1.000000e+00
%or.cond5 = select i1 %or.cond4, i1 true, i1 %cmp29
%cmp34 = fcmp ogt float %vecext12, 1.000000e+00
%or.cond6 = select i1 %or.cond5, i1 true, i1 %cmp34
%add = fadd float %vecext, %vecext2
%retval.0 = select i1 %or.cond6, float 0.000000e+00, float %add
ret float %retval.0
}
```
Report by Alive2:
```
define float @test_merge_anyof_v4sf(<4 x float> %t) {
%entry:
%vecext = extractelement <4 x float> %t, i64 0
%cmp = fcmp olt float %vecext, 0.000000
%vecext2 = extractelement <4 x float> %t, i64 1
%cmp4 = fcmp olt float %vecext2, 0.000000
%or.cond = select i1 %cmp, i1 1, i1 %cmp4
%vecext7 = extractelement <4 x float> %t, i64 2
%cmp9 = fcmp olt float %vecext7, 0.000000
%or.cond1 = select i1 %or.cond, i1 1, i1 %cmp9
%vecext12 = extractelement <4 x float> %t, i64 3
%cmp14 = fcmp olt float %vecext12, 0.000000
%or.cond2 = select i1 %or.cond1, i1 1, i1 %cmp14
%cmp19 = fcmp ogt float %vecext, 1.000000
%or.cond3 = select i1 %or.cond2, i1 1, i1 %cmp19
%cmp24 = fcmp ogt float %vecext2, 1.000000
%or.cond4 = select i1 %or.cond3, i1 1, i1 %cmp24
%cmp29 = fcmp ogt float %vecext7, 1.000000
%or.cond5 = select i1 %or.cond4, i1 1, i1 %cmp29
%cmp34 = fcmp ogt float %vecext12, 1.000000
%or.cond6 = select i1 %or.cond5, i1 1, i1 %cmp34
%add = fadd float %vecext, %vecext2
%retval.0 = select i1 %or.cond6, float 0.000000, float %add
ret float %retval.0
}
=>
define float @test_merge_anyof_v4sf(<4 x float> %t) {
%entry:
%0 = shufflevector <4 x float> %t, <4 x float> poison, 0, 1, 2, 3, 0, 1, 2, 3
%1 = fcmp ogt <8 x float> %0, { 1.000000, 1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000 }
%2 = fcmp olt <8 x float> %0, { 1.000000, 1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000 }
%3 = shufflevector <8 x i1> %1, <8 x i1> %2, 0, 1, 2, 3, 12, 13, 14, 15
%4 = freeze <8 x i1> %3
%5 = reduce_smax <8 x i1> %4
%6 = extractelement <4 x float> %t, i64 0
%7 = extractelement <4 x float> %t, i64 1
%add = fadd float %6, %7
%retval.0 = select i1 %5, float 0.000000, float %add
ret float %retval.0
}
Transformation doesn't verify! (unsound)
ERROR: Target is more poisonous than source
Example:
<4 x float> %t = < #x80200000 (-0.000000000000?), poison, poison, #x40040000 (2.0625) >
Source:
float %vecext = #x80200000 (-0.000000000000?)
i1 %cmp = #x1 (1)
float %vecext2 = poison
i1 %cmp4 = poison
i1 %or.cond = #x1 (1)
float %vecext7 = poison
i1 %cmp9 = poison
i1 %or.cond1 = #x1 (1)
float %vecext12 = #x40040000 (2.0625)
i1 %cmp14 = #x0 (0)
i1 %or.cond2 = #x1 (1)
i1 %cmp19 = #x0 (0)
i1 %or.cond3 = #x1 (1)
i1 %cmp24 = poison
i1 %or.cond4 = #x1 (1)
i1 %cmp29 = poison
i1 %or.cond5 = #x1 (1)
i1 %cmp34 = #x1 (1)
i1 %or.cond6 = #x1 (1)
float %add = poison
float %retval.0 = #x00000000 (+0.0)
Target:
<8 x float> %0 = < #x80200000 (-0.000000000000?), poison, poison, #x40040000 (2.0625), #x80200000 (-0.000000000000?), poison, poison, #x40040000 (2.0625) >
<8 x i1> %1 = < #x0 (0), poison, poison, #x1 (1), #x0 (0), poison, poison, #x1 (1) >
<8 x i1> %2 = < #x1 (1), poison, poison, #x0 (0), #x1 (1), poison, poison, #x0 (0) >
<8 x i1> %3 = < #x0 (0), poison, poison, #x1 (1), #x1 (1), poison, poison, #x0 (0) >
<8 x i1> %4 = < #x0 (0), #x0 (0), #x0 (0), #x1 (1), #x1 (1), #x0 (0), #x0 (0), #x0 (0) >
i1 %5 = #x0 (0)
float %6 = #x80200000 (-0.000000000000?)
float %7 = poison
float %add = poison
float %retval.0 = poison
Source value: #x00000000 (+0.0)
Target value: poison
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWVuP4jgT_TXmxQLZ5dx44KFvSJ_0STNiZlf7hkzikIySGDkOQ8-vXzlxIAHCbXsurVZkgqvOqbKrjkl4WabrQogZcp-R-zrilU6kmsUJT4rRSkbvs0VVFGmxxsgjWbbNEcy1KDWC-VfFizKWKi8RzD8nvBSfVCRUWqwRzP8JPATzrQi1VGMloirUqSzKcSbXacizSZYhj2CdKFmtE_yUpVsBGEHwPdWJgZIbPebm7qRMkEcQTHGZyO8l1gnX-Mv_P_9du05_CIU3QtU0MC9wVZSyKiKsW3Lc4CJ4wTzWQuHvSRomWCcCa67WQuO0xLlUAm9kWspCVjVCgUtZqVBMEHlF5Km5LsRGyagKhcL_W-BYKvytKjVWNj89Tog9dU1NBM1__dFCR1zzjL_LSmPEXjECEOMcsSc53oBPEHtiUF_MR9r_aEaeU1_GaTuIA2NEIRgXgRl4rY3njL9QCBBAD1-rdJOJFnsXeEvPGY_3s5prJOK0EDjOJNcYOcQs_jIXai2WvHiX8XLrlDGCALEXB--aeYi9YQSuNquWyZBny6ooeC6iJY8ihREwgpH_3ACIQqv3fb6wMdyKUOyapIidVjzUIhO5KMytcygvOPUcTDoewnxTm8dmIDPd8m99GxsyIfWfQPBMWuP9DLgXnvbhnYv4MEjAzJFqEsoiqj2UIhOhxim1fms4irWqhB1avOMA_HsDgH4A04sB-LcEQE8jsN8MRTE92QX07oVg_Tjo5ZWgNy0FDEZCh0KhzhGPbkLXZ3ckHdiRFooNkoBBEtM-CXAukoBBFh0wZ5AGG6IBR7mAy7nwb6HhDtJwBmkcZYNdzga9KR3eIA93iAfrpoNHTaHHZnBmU3QW52CkhN7ybEIGsT1j2ng72tv7-w1261SJTvyteysE_utZGTu9LsRGKo1X71bRL8vgf5WWvYQgcH-7ipwA_0IBuU866Fnd-C3C8YBk0D9KLx5RCvpRMnEKfl0h6IfJwyPCQD9MFR7RA_pxYvCIDNA_QAMGuv9NzZ-9Ivb2Szq3DSmp4jgTzW_IwQo-vt_8jqtrtF4wc6mXjp29dwCl_eVH7CU4wquNkf982AXdHXFhTO4Y433CDST0e9EfQMpgsvPrY6il1PKidnF6N2FoXWx1NeO6XqnbAbSlqYT4IU6cdhexaQL18waxLHO-O5ndLTvv0cMBAvdulaRX692zpe4fUIZr3L25uG-q7q-95yU4kqIsEPgab4VK43cEBjSwT1dQ2zvfFotPC8Se8NcbHqZ0T4JvO55vMnE4H55JXPNggpmUsF1AwO5ECMZtwDZsNjeE4KVT-4eRMXYIcVpjmBAP3LoJtd2suX5pSLaMjrqwfUpyC5HafN_n94Z1Aul-wrG01vMs7b4HZ-Cr7lHvOoA_DDC9DEBvRLAnr8GEH6Hac5aZXs8jR1N656kz6J1DzE2O2FVHcCXTznUPV1LpXvXAroD0ThuX1qRtMV0uJ03gkDhC9rva_EycHJJo-0Nd4N16PRGin1yv7Zc_tRMci1gvpsPuuoBwWA94xGqYC_S49GCGvPag77ca5sI-IC8fxcUZ5nLbjcvM7nR64Glleqg3HVT_XmnZW5629AeqvzujkUC85VllhPBaZ7Civ5_edbV_1DOKZiyasikfiRn1AtcjLvVhlMx4EPmEiMADwlcQxK7r-kD8VczB5Q6bjtIZEGDEI5T4bMpg4nIndlbcDcPV1AumBDlE5DzNJlm2zSdSrUdpWVZi5jHiTEcZX4msrN9rAeRpGcp8k2b2dZA5biKA-oUWe-q_ugFA7utIzcyX41W1LpFDsrTU5QFHpzqrX5n1Ld1X_Nfx-6dbT0eYh6FUUVqssZb28dmoUtks0XpTmsYLcwTzdaqTajUJZY5gbt_H1UQ3Sn4ToUYwr5NQIpjXefg3AAD__wU0fXg">