/* { dg-do compile } */ /* { dg-options "-O3 -mavx2 -fvect-cost-model=unlimited -fdump-tree-vect-details" } */ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 6 "vect" } } */ typedef struct { _Complex double c; double a1; double a2;} cdf; typedef struct { _Complex double c; double a1; double a2; double a3; double a4;} cdf2; typedef struct { _Complex double c1; _Complex double c2; double a1; double a2; double a3; double a4;} cdf3; typedef struct { _Complex double c1; _Complex double c2; double a1; double a2;} cdf4; #define N 100 /* VMAT_ELEMENTWISE. */ void __attribute__((noipa)) foo (cdf* a, cdf* __restrict b) { for (int i = 0; i < N; ++i) { a[i].c = b[i].c; a[i].a1 = b[i].a1; a[i].a2 = b[i].a2; } } /* VMAT_CONTIGUOUS_PERMUTE. */ void __attribute__((noipa)) foo1 (cdf2* a, cdf2* __restrict b) { for (int i = 0; i < N; ++i) { a[i].c = b[i].c; a[i].a1 = b[i].a1; a[i].a2 = b[i].a2; a[i].a3 = b[i].a3; a[i].a4 = b[i].a4; } } /* VMAT_CONTIGUOUS. */ void __attribute__((noipa)) foo2 (cdf3* a, cdf3* __restrict b) { for (int i = 0; i < N; ++i) { a[i].c1 = b[i].c1; a[i].c2 = b[i].c2; a[i].a1 = b[i].a1; a[i].a2 = b[i].a2; a[i].a3 = b[i].a3; a[i].a4 = b[i].a4; } } /* VMAT_STRIDED_SLP. */ void __attribute__((noipa)) foo3 (cdf4* a, cdf4* __restrict b) { for (int i = 0; i < N; ++i) { a[i].c1 = b[i].c1; a[i].c2 = b[i].c2; a[i].a1 = b[i].a1; a[i].a2 = b[i].a2; } } /* VMAT_CONTIGUOUS_REVERSE. */ void __attribute__((noipa)) foo4 (_Complex double* a, _Complex double* __restrict b) { for (int i = 0; i != N; i++) a[i] = b[N-i-1]; } /* VMAT_CONTIGUOUS_DOWN. */ void __attribute__((noipa)) foo5 (_Complex double* a, _Complex double* __restrict b) { for (int i = 0; i != N; i++) a[N-i-1] = b[0]; }