aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Frontend/OpenACCTest.cpp
blob: 1209f50c90f2d438d554b544a96b690a8a32b8ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
//===- llvm/unittest/Frontend/OpenACCTest.cpp - OpenACC Frontend tests ----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Frontend/OpenACC/ACC.h.inc"
#include "gtest/gtest.h"

using namespace llvm;
using namespace acc;

namespace {

static const Clause AllClauses[] = {ACCC_unknown,
                                    ACCC_async,
                                    ACCC_attach,
                                    ACCC_auto,
                                    ACCC_bind,
                                    ACCC_capture,
                                    ACCC_collapse,
                                    ACCC_copy,
                                    ACCC_copyin,
                                    ACCC_copyout,
                                    ACCC_create,
                                    ACCC_default,
                                    ACCC_default_async,
                                    ACCC_delete,
                                    ACCC_detach,
                                    ACCC_device,
                                    ACCC_device_num,
                                    ACCC_deviceptr,
                                    ACCC_device_resident,
                                    ACCC_device_type,
                                    ACCC_finalize,
                                    ACCC_firstprivate,
                                    ACCC_gang,
                                    ACCC_host,
                                    ACCC_if,
                                    ACCC_if_present,
                                    ACCC_independent,
                                    ACCC_link,
                                    ACCC_no_create,
                                    ACCC_nohost,
                                    ACCC_num_gangs,
                                    ACCC_num_workers,
                                    ACCC_present,
                                    ACCC_private,
                                    ACCC_read,
                                    ACCC_reduction,
                                    ACCC_self,
                                    ACCC_seq,
                                    ACCC_tile,
                                    ACCC_unknown,
                                    ACCC_use_device,
                                    ACCC_vector,
                                    ACCC_vector_length,
                                    ACCC_wait,
                                    ACCC_worker,
                                    ACCC_write};

TEST(OpenACCTest, DirectiveHelpers) {
  EXPECT_EQ(getOpenACCDirectiveKind(""), ACCD_unknown);
  EXPECT_EQ(getOpenACCDirectiveKind("dummy"), ACCD_unknown);
  EXPECT_EQ(getOpenACCDirectiveKind("atomic"), ACCD_atomic);
  EXPECT_EQ(getOpenACCDirectiveKind("cache"), ACCD_cache);
  EXPECT_EQ(getOpenACCDirectiveKind("data"), ACCD_data);
  EXPECT_EQ(getOpenACCDirectiveKind("declare"), ACCD_declare);
  EXPECT_EQ(getOpenACCDirectiveKind("enter data"), ACCD_enter_data);
  EXPECT_EQ(getOpenACCDirectiveKind("exit data"), ACCD_exit_data);
  EXPECT_EQ(getOpenACCDirectiveKind("host_data"), ACCD_host_data);
  EXPECT_EQ(getOpenACCDirectiveKind("init"), ACCD_init);
  EXPECT_EQ(getOpenACCDirectiveKind("kernels"), ACCD_kernels);
  EXPECT_EQ(getOpenACCDirectiveKind("kernels loop"), ACCD_kernels_loop);
  EXPECT_EQ(getOpenACCDirectiveKind("loop"), ACCD_loop);
  EXPECT_EQ(getOpenACCDirectiveKind("parallel"), ACCD_parallel);
  EXPECT_EQ(getOpenACCDirectiveKind("parallel loop"), ACCD_parallel_loop);
  EXPECT_EQ(getOpenACCDirectiveKind("routine"), ACCD_routine);
  EXPECT_EQ(getOpenACCDirectiveKind("serial"), ACCD_serial);
  EXPECT_EQ(getOpenACCDirectiveKind("serial loop"), ACCD_serial_loop);
  EXPECT_EQ(getOpenACCDirectiveKind("set"), ACCD_set);
  EXPECT_EQ(getOpenACCDirectiveKind("shutdown"), ACCD_shutdown);
  EXPECT_EQ(getOpenACCDirectiveKind("unknown"), ACCD_unknown);
  EXPECT_EQ(getOpenACCDirectiveKind("update"), ACCD_update);
  EXPECT_EQ(getOpenACCDirectiveKind("wait"), ACCD_wait);

  EXPECT_EQ(getOpenACCDirectiveName(ACCD_atomic), "atomic");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_cache), "cache");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_data), "data");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_declare), "declare");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_enter_data), "enter data");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_exit_data), "exit data");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_host_data), "host_data");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_init), "init");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_kernels), "kernels");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_kernels_loop), "kernels loop");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_loop), "loop");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_parallel), "parallel");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_parallel_loop), "parallel loop");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_routine), "routine");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_serial), "serial");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_serial_loop), "serial loop");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_set), "set");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_shutdown), "shutdown");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_unknown), "unknown");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_update), "update");
  EXPECT_EQ(getOpenACCDirectiveName(ACCD_wait), "wait");
}

