xref: /llvm-project/llvm/unittests/Frontend/OpenMPCompositionTest.cpp (revision 4631e7bad6984beca9f790d01d7e07dd47d407bb)
170d3ddb2SKrzysztof Parzyszek //===- llvm/unittests/Frontend/OpenMPCompositionTest.cpp ------------------===//
270d3ddb2SKrzysztof Parzyszek //
370d3ddb2SKrzysztof Parzyszek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
470d3ddb2SKrzysztof Parzyszek // See https://llvm.org/LICENSE.txt for license information.
570d3ddb2SKrzysztof Parzyszek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
670d3ddb2SKrzysztof Parzyszek //
770d3ddb2SKrzysztof Parzyszek //===----------------------------------------------------------------------===//
870d3ddb2SKrzysztof Parzyszek 
970d3ddb2SKrzysztof Parzyszek #include "llvm/ADT/ArrayRef.h"
10d577518dSKrzysztof Parzyszek #include "llvm/ADT/SmallVector.h"
1170d3ddb2SKrzysztof Parzyszek #include "llvm/Frontend/OpenMP/OMP.h"
1270d3ddb2SKrzysztof Parzyszek #include "gtest/gtest.h"
1370d3ddb2SKrzysztof Parzyszek 
1470d3ddb2SKrzysztof Parzyszek using namespace llvm;
1570d3ddb2SKrzysztof Parzyszek using namespace llvm::omp;
1670d3ddb2SKrzysztof Parzyszek 
TEST(Composition,GetLeafConstructs)1770d3ddb2SKrzysztof Parzyszek TEST(Composition, GetLeafConstructs) {
1870d3ddb2SKrzysztof Parzyszek   ArrayRef<Directive> L1 = getLeafConstructs(OMPD_loop);
1970d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(L1, (ArrayRef<Directive>{}));
2070d3ddb2SKrzysztof Parzyszek   ArrayRef<Directive> L2 = getLeafConstructs(OMPD_parallel_for);
2170d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(L2, (ArrayRef<Directive>{OMPD_parallel, OMPD_for}));
2270d3ddb2SKrzysztof Parzyszek   ArrayRef<Directive> L3 = getLeafConstructs(OMPD_parallel_for_simd);
2370d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(L3, (ArrayRef<Directive>{OMPD_parallel, OMPD_for, OMPD_simd}));
2470d3ddb2SKrzysztof Parzyszek }
2570d3ddb2SKrzysztof Parzyszek 
TEST(Composition,GetLeafConstructsOrSelf)26*4631e7baSKrzysztof Parzyszek TEST(Composition, GetLeafConstructsOrSelf) {
27*4631e7baSKrzysztof Parzyszek   ArrayRef<Directive> L1 = getLeafConstructsOrSelf(OMPD_loop);
28*4631e7baSKrzysztof Parzyszek   ASSERT_EQ(L1, (ArrayRef<Directive>{OMPD_loop}));
29*4631e7baSKrzysztof Parzyszek   ArrayRef<Directive> L2 = getLeafConstructsOrSelf(OMPD_parallel_for);
30*4631e7baSKrzysztof Parzyszek   ASSERT_EQ(L2, (ArrayRef<Directive>{OMPD_parallel, OMPD_for}));
31*4631e7baSKrzysztof Parzyszek   ArrayRef<Directive> L3 = getLeafConstructsOrSelf(OMPD_parallel_for_simd);
32*4631e7baSKrzysztof Parzyszek   ASSERT_EQ(L3, (ArrayRef<Directive>{OMPD_parallel, OMPD_for, OMPD_simd}));
33*4631e7baSKrzysztof Parzyszek }
34*4631e7baSKrzysztof Parzyszek 
TEST(Composition,GetCompoundConstruct)3570d3ddb2SKrzysztof Parzyszek TEST(Composition, GetCompoundConstruct) {
3670d3ddb2SKrzysztof Parzyszek   Directive C1 =
3770d3ddb2SKrzysztof Parzyszek       getCompoundConstruct({OMPD_target, OMPD_teams, OMPD_distribute});
3870d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(C1, OMPD_target_teams_distribute);
3970d3ddb2SKrzysztof Parzyszek   Directive C2 = getCompoundConstruct({OMPD_target});
4070d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(C2, OMPD_target);
4170d3ddb2SKrzysztof Parzyszek   Directive C3 = getCompoundConstruct({OMPD_target, OMPD_masked});
4270d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(C3, OMPD_unknown);
4370d3ddb2SKrzysztof Parzyszek   Directive C4 = getCompoundConstruct({OMPD_target, OMPD_teams_distribute});
4470d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(C4, OMPD_target_teams_distribute);
4570d3ddb2SKrzysztof Parzyszek   Directive C5 = getCompoundConstruct({});
4670d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(C5, OMPD_unknown);
4770d3ddb2SKrzysztof Parzyszek   Directive C6 = getCompoundConstruct({OMPD_parallel_for, OMPD_simd});
4870d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(C6, OMPD_parallel_for_simd);
4970d3ddb2SKrzysztof Parzyszek   Directive C7 = getCompoundConstruct({OMPD_do, OMPD_simd});
5070d3ddb2SKrzysztof Parzyszek   ASSERT_EQ(C7, OMPD_do_simd); // Make sure it's not OMPD_end_do_simd
5170d3ddb2SKrzysztof Parzyszek }
5270d3ddb2SKrzysztof Parzyszek 
TEST(Composition,GetLeafOrCompositeConstructs)53d577518dSKrzysztof Parzyszek TEST(Composition, GetLeafOrCompositeConstructs) {
54d577518dSKrzysztof Parzyszek   SmallVector<Directive> Out1;
55d577518dSKrzysztof Parzyszek   auto Ret1 = getLeafOrCompositeConstructs(
56d577518dSKrzysztof Parzyszek       OMPD_target_teams_distribute_parallel_for, Out1);
57d577518dSKrzysztof Parzyszek   ASSERT_EQ(Ret1, ArrayRef<Directive>(Out1));
58d577518dSKrzysztof Parzyszek   ASSERT_EQ((ArrayRef<Directive>(Out1)),
59d577518dSKrzysztof Parzyszek             (ArrayRef<Directive>{OMPD_target, OMPD_teams,
60d577518dSKrzysztof Parzyszek                                  OMPD_distribute_parallel_for}));
61d577518dSKrzysztof Parzyszek 
62d577518dSKrzysztof Parzyszek   SmallVector<Directive> Out2;
63d577518dSKrzysztof Parzyszek   auto Ret2 =
64d577518dSKrzysztof Parzyszek       getLeafOrCompositeConstructs(OMPD_parallel_masked_taskloop_simd, Out2);
65d577518dSKrzysztof Parzyszek   ASSERT_EQ(Ret2, ArrayRef<Directive>(Out2));
66d577518dSKrzysztof Parzyszek   ASSERT_EQ(
67d577518dSKrzysztof Parzyszek       (ArrayRef<Directive>(Out2)),
68d577518dSKrzysztof Parzyszek       (ArrayRef<Directive>{OMPD_parallel, OMPD_masked, OMPD_taskloop_simd}));
69d577518dSKrzysztof Parzyszek 
70d577518dSKrzysztof Parzyszek   SmallVector<Directive> Out3;
71d577518dSKrzysztof Parzyszek   auto Ret3 =
72d577518dSKrzysztof Parzyszek       getLeafOrCompositeConstructs(OMPD_distribute_parallel_do_simd, Out3);
73d577518dSKrzysztof Parzyszek   ASSERT_EQ(Ret3, ArrayRef<Directive>(Out3));
74d577518dSKrzysztof Parzyszek   ASSERT_EQ((ArrayRef<Directive>(Out3)),
75d577518dSKrzysztof Parzyszek             (ArrayRef<Directive>{OMPD_distribute_parallel_do_simd}));
76d577518dSKrzysztof Parzyszek 
77d577518dSKrzysztof Parzyszek   SmallVector<Directive> Out4;
78d577518dSKrzysztof Parzyszek   auto Ret4 = getLeafOrCompositeConstructs(OMPD_target_parallel_loop, Out4);
79d577518dSKrzysztof Parzyszek   ASSERT_EQ(Ret4, ArrayRef<Directive>(Out4));
80d577518dSKrzysztof Parzyszek   ASSERT_EQ((ArrayRef<Directive>(Out4)),
81d577518dSKrzysztof Parzyszek             (ArrayRef<Directive>{OMPD_target, OMPD_parallel, OMPD_loop}));
82d577518dSKrzysztof Parzyszek }
83d577518dSKrzysztof Parzyszek 
TEST(Composition,IsLeafConstruct)8470d3ddb2SKrzysztof Parzyszek TEST(Composition, IsLeafConstruct) {
8570d3ddb2SKrzysztof Parzyszek   ASSERT_TRUE(isLeafConstruct(OMPD_loop));
8670d3ddb2SKrzysztof Parzyszek   ASSERT_TRUE(isLeafConstruct(OMPD_teams));
8770d3ddb2SKrzysztof Parzyszek   ASSERT_FALSE(isLeafConstruct(OMPD_for_simd));
8870d3ddb2SKrzysztof Parzyszek   ASSERT_FALSE(isLeafConstruct(OMPD_distribute_simd));
8970d3ddb2SKrzysztof Parzyszek   ASSERT_FALSE(isLeafConstruct(OMPD_parallel_for));
9070d3ddb2SKrzysztof Parzyszek }
9170d3ddb2SKrzysztof Parzyszek 
TEST(Composition,IsCompositeConstruct)9270d3ddb2SKrzysztof Parzyszek TEST(Composition, IsCompositeConstruct) {
9370d3ddb2SKrzysztof Parzyszek   ASSERT_TRUE(isCompositeConstruct(OMPD_distribute_simd));
9470d3ddb2SKrzysztof Parzyszek   ASSERT_FALSE(isCompositeConstruct(OMPD_for));
9570d3ddb2SKrzysztof Parzyszek   ASSERT_TRUE(isCompositeConstruct(OMPD_for_simd));
9670d3ddb2SKrzysztof Parzyszek   // directive-name-A = "parallel", directive-name-B = "for simd",
9770d3ddb2SKrzysztof Parzyszek   // only directive-name-B is loop-associated, so this is not a
9870d3ddb2SKrzysztof Parzyszek   // composite construct, even though "for simd" is.
9970d3ddb2SKrzysztof Parzyszek   ASSERT_FALSE(isCompositeConstruct(OMPD_parallel_for_simd));
10070d3ddb2SKrzysztof Parzyszek }
10170d3ddb2SKrzysztof Parzyszek 
TEST(Composition,IsCombinedConstruct)10270d3ddb2SKrzysztof Parzyszek TEST(Composition, IsCombinedConstruct) {
10370d3ddb2SKrzysztof Parzyszek   // "parallel for simd" is a combined construct, see comment in
10470d3ddb2SKrzysztof Parzyszek   // IsCompositeConstruct.
10570d3ddb2SKrzysztof Parzyszek   ASSERT_TRUE(isCombinedConstruct(OMPD_parallel_for_simd));
10670d3ddb2SKrzysztof Parzyszek   ASSERT_FALSE(isCombinedConstruct(OMPD_for_simd));
10770d3ddb2SKrzysztof Parzyszek   ASSERT_TRUE(isCombinedConstruct(OMPD_parallel_for));
10870d3ddb2SKrzysztof Parzyszek   ASSERT_FALSE(isCombinedConstruct(OMPD_parallel));
10970d3ddb2SKrzysztof Parzyszek }
110