https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109154
--- Comment #58 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
As a different testcase showing what still needs to be done is e.g.
void
foo (int *p, int *q, int *r, int *s, int *t, int *u)
{
#pragma omp simd
for (int i = 0; i < 1024; i++)
{
int vp = p[i];
int vq = q[i];
int vr = r[i];
int vs = s[i];
int vt = t[i];
int vu = u[i];
int vw;
if (vp != 0)
{
if (vp > 100)
{
if (vq < 200)
vw = 1;
else if (vr)
vw = 2;
else
vw = 3;
}
else if (vs > 100)
{
if (vq < 180)
vw = 4;
else if (vr > 20)
vw = 5;
else
vw = 6;
}
else
{
if (vq < -100)
vw = 7;
else if (vr < -20)
vw = 8;
else
vw = 9;
}
}
else if (vt > 10)
{
if (vu > 100)
vw = 10;
else if (vu < -100)
vw = 11;
else
vw = 12;
}
else
vw = 13;
u[i] = vw;
}
}
with -O2 -fopenmp-simd.
I think we still need 12 VEC_COND_EXPRs to merge it all together, but if we
follow what the source is doing (or rediscover it), we can certainly
avoid so many useless &s on the conditions by merging it together in the right
order.