/* { dg-do run { target aarch64_sve256_hw } } */
/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */

#include <arm_sve.h>
#include <omp.h>

static void __attribute__ ((noipa))
compare_vec (svint32_t *x, svint32_t y)
{
  svbool_t p = svnot_b_z (svptrue_b32 (), svcmpeq_s32 (svptrue_b32 (), *x, y));

  if (svptest_any (svptrue_b32 (), p))
    __builtin_abort ();
}

void __attribute__ ((noipa))
private ()
{
  svint32_t a;
#pragma omp parallel private (a) num_threads (10)
  {
    a = svindex_s32 (omp_get_thread_num (), 0);

#pragma omp barrier
    compare_vec (&a, svindex_s32 (omp_get_thread_num (), 0));
  }
}

void __attribute__ ((noipa))
firstprivate ()
{
  svint32_t a = svindex_s32 (1,1);
  svint32_t b;

#pragma omp parallel private (b) firstprivate (a) num_threads (12)
  {
    compare_vec (&a, svindex_s32 (1, 1));
    b = svindex_s32 (omp_get_thread_num (), 0);

#pragma omp barrier
    compare_vec (&a, svindex_s32 (1, 1));
    compare_vec (&b, svindex_s32 (omp_get_thread_num (), 0));
    if (omp_get_thread_num () == 5)
      {
	a = svindex_s32 (1, 2);
	b = svindex_s32 (10, 0);
      }

#pragma omp barrier
    if (omp_get_thread_num () == 5)
      {
	compare_vec (&a, svindex_s32 (1, 2));
	compare_vec (&b, svindex_s32 (10, 0));
      }
    else
      {
	compare_vec (&a, svindex_s32 (1, 1));
	compare_vec (&b, svindex_s32 (omp_get_thread_num (), 0));
      }
  }
}

void __attribute__ ((noipa))
lastprivate ()
{
  svint32_t a = svindex_s32 (1,1);
  svint32_t b;
  int i;

#pragma omp parallel for private (a) lastprivate (b)
  for (i = 0; i < 16; i++)
    {
      b = svindex_s32 (i, 0);

      compare_vec (&b, svindex_s32 (i, 0));
      if (i == 5)
	{
	  a = svindex_s32 (1, 2);
	  b = svindex_s32 (10, 0);
	}
      else
	a = svindex_s32 (1, 1);

      if (i == 5)
	{
	  compare_vec (&a, svindex_s32 (1, 2));
	  compare_vec (&b, svindex_s32 (10, 0));
	}
      else
	{
	  compare_vec (&a, svindex_s32 (1, 1));
	  compare_vec (&b, svindex_s32 (i, 0));
	}
    }

  compare_vec (&b, svindex_s32 (15, 0));
}

int
main ()
{
  private ();
  firstprivate ();
  lastprivate ();
}