TEST(OpenACCTest, ClauseHelpers) {
  EXPECT_EQ(getOpenACCClauseKind(""), ACCC_unknown);
  EXPECT_EQ(getOpenACCClauseKind("dummy"), ACCC_unknown);
  EXPECT_EQ(getOpenACCClauseKind("async"), ACCC_async);
  EXPECT_EQ(getOpenACCClauseKind("attach"), ACCC_attach);
  EXPECT_EQ(getOpenACCClauseKind("auto"), ACCC_auto);
  EXPECT_EQ(getOpenACCClauseKind("bind"), ACCC_bind);
  EXPECT_EQ(getOpenACCClauseKind("capture"), ACCC_capture);
  EXPECT_EQ(getOpenACCClauseKind("collapse"), ACCC_collapse);
  EXPECT_EQ(getOpenACCClauseKind("copy"), ACCC_copy);
  EXPECT_EQ(getOpenACCClauseKind("copyin"), ACCC_copyin);
  EXPECT_EQ(getOpenACCClauseKind("copyout"), ACCC_copyout);
  EXPECT_EQ(getOpenACCClauseKind("create"), ACCC_create);
  EXPECT_EQ(getOpenACCClauseKind("default"), ACCC_default);
  EXPECT_EQ(getOpenACCClauseKind("default_async"), ACCC_default_async);
  EXPECT_EQ(getOpenACCClauseKind("delete"), ACCC_delete);
  EXPECT_EQ(getOpenACCClauseKind("detach"), ACCC_detach);
  EXPECT_EQ(getOpenACCClauseKind("device"), ACCC_device);
  EXPECT_EQ(getOpenACCClauseKind("device_num"), ACCC_device_num);
  EXPECT_EQ(getOpenACCClauseKind("deviceptr"), ACCC_deviceptr);
  EXPECT_EQ(getOpenACCClauseKind("device_resident"), ACCC_device_resident);
  EXPECT_EQ(getOpenACCClauseKind("device_type"), ACCC_device_type);
  EXPECT_EQ(getOpenACCClauseKind("finalize"), ACCC_finalize);
  EXPECT_EQ(getOpenACCClauseKind("firstprivate"), ACCC_firstprivate);
  EXPECT_EQ(getOpenACCClauseKind("gang"), ACCC_gang);
  EXPECT_EQ(getOpenACCClauseKind("host"), ACCC_host);
  EXPECT_EQ(getOpenACCClauseKind("if"), ACCC_if);
  EXPECT_EQ(getOpenACCClauseKind("if_present"), ACCC_if_present);
  EXPECT_EQ(getOpenACCClauseKind("independent"), ACCC_independent);
  EXPECT_EQ(getOpenACCClauseKind("link"), ACCC_link);
  EXPECT_EQ(getOpenACCClauseKind("no_create"), ACCC_no_create);
  EXPECT_EQ(getOpenACCClauseKind("nohost"), ACCC_nohost);
  EXPECT_EQ(getOpenACCClauseKind("num_gangs"), ACCC_num_gangs);
  EXPECT_EQ(getOpenACCClauseKind("num_workers"), ACCC_num_workers);
  EXPECT_EQ(getOpenACCClauseKind("present"), ACCC_present);
  EXPECT_EQ(getOpenACCClauseKind("private"), ACCC_private);
  EXPECT_EQ(getOpenACCClauseKind("read"), ACCC_read);
  EXPECT_EQ(getOpenACCClauseKind("reduction"), ACCC_reduction);
  EXPECT_EQ(getOpenACCClauseKind("self"), ACCC_self);
  EXPECT_EQ(getOpenACCClauseKind("seq"), ACCC_seq);
  EXPECT_EQ(getOpenACCClauseKind("tile"), ACCC_tile);
  EXPECT_EQ(getOpenACCClauseKind("unknown"), ACCC_unknown);
  EXPECT_EQ(getOpenACCClauseKind("use_device"), ACCC_use_device);
  EXPECT_EQ(getOpenACCClauseKind("vector"), ACCC_vector);
  EXPECT_EQ(getOpenACCClauseKind("vector_length"), ACCC_vector_length);
  EXPECT_EQ(getOpenACCClauseKind("wait"), ACCC_wait);
  EXPECT_EQ(getOpenACCClauseKind("worker"), ACCC_worker);
  EXPECT_EQ(getOpenACCClauseKind("write"), ACCC_write);

  EXPECT_EQ(getOpenACCClauseName(ACCC_async), "async");
  EXPECT_EQ(getOpenACCClauseName(ACCC_attach), "attach");
  EXPECT_EQ(getOpenACCClauseName(ACCC_auto), "auto");
  EXPECT_EQ(getOpenACCClauseName(ACCC_bind), "bind");
  EXPECT_EQ(getOpenACCClauseName(ACCC_capture), "capture");
  EXPECT_EQ(getOpenACCClauseName(ACCC_collapse), "collapse");
  EXPECT_EQ(getOpenACCClauseName(ACCC_copy), "copy");
  EXPECT_EQ(getOpenACCClauseName(ACCC_copyin), "copyin");
  EXPECT_EQ(getOpenACCClauseName(ACCC_copyout), "copyout");
  EXPECT_EQ(getOpenACCClauseName(ACCC_create), "create");
  EXPECT_EQ(getOpenACCClauseName(ACCC_default), "default");
  EXPECT_EQ(getOpenACCClauseName(ACCC_default_async), "default_async");
  EXPECT_EQ(getOpenACCClauseName(ACCC_delete), "delete");
  EXPECT_EQ(getOpenACCClauseName(ACCC_detach), "detach");
  EXPECT_EQ(getOpenACCClauseName(ACCC_device), "device");
  EXPECT_EQ(getOpenACCClauseName(ACCC_device_num), "device_num");
  EXPECT_EQ(getOpenACCClauseName(ACCC_deviceptr), "deviceptr");
  EXPECT_EQ(getOpenACCClauseName(ACCC_device_resident), "device_resident");
  EXPECT_EQ(getOpenACCClauseName(ACCC_device_type), "device_type");
  EXPECT_EQ(getOpenACCClauseName(ACCC_finalize), "finalize");
  EXPECT_EQ(getOpenACCClauseName(ACCC_firstprivate), "firstprivate");
  EXPECT_EQ(getOpenACCClauseName(ACCC_gang), "gang");
  EXPECT_EQ(getOpenACCClauseName(ACCC_host), "host");
  EXPECT_EQ(getOpenACCClauseName(ACCC_if), "if");
  EXPECT_EQ(getOpenACCClauseName(ACCC_if_present), "if_present");
  EXPECT_EQ(getOpenACCClauseName(ACCC_independent), "independent");
  EXPECT_EQ(getOpenACCClauseName(ACCC_link), "link");
  EXPECT_EQ(getOpenACCClauseName(ACCC_no_create), "no_create");
  EXPECT_EQ(getOpenACCClauseName(ACCC_nohost), "nohost");
  EXPECT_EQ(getOpenACCClauseName(ACCC_num_gangs), "num_gangs");
  EXPECT_EQ(getOpenACCClauseName(ACCC_num_workers), "num_workers");
  EXPECT_EQ(getOpenACCClauseName(ACCC_present), "present");
  EXPECT_EQ(getOpenACCClauseName(ACCC_private), "private");
  EXPECT_EQ(getOpenACCClauseName(ACCC_read), "read");
  EXPECT_EQ(getOpenACCClauseName(ACCC_reduction), "reduction");
  EXPECT_EQ(getOpenACCClauseName(ACCC_self), "self");
  EXPECT_EQ(getOpenACCClauseName(ACCC_seq), "seq");
  EXPECT_EQ(getOpenACCClauseName(ACCC_tile), "tile");
  EXPECT_EQ(getOpenACCClauseName(ACCC_unknown), "unknown");
  EXPECT_EQ(getOpenACCClauseName(ACCC_use_device), "use_device");
  EXPECT_EQ(getOpenACCClauseName(ACCC_vector), "vector");
  EXPECT_EQ(getOpenACCClauseName(ACCC_vector_length), "vector_length");
  EXPECT_EQ(getOpenACCClauseName(ACCC_wait), "wait");
  EXPECT_EQ(getOpenACCClauseName(ACCC_worker), "worker");
  EXPECT_EQ(getOpenACCClauseName(ACCC_write), "write");
}

