https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118852
--- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #9)
> A testcase would be the following - we don't perform loop-header copying
> for an isolated testcase, thus manually here.
>
> void *
> foo (void **p, void **limit)
> {
> if (++p < limit)
> do
> {
> void *x = *p;
> if (x != (void *)0 && x != (void *)1)
> return x;
> }
> while (++p < limit);
> return (void *)0;
> }
>
> I can't spot what is wrong here with the vectorization off-head.
In fact the following doesn't spot any issue (it should exhaustively
test peeling & relative position of the to be found element).
void * __attribute__((noipa))
foo (void **p, void **limit)
{
if (++p < limit)
do
{
void *x = *p;
if (x != (void *)0 && x != (void *)1)
return x;
}
while (++p < limit);
return (void *)0;
}
int main()
{
void *x[4096];
for (int j = 0; j < 4095; ++j)
for (int k = j + 1; k < 4096; ++k)
{
for (int i = 0; i < 4096; ++i)
x[i] = 0;
x[k] = (void *)42;
void *res = foo (&x[j], &x[4096]);
if (res != (void *)42)
__builtin_abort ();
}
}