blob: cc38bf439093581a0e3afd3963ba0ccdc4cadf8f [file] [log] [blame]
#include "tree-vect.h"
void __attribute__((noipa))
test (double x0, double x1, double *restrict res, double *restrict ptr, int n)
{
for (int i = 0; i < n; i += 2)
{
x0 = __builtin_fmin (x0, ptr[i + 0]);
x1 = __builtin_fmin (x1, ptr[i + 1]);
}
res[0] = x0;
res[1] = x1;
}
#define N 128
#define HALF (N / 2)
int
main (void)
{
check_vect ();
double res[2], a[N];
for (int i = 0; i < N; i += 2)
{
a[i] = i < HALF ? HALF - i : 0;
a[i + 1] = -i / 8;
}
test (N, N, res, a, 2);
if (res[0] != HALF || res[1] != 0)
__builtin_abort ();
test (N, N, res, a, 6);
if (res[0] != HALF - 4 || res[1] != 0)
__builtin_abort ();
test (N, N, res, a, 8);
if (res[0] != HALF - 6 || res[1] != 0)
__builtin_abort ();
test (N, N, res, a, 10);
if (res[0] != HALF - 8 || res[1] != -1)
__builtin_abort ();
test (N, N, res, a, HALF - 2);
if (res[0] != 4 || res[1] != -HALF / 8 + 1)
__builtin_abort ();
test (N, N, res, a, HALF);
if (res[0] != 2 || res[1] != -HALF / 8 + 1)
__builtin_abort ();
test (N, N, res, a, HALF + 2);
if (res[0] != 0 || res[1] != -HALF / 8)
__builtin_abort ();
test (N, N, res, a, HALF + 8);
if (res[0] != 0 || res[1] != -HALF / 8)
__builtin_abort ();
test (N, N, res, a, HALF + 10);
if (res[0] != 0 || res[1] != -HALF / 8 - 1)
__builtin_abort ();
test (N, N, res, a, N);
if (res[0] != 0 || res[1] != -N / 8 + 1)
__builtin_abort ();
test (-1, N, res, a, N);
if (res[0] != -1 || res[1] != -N / 8 + 1)
__builtin_abort ();
test (-1, -N / 8, res, a, N);
if (res[0] != -1 || res[1] != -N / 8)
__builtin_abort ();
return 0;
}
/* { dg-final { scan-tree-dump "Detected reduction" "vect" } } */
/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target vect_max_reduc } } } */