1! { dg-do compile }
2! { dg-options "-fno-openmp -fopenmp-simd -fdump-tree-original -O2" }
3
4!$omp declare reduction (foo:integer:omp_out = omp_out + omp_in)
5  interface
6    integer function foo (x, y)
7      integer, value :: x, y
8!$omp declare simd (foo) linear (y : 2)
9    end function foo
10  end interface
11  integer :: i, a(64), b, c
12  integer, save :: d
13!$omp threadprivate (d)
14  d = 5
15  a = 6
16!$omp simd
17  do i = 1, 64
18    a(i) = foo (a(i), 2 * i)
19  end do
20  b = 0
21  c = 0
22!$omp simd reduction (+:b) reduction (foo:c)
23  do i = 1, 64
24    b = b + a(i)
25    c = c + a(i) * 2
26  end do
27  print *, b
28  b = 0
29!$omp parallel
30!$omp do simd schedule(static, 4) safelen (8) reduction (+:b)
31  do i = 1, 64
32    a(i) = a(i) + 1
33    b = b + 1
34  end do
35!$omp end parallel
36  print *, b
37  b = 0
38!$omp parallel do simd schedule(static, 4) safelen (8) &
39!$omp num_threads (4) if (.true.) reduction (+:b)
40  do i = 1, 64
41    a(i) = a(i) + 1
42    b = b + 1
43  end do
44  print *, b
45  b = 0
46!$omp parallel
47!$omp do simd schedule(static, 4) safelen (8) reduction (+:b)
48  do i = 1, 64
49    a(i) = a(i) + 1
50    b = b + 1
51  end do
52!$omp enddosimd
53!$omp end parallel
54  print *, b
55  b = 0
56!$omp parallel do simd schedule(static, 4) safelen (8) &
57!$omp num_threads (4) if (.true.) reduction (+:b)
58  do i = 1, 64
59    a(i) = a(i) + 1
60    b = b + 1
61  end do
62!$omp end parallel do simd
63!$omp atomic seq_cst
64  b = b + 1
65!$omp end atomic
66!$omp barrier
67!$omp parallel private (i)
68!$omp cancellation point parallel
69!$omp critical (bar)
70  b = b + 1
71!$omp end critical (bar)
72!$omp flush(b)
73!$omp single
74  b = b + 1
75!$omp end single
76!$omp do ordered
77  do i = 1, 10
78    !$omp atomic
79    b = b + 1
80    !$omp end atomic
81    !$omp ordered
82      print *, b
83    !$omp end ordered
84  end do
85!$omp end do
86!$omp master
87  b = b + 1
88!$omp end master
89!$omp cancel parallel
90!$omp end parallel
91!$omp parallel do schedule(runtime) num_threads(8)
92  do i = 1, 10
93    print *, b
94  end do
95!$omp end parallel do
96!$omp sections
97!$omp section
98  b = b + 1
99!$omp section
100  c = c + 1
101!$omp end sections
102  print *, b
103!$omp parallel sections firstprivate (b) if (.true.)
104!$omp section
105  b = b + 1
106!$omp section
107  c = c + 1
108!$omp endparallelsections
109!$omp workshare
110  b = 24
111!$omp end workshare
112!$omp parallel workshare num_threads (2)
113  b = b + 1
114  c = c + 1
115!$omp end parallel workshare
116  print *, b
117!$omp parallel
118!$omp single
119!$omp taskgroup
120!$omp task firstprivate (b)
121  b = b + 1
122!$omp taskyield
123!$omp end task
124!$omp task firstprivate (b)
125  b = b + 1
126!$omp end task
127!$omp taskwait
128!$omp end taskgroup
129!$omp end single
130!$omp end parallel
131  print *, a, c
132end
133
134! { dg-final { scan-tree-dump-times "pragma omp simd" 6 "original" } }
135! { dg-final { scan-tree-dump-times "pragma omp" 6 "original" } }
136! { dg-final { scan-tree-dump-times "__builtin_GOMP" 0 "original" } }
137