1  /* PR tree-optimization/69760 */
       2  /* { dg-do run { target { { *-*-linux* *-*-gnu* *-*-uclinux* } && mmap } } } */
       3  
       4  #include <unistd.h>
       5  #include <sys/mman.h>
       6  
       7  __attribute__((noinline, noclone)) static void
       8  test_func (double *a, int L, int m, int n, int N)
       9  {
      10    int i, k;
      11    for (i = 0; i < N; i++)
      12      {
      13        k = i - m;
      14        if (k >= 0 && k < n)
      15  	a[L * k] = 0.0;
      16      }
      17  }
      18  
      19  int
      20  main ()
      21  {
      22    char *p;
      23    int L, m, n, N;
      24    long l;
      25    L = 10000000;
      26    n = 4;
      27    N = 100 * n;
      28    long pgsz = sysconf(_SC_PAGESIZE);
      29    if (pgsz < sizeof (double) || pgsz > L * sizeof (double))
      30      return 0;
      31    p = mmap ((void *) 0, L * n * sizeof (double), PROT_NONE,
      32  	    MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
      33    if (p == MAP_FAILED)
      34      return 0;
      35    if (mprotect (p, pgsz, PROT_READ | PROT_WRITE))
      36      return 0;
      37    l = (L * sizeof (double)) / pgsz * pgsz;
      38    if (mprotect (p + l, pgsz, PROT_READ | PROT_WRITE))
      39      return 0;
      40    l = (2 * L * sizeof (double)) / pgsz * pgsz;
      41    if (mprotect (p + l, pgsz, PROT_READ | PROT_WRITE))
      42      return 0;
      43    l = (3 * L * sizeof (double)) / pgsz * pgsz;
      44    if (mprotect (p + l, pgsz, PROT_READ | PROT_WRITE))
      45      return 0;
      46    for (m = 0; m < N; m += n)
      47      test_func ((double *) p, L, m, n, N);
      48    return 0;
      49  }