/* { dg-require-effective-target vect_int } */ #include #include #include "tree-vect.h" #define N 50 #define TYPE uint8_t #ifndef DEBUG #define DEBUG 0 #endif #define BASE ((TYPE) -1 < 0 ? -126 : 4) __attribute__((noipa, noinline, optimize("O1"))) void fun1(TYPE* restrict pixel, TYPE level, int n) { for (int i = 0; i < n; i+=1) pixel[i] = (pixel[i] + level) / 0xff; } __attribute__((noipa, noinline, optimize("O3"))) void fun2(TYPE* restrict pixel, TYPE level, int n) { for (int i = 0; i < n; i+=1) pixel[i] = (pixel[i] + level) / 0xff; } int main () { TYPE a[N]; TYPE b[N]; for (int i = 0; i < N; ++i) { a[i] = BASE + i * 13; b[i] = BASE + i * 13; if (DEBUG) printf ("%d: 0x%x\n", i, a[i]); } fun1 (a, N / 2, N); fun2 (b, N / 2, N); #pragma GCC novector for (int i = 0; i < N; ++i) { if (DEBUG) printf ("%d = 0x%x == 0x%x\n", i, a[i], b[i]); if (a[i] != b[i]) __builtin_abort (); } return 0; } /* { dg-final { scan-tree-dump "divmod pattern recognized" "vect" { target aarch64*-*-* } } } */