brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.4 KiB · 1209f50 Raw
332 lines · cpp
1//===- llvm/unittest/Frontend/OpenACCTest.cpp - OpenACC Frontend tests ----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ADT/ArrayRef.h"10#include "llvm/ADT/SmallSet.h"11#include "llvm/ADT/SmallVector.h"12#include "llvm/Frontend/OpenACC/ACC.h.inc"13#include "gtest/gtest.h"14 15using namespace llvm;16using namespace acc;17 18namespace {19 20static const Clause AllClauses[] = {ACCC_unknown,21                                    ACCC_async,22                                    ACCC_attach,23                                    ACCC_auto,24                                    ACCC_bind,25                                    ACCC_capture,26                                    ACCC_collapse,27                                    ACCC_copy,28                                    ACCC_copyin,29                                    ACCC_copyout,30                                    ACCC_create,31                                    ACCC_default,32                                    ACCC_default_async,33                                    ACCC_delete,34                                    ACCC_detach,35                                    ACCC_device,36                                    ACCC_device_num,37                                    ACCC_deviceptr,38                                    ACCC_device_resident,39                                    ACCC_device_type,40                                    ACCC_finalize,41                                    ACCC_firstprivate,42                                    ACCC_gang,43                                    ACCC_host,44                                    ACCC_if,45                                    ACCC_if_present,46                                    ACCC_independent,47                                    ACCC_link,48                                    ACCC_no_create,49                                    ACCC_nohost,50                                    ACCC_num_gangs,51                                    ACCC_num_workers,52                                    ACCC_present,53                                    ACCC_private,54                                    ACCC_read,55                                    ACCC_reduction,56                                    ACCC_self,57                                    ACCC_seq,58                                    ACCC_tile,59                                    ACCC_unknown,60                                    ACCC_use_device,61                                    ACCC_vector,62                                    ACCC_vector_length,63                                    ACCC_wait,64                                    ACCC_worker,65                                    ACCC_write};66 67TEST(OpenACCTest, DirectiveHelpers) {68  EXPECT_EQ(getOpenACCDirectiveKind(""), ACCD_unknown);69  EXPECT_EQ(getOpenACCDirectiveKind("dummy"), ACCD_unknown);70  EXPECT_EQ(getOpenACCDirectiveKind("atomic"), ACCD_atomic);71  EXPECT_EQ(getOpenACCDirectiveKind("cache"), ACCD_cache);72  EXPECT_EQ(getOpenACCDirectiveKind("data"), ACCD_data);73  EXPECT_EQ(getOpenACCDirectiveKind("declare"), ACCD_declare);74  EXPECT_EQ(getOpenACCDirectiveKind("enter data"), ACCD_enter_data);75  EXPECT_EQ(getOpenACCDirectiveKind("exit data"), ACCD_exit_data);76  EXPECT_EQ(getOpenACCDirectiveKind("host_data"), ACCD_host_data);77  EXPECT_EQ(getOpenACCDirectiveKind("init"), ACCD_init);78  EXPECT_EQ(getOpenACCDirectiveKind("kernels"), ACCD_kernels);79  EXPECT_EQ(getOpenACCDirectiveKind("kernels loop"), ACCD_kernels_loop);80  EXPECT_EQ(getOpenACCDirectiveKind("loop"), ACCD_loop);81  EXPECT_EQ(getOpenACCDirectiveKind("parallel"), ACCD_parallel);82  EXPECT_EQ(getOpenACCDirectiveKind("parallel loop"), ACCD_parallel_loop);83  EXPECT_EQ(getOpenACCDirectiveKind("routine"), ACCD_routine);84  EXPECT_EQ(getOpenACCDirectiveKind("serial"), ACCD_serial);85  EXPECT_EQ(getOpenACCDirectiveKind("serial loop"), ACCD_serial_loop);86  EXPECT_EQ(getOpenACCDirectiveKind("set"), ACCD_set);87  EXPECT_EQ(getOpenACCDirectiveKind("shutdown"), ACCD_shutdown);88  EXPECT_EQ(getOpenACCDirectiveKind("unknown"), ACCD_unknown);89  EXPECT_EQ(getOpenACCDirectiveKind("update"), ACCD_update);90  EXPECT_EQ(getOpenACCDirectiveKind("wait"), ACCD_wait);91 92  EXPECT_EQ(getOpenACCDirectiveName(ACCD_atomic), "atomic");93  EXPECT_EQ(getOpenACCDirectiveName(ACCD_cache), "cache");94  EXPECT_EQ(getOpenACCDirectiveName(ACCD_data), "data");95  EXPECT_EQ(getOpenACCDirectiveName(ACCD_declare), "declare");96  EXPECT_EQ(getOpenACCDirectiveName(ACCD_enter_data), "enter data");97  EXPECT_EQ(getOpenACCDirectiveName(ACCD_exit_data), "exit data");98  EXPECT_EQ(getOpenACCDirectiveName(ACCD_host_data), "host_data");99  EXPECT_EQ(getOpenACCDirectiveName(ACCD_init), "init");100  EXPECT_EQ(getOpenACCDirectiveName(ACCD_kernels), "kernels");101  EXPECT_EQ(getOpenACCDirectiveName(ACCD_kernels_loop), "kernels loop");102  EXPECT_EQ(getOpenACCDirectiveName(ACCD_loop), "loop");103  EXPECT_EQ(getOpenACCDirectiveName(ACCD_parallel), "parallel");104  EXPECT_EQ(getOpenACCDirectiveName(ACCD_parallel_loop), "parallel loop");105  EXPECT_EQ(getOpenACCDirectiveName(ACCD_routine), "routine");106  EXPECT_EQ(getOpenACCDirectiveName(ACCD_serial), "serial");107  EXPECT_EQ(getOpenACCDirectiveName(ACCD_serial_loop), "serial loop");108  EXPECT_EQ(getOpenACCDirectiveName(ACCD_set), "set");109  EXPECT_EQ(getOpenACCDirectiveName(ACCD_shutdown), "shutdown");110  EXPECT_EQ(getOpenACCDirectiveName(ACCD_unknown), "unknown");111  EXPECT_EQ(getOpenACCDirectiveName(ACCD_update), "update");112  EXPECT_EQ(getOpenACCDirectiveName(ACCD_wait), "wait");113}114 115TEST(OpenACCTest, ClauseHelpers) {116  EXPECT_EQ(getOpenACCClauseKind(""), ACCC_unknown);117  EXPECT_EQ(getOpenACCClauseKind("dummy"), ACCC_unknown);118  EXPECT_EQ(getOpenACCClauseKind("async"), ACCC_async);119  EXPECT_EQ(getOpenACCClauseKind("attach"), ACCC_attach);120  EXPECT_EQ(getOpenACCClauseKind("auto"), ACCC_auto);121  EXPECT_EQ(getOpenACCClauseKind("bind"), ACCC_bind);122  EXPECT_EQ(getOpenACCClauseKind("capture"), ACCC_capture);123  EXPECT_EQ(getOpenACCClauseKind("collapse"), ACCC_collapse);124  EXPECT_EQ(getOpenACCClauseKind("copy"), ACCC_copy);125  EXPECT_EQ(getOpenACCClauseKind("copyin"), ACCC_copyin);126  EXPECT_EQ(getOpenACCClauseKind("copyout"), ACCC_copyout);127  EXPECT_EQ(getOpenACCClauseKind("create"), ACCC_create);128  EXPECT_EQ(getOpenACCClauseKind("default"), ACCC_default);129  EXPECT_EQ(getOpenACCClauseKind("default_async"), ACCC_default_async);130  EXPECT_EQ(getOpenACCClauseKind("delete"), ACCC_delete);131  EXPECT_EQ(getOpenACCClauseKind("detach"), ACCC_detach);132  EXPECT_EQ(getOpenACCClauseKind("device"), ACCC_device);133  EXPECT_EQ(getOpenACCClauseKind("device_num"), ACCC_device_num);134  EXPECT_EQ(getOpenACCClauseKind("deviceptr"), ACCC_deviceptr);135  EXPECT_EQ(getOpenACCClauseKind("device_resident"), ACCC_device_resident);136  EXPECT_EQ(getOpenACCClauseKind("device_type"), ACCC_device_type);137  EXPECT_EQ(getOpenACCClauseKind("finalize"), ACCC_finalize);138  EXPECT_EQ(getOpenACCClauseKind("firstprivate"), ACCC_firstprivate);139  EXPECT_EQ(getOpenACCClauseKind("gang"), ACCC_gang);140  EXPECT_EQ(getOpenACCClauseKind("host"), ACCC_host);141  EXPECT_EQ(getOpenACCClauseKind("if"), ACCC_if);142  EXPECT_EQ(getOpenACCClauseKind("if_present"), ACCC_if_present);143  EXPECT_EQ(getOpenACCClauseKind("independent"), ACCC_independent);144  EXPECT_EQ(getOpenACCClauseKind("link"), ACCC_link);145  EXPECT_EQ(getOpenACCClauseKind("no_create"), ACCC_no_create);146  EXPECT_EQ(getOpenACCClauseKind("nohost"), ACCC_nohost);147  EXPECT_EQ(getOpenACCClauseKind("num_gangs"), ACCC_num_gangs);148  EXPECT_EQ(getOpenACCClauseKind("num_workers"), ACCC_num_workers);149  EXPECT_EQ(getOpenACCClauseKind("present"), ACCC_present);150  EXPECT_EQ(getOpenACCClauseKind("private"), ACCC_private);151  EXPECT_EQ(getOpenACCClauseKind("read"), ACCC_read);152  EXPECT_EQ(getOpenACCClauseKind("reduction"), ACCC_reduction);153  EXPECT_EQ(getOpenACCClauseKind("self"), ACCC_self);154  EXPECT_EQ(getOpenACCClauseKind("seq"), ACCC_seq);155  EXPECT_EQ(getOpenACCClauseKind("tile"), ACCC_tile);156  EXPECT_EQ(getOpenACCClauseKind("unknown"), ACCC_unknown);157  EXPECT_EQ(getOpenACCClauseKind("use_device"), ACCC_use_device);158  EXPECT_EQ(getOpenACCClauseKind("vector"), ACCC_vector);159  EXPECT_EQ(getOpenACCClauseKind("vector_length"), ACCC_vector_length);160  EXPECT_EQ(getOpenACCClauseKind("wait"), ACCC_wait);161  EXPECT_EQ(getOpenACCClauseKind("worker"), ACCC_worker);162  EXPECT_EQ(getOpenACCClauseKind("write"), ACCC_write);163 164  EXPECT_EQ(getOpenACCClauseName(ACCC_async), "async");165  EXPECT_EQ(getOpenACCClauseName(ACCC_attach), "attach");166  EXPECT_EQ(getOpenACCClauseName(ACCC_auto), "auto");167  EXPECT_EQ(getOpenACCClauseName(ACCC_bind), "bind");168  EXPECT_EQ(getOpenACCClauseName(ACCC_capture), "capture");169  EXPECT_EQ(getOpenACCClauseName(ACCC_collapse), "collapse");170  EXPECT_EQ(getOpenACCClauseName(ACCC_copy), "copy");171  EXPECT_EQ(getOpenACCClauseName(ACCC_copyin), "copyin");172  EXPECT_EQ(getOpenACCClauseName(ACCC_copyout), "copyout");173  EXPECT_EQ(getOpenACCClauseName(ACCC_create), "create");174  EXPECT_EQ(getOpenACCClauseName(ACCC_default), "default");175  EXPECT_EQ(getOpenACCClauseName(ACCC_default_async), "default_async");176  EXPECT_EQ(getOpenACCClauseName(ACCC_delete), "delete");177  EXPECT_EQ(getOpenACCClauseName(ACCC_detach), "detach");178  EXPECT_EQ(getOpenACCClauseName(ACCC_device), "device");179  EXPECT_EQ(getOpenACCClauseName(ACCC_device_num), "device_num");180  EXPECT_EQ(getOpenACCClauseName(ACCC_deviceptr), "deviceptr");181  EXPECT_EQ(getOpenACCClauseName(ACCC_device_resident), "device_resident");182  EXPECT_EQ(getOpenACCClauseName(ACCC_device_type), "device_type");183  EXPECT_EQ(getOpenACCClauseName(ACCC_finalize), "finalize");184  EXPECT_EQ(getOpenACCClauseName(ACCC_firstprivate), "firstprivate");185  EXPECT_EQ(getOpenACCClauseName(ACCC_gang), "gang");186  EXPECT_EQ(getOpenACCClauseName(ACCC_host), "host");187  EXPECT_EQ(getOpenACCClauseName(ACCC_if), "if");188  EXPECT_EQ(getOpenACCClauseName(ACCC_if_present), "if_present");189  EXPECT_EQ(getOpenACCClauseName(ACCC_independent), "independent");190  EXPECT_EQ(getOpenACCClauseName(ACCC_link), "link");191  EXPECT_EQ(getOpenACCClauseName(ACCC_no_create), "no_create");192  EXPECT_EQ(getOpenACCClauseName(ACCC_nohost), "nohost");193  EXPECT_EQ(getOpenACCClauseName(ACCC_num_gangs), "num_gangs");194  EXPECT_EQ(getOpenACCClauseName(ACCC_num_workers), "num_workers");195  EXPECT_EQ(getOpenACCClauseName(ACCC_present), "present");196  EXPECT_EQ(getOpenACCClauseName(ACCC_private), "private");197  EXPECT_EQ(getOpenACCClauseName(ACCC_read), "read");198  EXPECT_EQ(getOpenACCClauseName(ACCC_reduction), "reduction");199  EXPECT_EQ(getOpenACCClauseName(ACCC_self), "self");200  EXPECT_EQ(getOpenACCClauseName(ACCC_seq), "seq");201  EXPECT_EQ(getOpenACCClauseName(ACCC_tile), "tile");202  EXPECT_EQ(getOpenACCClauseName(ACCC_unknown), "unknown");203  EXPECT_EQ(getOpenACCClauseName(ACCC_use_device), "use_device");204  EXPECT_EQ(getOpenACCClauseName(ACCC_vector), "vector");205  EXPECT_EQ(getOpenACCClauseName(ACCC_vector_length), "vector_length");206  EXPECT_EQ(getOpenACCClauseName(ACCC_wait), "wait");207  EXPECT_EQ(getOpenACCClauseName(ACCC_worker), "worker");208  EXPECT_EQ(getOpenACCClauseName(ACCC_write), "write");209}210 211static void expectAllowedClauses(Directive Dir, unsigned Version,212                                 const ArrayRef<Clause> &AllowedClauses) {213  SmallSet<Clause, 30> AllowedClausesSet;214  for (Clause Cl : AllowedClauses) {215    EXPECT_TRUE(isAllowedClauseForDirective(Dir, Cl, Version));216    AllowedClausesSet.insert(Cl);217  }218 219  for (Clause Cl : AllClauses) {220    if (!AllowedClausesSet.contains(Cl)) {221      EXPECT_FALSE(isAllowedClauseForDirective(Dir, Cl, Version));222    }223  }224}225 226TEST(OpenACCTest, AllowedClause) {227  expectAllowedClauses(ACCD_atomic, 3, {});228  expectAllowedClauses(ACCD_cache, 3, {});229  expectAllowedClauses(ACCD_unknown, 3, {});230  expectAllowedClauses(ACCD_parallel, 0, {}); // Version starts at 1231 232  expectAllowedClauses(ACCD_data, 3,233                       {ACCC_if, ACCC_attach, ACCC_copy, ACCC_copyin,234                        ACCC_copyout, ACCC_create, ACCC_default, ACCC_deviceptr,235                        ACCC_no_create, ACCC_present});236 237  expectAllowedClauses(ACCD_declare, 3,238                       {ACCC_copy, ACCC_copyin, ACCC_copyout, ACCC_create,239                        ACCC_present, ACCC_deviceptr, ACCC_device_resident,240                        ACCC_link});241 242  expectAllowedClauses(243      ACCD_enter_data, 3,244      {ACCC_async, ACCC_if, ACCC_wait, ACCC_attach, ACCC_create, ACCC_copyin});245 246  expectAllowedClauses(ACCD_exit_data, 3,247                       {ACCC_async, ACCC_if, ACCC_wait, ACCC_finalize,248                        ACCC_copyout, ACCC_delete, ACCC_detach});249 250  expectAllowedClauses(ACCD_host_data, 3,251                       {ACCC_if, ACCC_if_present, ACCC_use_device});252 253  expectAllowedClauses(ACCD_init, 3,254                       {ACCC_device_num, ACCC_device_type, ACCC_if});255 256  expectAllowedClauses(ACCD_kernels, 3,257                       {ACCC_attach, ACCC_copy, ACCC_copyin, ACCC_copyout,258                        ACCC_create, ACCC_device_type, ACCC_no_create,259                        ACCC_present, ACCC_deviceptr, ACCC_async, ACCC_default,260                        ACCC_if, ACCC_num_gangs, ACCC_num_workers, ACCC_self,261                        ACCC_vector_length, ACCC_wait});262 263  expectAllowedClauses(264      ACCD_kernels_loop, 3,265      {ACCC_copy,        ACCC_copyin,        ACCC_copyout, ACCC_create,266       ACCC_device_type, ACCC_no_create,     ACCC_present, ACCC_private,267       ACCC_reduction,   ACCC_deviceptr,     ACCC_attach,  ACCC_async,268       ACCC_collapse,    ACCC_default,       ACCC_gang,    ACCC_if,269       ACCC_num_gangs,   ACCC_num_workers,   ACCC_self,    ACCC_tile,270       ACCC_vector,      ACCC_vector_length, ACCC_wait,    ACCC_worker,271       ACCC_auto,        ACCC_independent,   ACCC_seq});272 273  expectAllowedClauses(ACCD_loop, 3,274                       {ACCC_device_type, ACCC_private, ACCC_reduction,275                        ACCC_collapse, ACCC_gang, ACCC_tile, ACCC_vector,276                        ACCC_worker, ACCC_auto, ACCC_independent, ACCC_seq});277 278  expectAllowedClauses(279      ACCD_parallel, 3,280      {ACCC_async,         ACCC_wait,         ACCC_num_gangs, ACCC_num_workers,281       ACCC_vector_length, ACCC_device_type,  ACCC_if,        ACCC_self,282       ACCC_copy,          ACCC_copyin,       ACCC_copyout,   ACCC_create,283       ACCC_no_create,     ACCC_present,      ACCC_deviceptr, ACCC_attach,284       ACCC_private,       ACCC_firstprivate, ACCC_reduction, ACCC_default});285 286  expectAllowedClauses(287      ACCD_parallel_loop, 3,288      {ACCC_attach,      ACCC_copy,      ACCC_copyin,      ACCC_copyout,289       ACCC_create,      ACCC_deviceptr, ACCC_device_type, ACCC_firstprivate,290       ACCC_no_create,   ACCC_present,   ACCC_private,     ACCC_reduction,291       ACCC_tile,        ACCC_wait,      ACCC_async,       ACCC_collapse,292       ACCC_default,     ACCC_gang,      ACCC_if,          ACCC_num_gangs,293       ACCC_num_workers, ACCC_self,      ACCC_vector,      ACCC_vector_length,294       ACCC_worker,      ACCC_auto,      ACCC_independent, ACCC_seq});295 296  expectAllowedClauses(ACCD_routine, 3,297                       {ACCC_bind, ACCC_device_type, ACCC_nohost, ACCC_gang,298                        ACCC_seq, ACCC_vector, ACCC_worker});299 300  expectAllowedClauses(ACCD_serial, 3,301                       {ACCC_attach, ACCC_copy, ACCC_copyin, ACCC_copyout,302                        ACCC_create, ACCC_deviceptr, ACCC_device_type,303                        ACCC_no_create, ACCC_present, ACCC_private,304                        ACCC_firstprivate, ACCC_reduction, ACCC_wait,305                        ACCC_async, ACCC_default, ACCC_if, ACCC_self});306 307  expectAllowedClauses(308      ACCD_serial_loop, 3,309      {ACCC_attach,    ACCC_copy,      ACCC_copyin,      ACCC_copyout,310       ACCC_create,    ACCC_deviceptr, ACCC_device_type, ACCC_firstprivate,311       ACCC_no_create, ACCC_present,   ACCC_private,     ACCC_reduction,312       ACCC_wait,      ACCC_async,     ACCC_collapse,    ACCC_default,313       ACCC_gang,      ACCC_if,        ACCC_self,        ACCC_tile,314       ACCC_vector,    ACCC_worker,    ACCC_auto,        ACCC_independent,315       ACCC_seq});316 317  expectAllowedClauses(318      ACCD_set, 3,319      {ACCC_default_async, ACCC_device_num, ACCC_device_type, ACCC_if});320 321  expectAllowedClauses(ACCD_shutdown, 3,322                       {ACCC_device_num, ACCC_device_type, ACCC_if});323 324  expectAllowedClauses(ACCD_update, 3,325                       {ACCC_async, ACCC_wait, ACCC_device_type, ACCC_if,326                        ACCC_if_present, ACCC_self, ACCC_host, ACCC_device});327 328  expectAllowedClauses(ACCD_wait, 3, {ACCC_async, ACCC_if});329}330 331} // namespace332