static void expectAllowedClauses(Directive Dir, unsigned Version,
                                 const ArrayRef<Clause> &AllowedClauses) {
  SmallSet<Clause, 30> AllowedClausesSet;
  for (Clause Cl : AllowedClauses) {
    EXPECT_TRUE(isAllowedClauseForDirective(Dir, Cl, Version));
    AllowedClausesSet.insert(Cl);
  }

  for (Clause Cl : AllClauses) {
    if (!AllowedClausesSet.contains(Cl)) {
      EXPECT_FALSE(isAllowedClauseForDirective(Dir, Cl, Version));
    }
  }
}

TEST(OpenACCTest, AllowedClause) {
  expectAllowedClauses(ACCD_atomic, 3, {});
  expectAllowedClauses(ACCD_cache, 3, {});
  expectAllowedClauses(ACCD_unknown, 3, {});
  expectAllowedClauses(ACCD_parallel, 0, {}); // Version starts at 1

  expectAllowedClauses(ACCD_data, 3,
                       {ACCC_if, ACCC_attach, ACCC_copy, ACCC_copyin,
                        ACCC_copyout, ACCC_create, ACCC_default, ACCC_deviceptr,
                        ACCC_no_create, ACCC_present});

  expectAllowedClauses(ACCD_declare, 3,
                       {ACCC_copy, ACCC_copyin, ACCC_copyout, ACCC_create,
                        ACCC_present, ACCC_deviceptr, ACCC_device_resident,
                        ACCC_link});

  expectAllowedClauses(
      ACCD_enter_data, 3,
      {ACCC_async, ACCC_if, ACCC_wait, ACCC_attach, ACCC_create, ACCC_copyin});

  expectAllowedClauses(ACCD_exit_data, 3,
                       {ACCC_async, ACCC_if, ACCC_wait, ACCC_finalize,
                        ACCC_copyout, ACCC_delete, ACCC_detach});

  expectAllowedClauses(ACCD_host_data, 3,
                       {ACCC_if, ACCC_if_present, ACCC_use_device});

  expectAllowedClauses(ACCD_init, 3,
                       {ACCC_device_num, ACCC_device_type, ACCC_if});

  expectAllowedClauses(ACCD_kernels, 3,
                       {ACCC_attach, ACCC_copy, ACCC_copyin, ACCC_copyout,
                        ACCC_create, ACCC_device_type, ACCC_no_create,
                        ACCC_present, ACCC_deviceptr, ACCC_async, ACCC_default,
                        ACCC_if, ACCC_num_gangs, ACCC_num_workers, ACCC_self,
                        ACCC_vector_length, ACCC_wait});

  expectAllowedClauses(
      ACCD_kernels_loop, 3,
      {ACCC_copy,        ACCC_copyin,        ACCC_copyout, ACCC_create,
       ACCC_device_type, ACCC_no_create,     ACCC_present, ACCC_private,
       ACCC_reduction,   ACCC_deviceptr,     ACCC_attach,  ACCC_async,
       ACCC_collapse,    ACCC_default,       ACCC_gang,    ACCC_if,
       ACCC_num_gangs,   ACCC_num_workers,   ACCC_self,    ACCC_tile,
       ACCC_vector,      ACCC_vector_length, ACCC_wait,    ACCC_worker,
       ACCC_auto,        ACCC_independent,   ACCC_seq});

  expectAllowedClauses(ACCD_loop, 3,
                       {ACCC_device_type, ACCC_private, ACCC_reduction,
                        ACCC_collapse, ACCC_gang, ACCC_tile, ACCC_vector,
                        ACCC_worker, ACCC_auto, ACCC_independent, ACCC_seq});

  expectAllowedClauses(
      ACCD_parallel, 3,
      {ACCC_async,         ACCC_wait,         ACCC_num_gangs, ACCC_num_workers,
       ACCC_vector_length, ACCC_device_type,  ACCC_if,        ACCC_self,
       ACCC_copy,          ACCC_copyin,       ACCC_copyout,   ACCC_create,
       ACCC_no_create,     ACCC_present,      ACCC_deviceptr, ACCC_attach,
       ACCC_private,       ACCC_firstprivate, ACCC_reduction, ACCC_default});

  expectAllowedClauses(
      ACCD_parallel_loop, 3,
      {ACCC_attach,      ACCC_copy,      ACCC_copyin,      ACCC_copyout,
       ACCC_create,      ACCC_deviceptr, ACCC_device_type, ACCC_firstprivate,
       ACCC_no_create,   ACCC_present,   ACCC_private,     ACCC_reduction,
       ACCC_tile,        ACCC_wait,      ACCC_async,       ACCC_collapse,
       ACCC_default,     ACCC_gang,      ACCC_if,          ACCC_num_gangs,
       ACCC_num_workers, ACCC_self,      ACCC_vector,      ACCC_vector_length,
       ACCC_worker,      ACCC_auto,      ACCC_independent, ACCC_seq});

  expectAllowedClauses(ACCD_routine, 3,
                       {ACCC_bind, ACCC_device_type, ACCC_nohost, ACCC_gang,
                        ACCC_seq, ACCC_vector, ACCC_worker});

  expectAllowedClauses(ACCD_serial, 3,
                       {ACCC_attach, ACCC_copy, ACCC_copyin, ACCC_copyout,
                        ACCC_create, ACCC_deviceptr, ACCC_device_type,
                        ACCC_no_create, ACCC_present, ACCC_private,
                        ACCC_firstprivate, ACCC_reduction, ACCC_wait,
                        ACCC_async, ACCC_default, ACCC_if, ACCC_self});

  expectAllowedClauses(
      ACCD_serial_loop, 3,
      {ACCC_attach,    ACCC_copy,      ACCC_copyin,      ACCC_copyout,
       ACCC_create,    ACCC_deviceptr, ACCC_device_type, ACCC_firstprivate,
       ACCC_no_create, ACCC_present,   ACCC_private,     ACCC_reduction,
       ACCC_wait,      ACCC_async,     ACCC_collapse,    ACCC_default,
       ACCC_gang,      ACCC_if,        ACCC_self,        ACCC_tile,
       ACCC_vector,    ACCC_worker,    ACCC_auto,        ACCC_independent,
       ACCC_seq});

  expectAllowedClauses(
      ACCD_set, 3,
      {ACCC_default_async, ACCC_device_num, ACCC_device_type, ACCC_if});

  expectAllowedClauses(ACCD_shutdown, 3,
                       {ACCC_device_num, ACCC_device_type, ACCC_if});

  expectAllowedClauses(ACCD_update, 3,
                       {ACCC_async, ACCC_wait, ACCC_device_type, ACCC_if,
                        ACCC_if_present, ACCC_self, ACCC_host, ACCC_device});

  expectAllowedClauses(ACCD_wait, 3, {ACCC_async, ACCC_if});
}

} // namespace