1! { dg-do compile }
2! { dg-additional-options "-foffload=disable -fdump-tree-gimple" }
3! { dg-additional-options "-mavx512bw -mavx512vl" { target { i?86-*-* x86_64-*-* } } }
4
5program main
6  !$omp requires atomic_default_mem_order(seq_cst)
7contains
8  subroutine f01 ()
9  end subroutine
10
11  subroutine f02 ()
12  end subroutine
13
14  subroutine f03 ()
15  end subroutine
16
17  subroutine f04 ()
18    !$omp declare variant (f01) match (device={isa("avx512f","avx512vl")}) ! 16
19    !$omp declare variant (f02) match (implementation={vendor(score(15):gnu)})
20    !$omp declare variant (f03) match (user={condition(score(11):1)})
21  end subroutine
22
23  subroutine f05 ()
24  end subroutine
25
26  subroutine f06 ()
27  end subroutine
28
29  subroutine f07 ()
30  end subroutine
31
32  subroutine f08 ()
33    !$omp declare variant (f05) match (device={isa(avx512f,avx512vl)}) ! 16
34    !$omp declare variant (f06) match (implementation={vendor(score(15):gnu)})
35    !$omp declare variant (f07) match (user={condition(score(17):1)})
36  end subroutine
37
38  subroutine f09 ()
39  end subroutine
40
41  subroutine f10 ()
42  end subroutine
43
44  subroutine f11 ()
45  end subroutine
46
47  subroutine f12 ()
48  end subroutine
49
50  subroutine f13 ()
51    !$omp declare variant (f09) match (device={arch(x86_64)},user={condition(score(65):1)}) ! 64+65
52    !$omp declare variant (f10) match (implementation={vendor(score(127):"gnu")})
53    !$omp declare variant (f11) match (device={isa(ssse3)}) ! 128
54    !$omp declare variant (f12) match (implementation={atomic_default_mem_order(score(126):seq_cst)})
55  end subroutine
56
57  subroutine f14 ()
58  end subroutine
59
60  subroutine f15 ()
61  end subroutine
62
63  subroutine f16 ()
64  end subroutine
65
66  subroutine f17 ()
67    !$omp declare variant (f14) match (construct={teams,parallel,do}) ! 16+8+4
68    !$omp declare variant (f15) match (construct={parallel},user={condition(score(19):1)}) ! 8+19
69    !$omp declare variant (f16) match (implementation={atomic_default_mem_order(score(27):seq_cst)})
70  end subroutine
71
72  subroutine f18 ()
73  end subroutine
74
75  subroutine f19 ()
76  end subroutine
77
78  subroutine f20 ()
79  end subroutine
80
81  subroutine f21 ()
82    !$omp declare variant (f18) match (construct={teams,parallel,do}) ! 16+8+4
83    !$omp declare variant (f19) match (construct={do},user={condition(score(25):1)}) ! 4+25
84    !$omp declare variant (f20) match (implementation={atomic_default_mem_order(score(28):seq_cst)})
85  end subroutine
86
87  subroutine f22 ()
88  end subroutine
89
90  subroutine f23 ()
91  end subroutine
92
93  subroutine f24 ()
94  end subroutine
95
96  subroutine f25 ()
97    !$omp declare variant (f22) match (construct={parallel,do}) ! 2+1
98    !$omp declare variant (f23) match (construct={do}) ! 0
99    !$omp declare variant (f24) match (implementation={atomic_default_mem_order(score(2):seq_cst)})
100  end subroutine
101
102  subroutine f26 ()
103  end subroutine
104
105  subroutine f27 ()
106  end subroutine
107
108  subroutine f28 ()
109  end subroutine
110
111  subroutine f29 ()
112    !$omp declare variant (f26) match (construct={parallel,do}) ! 2+1
113    !$omp declare variant (f27) match (construct={do},user={condition(1)}) ! 4
114    !$omp declare variant (f28) match (implementation={atomic_default_mem_order(score(3):seq_cst)})
115  end subroutine
116
117  subroutine test1 ()
118    integer :: i, j
119
120    !$omp parallel do	! 2 constructs in OpenMP context, isa has score 2^4.
121    do i = 1, 2
122      call f04 ()	! { dg-final { scan-tree-dump-times "f01 \\\(\\\);" 1 "gimple" { target i?86-*-* x86_64-*-* } } }
123			! { dg-final { scan-tree-dump-times "f02 \\\(\\\);" 1 "gimple" { target { ! { i?86-*-* x86_64-*-* } } } } }
124    end do
125    !$omp end parallel do
126
127    !$omp target teams	! 2 constructs in OpenMP context, isa has score 2^4.
128      call f08 ()	! { dg-final { scan-tree-dump-times "f07 \\\(\\\);" 1 "gimple" } }
129    !$omp end target teams
130
131    !$omp teams
132    !$omp parallel do
133    do i = 1, 2
134      !$omp parallel do	! 5 constructs in OpenMP context, arch is 2^6, isa 2^7.
135      do j = 1, 2
136	  call f13 ()	! { dg-final { scan-tree-dump-times "f09 \\\(\\\);" 1 "gimple" { target { { i?86-*-* x86_64-*-* } && lp64 } } } }
137			! { dg-final { scan-tree-dump-times "f11 \\\(\\\);" 1 "gimple" { target { { i?86-*-* x86_64-*-* } && { ! lp64 } } } } }
138			! { dg-final { scan-tree-dump-times "f10 \\\(\\\);" 1 "gimple" { target { ! { i?86-*-* x86_64-*-* } } } } }
139	  call f17 ()	! { dg-final { scan-tree-dump-times "f14 \\\(\\\);" 1 "gimple" } }
140	  call f21 ()	! { dg-final { scan-tree-dump-times "f19 \\\(\\\);" 1 "gimple" } }
141      end do
142      !$omp end parallel do
143    end do
144    !$omp end parallel do
145    !$omp end teams
146
147    !$omp do
148    do i = 1, 2
149      !$omp parallel do
150      do j = 1, 2
151	call f25 ();	! { dg-final { scan-tree-dump-times "f22 \\\(\\\);" 1 "gimple" } }
152	call f29 ();	! { dg-final { scan-tree-dump-times "f27 \\\(\\\);" 1 "gimple" } }
153      end do
154      !$omp end parallel do
155    end do
156    !$omp end do
157  end subroutine
158end program
159
160