new file mode 100644
@@ -0,0 +1,223 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -std=gnu99 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+
+int zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
+int ones[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
+int twos[8] = { 2, 2, 2, 2, 2, 2, 2, 2 };
+
+void
+dep (void)
+{
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+
+ #pragma omp parallel
+ #pragma omp single
+ {
+ #pragma omp task shared (x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ }
+}
+
+void
+dep2 (void)
+{
+ #pragma omp parallel
+ #pragma omp single
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp task shared (x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp taskwait
+ }
+}
+
+void
+dep3 (void)
+{
+ #pragma omp parallel
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp single
+ {
+ #pragma omp task shared (x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ }
+ }
+}
+
+void
+firstpriv (void)
+{
+ #pragma omp parallel
+ #pragma omp single
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp task depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp task depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 1)))
+ __builtin_abort ();
+ }
+}
+
+void
+antidep (void)
+{
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp parallel
+ #pragma omp single
+ {
+ #pragma omp task shared(x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 1)))
+ __builtin_abort ();
+ #pragma omp task shared(x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ }
+}
+
+void
+antidep2 (void)
+{
+ #pragma omp parallel
+ #pragma omp single
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp taskgroup
+ {
+ #pragma omp task shared(x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 1)))
+ __builtin_abort ();
+ #pragma omp task shared(x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ }
+ }
+}
+
+void
+antidep3 (void)
+{
+ #pragma omp parallel
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp single
+ {
+ #pragma omp task shared(x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 1)))
+ __builtin_abort ();
+ #pragma omp task shared(x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ }
+ }
+}
+
+
+void
+outdep (void)
+{
+ #pragma omp parallel
+ #pragma omp single
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), zeros);
+ #pragma omp task shared(x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp task shared(x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp taskwait
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ }
+}
+
+void
+concurrent (void)
+{
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp parallel
+ #pragma omp single
+ {
+ #pragma omp task shared (x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ }
+}
+
+void
+concurrent2 (void)
+{
+ #pragma omp parallel
+ #pragma omp single
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp task shared (x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp taskwait
+ }
+}
+
+void
+concurrent3 (void)
+{
+ #pragma omp parallel
+ {
+ svint32_t x = svld1_s32 (svptrue_b32 (), ones);
+ #pragma omp single
+ {
+ #pragma omp task shared (x) depend(out: x)
+ x = svld1_s32 (svptrue_b32 (), twos);
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ #pragma omp task shared (x) depend(in: x)
+ if (svptest_any (svptrue_b32(), svcmpne_n_s32 (svptrue_b32 (), x, 2)))
+ __builtin_abort ();
+ }
+ }
+}
+
+int
+main ()
+{
+ dep ();
+ dep2 ();
+ dep3 ();
+ firstpriv ();
+ antidep ();
+ antidep2 ();
+ antidep3 ();
+ outdep ();
+ concurrent ();
+ concurrent2 ();
+ concurrent3 ();
+ return 0;
+}