|  | //===- llvm/unittests/Frontend/OpenMPCompositionTest.cpp ------------------===// | 
|  | // | 
|  | // 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/SmallVector.h" | 
|  | #include "llvm/Frontend/OpenMP/OMP.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | using namespace llvm; | 
|  | using namespace llvm::omp; | 
|  |  | 
|  | TEST(Composition, GetLeafConstructs) { | 
|  | ArrayRef<Directive> L1 = getLeafConstructs(OMPD_loop); | 
|  | ASSERT_EQ(L1, (ArrayRef<Directive>{})); | 
|  | ArrayRef<Directive> L2 = getLeafConstructs(OMPD_parallel_for); | 
|  | ASSERT_EQ(L2, (ArrayRef<Directive>{OMPD_parallel, OMPD_for})); | 
|  | ArrayRef<Directive> L3 = getLeafConstructs(OMPD_parallel_for_simd); | 
|  | ASSERT_EQ(L3, (ArrayRef<Directive>{OMPD_parallel, OMPD_for, OMPD_simd})); | 
|  | } | 
|  |  | 
|  | TEST(Composition, GetLeafConstructsOrSelf) { | 
|  | ArrayRef<Directive> L1 = getLeafConstructsOrSelf(OMPD_loop); | 
|  | ASSERT_EQ(L1, (ArrayRef<Directive>{OMPD_loop})); | 
|  | ArrayRef<Directive> L2 = getLeafConstructsOrSelf(OMPD_parallel_for); | 
|  | ASSERT_EQ(L2, (ArrayRef<Directive>{OMPD_parallel, OMPD_for})); | 
|  | ArrayRef<Directive> L3 = getLeafConstructsOrSelf(OMPD_parallel_for_simd); | 
|  | ASSERT_EQ(L3, (ArrayRef<Directive>{OMPD_parallel, OMPD_for, OMPD_simd})); | 
|  | } | 
|  |  | 
|  | TEST(Composition, GetCompoundConstruct) { | 
|  | Directive C1 = | 
|  | getCompoundConstruct({OMPD_target, OMPD_teams, OMPD_distribute}); | 
|  | ASSERT_EQ(C1, OMPD_target_teams_distribute); | 
|  | Directive C2 = getCompoundConstruct({OMPD_target}); | 
|  | ASSERT_EQ(C2, OMPD_target); | 
|  | Directive C3 = getCompoundConstruct({OMPD_target, OMPD_masked}); | 
|  | ASSERT_EQ(C3, OMPD_unknown); | 
|  | Directive C4 = getCompoundConstruct({OMPD_target, OMPD_teams_distribute}); | 
|  | ASSERT_EQ(C4, OMPD_target_teams_distribute); | 
|  | Directive C5 = getCompoundConstruct({}); | 
|  | ASSERT_EQ(C5, OMPD_unknown); | 
|  | Directive C6 = getCompoundConstruct({OMPD_parallel_for, OMPD_simd}); | 
|  | ASSERT_EQ(C6, OMPD_parallel_for_simd); | 
|  | Directive C7 = getCompoundConstruct({OMPD_do, OMPD_simd}); | 
|  | ASSERT_EQ(C7, OMPD_do_simd); // Make sure it's not OMPD_end_do_simd | 
|  | } | 
|  |  | 
|  | TEST(Composition, GetLeafOrCompositeConstructs) { | 
|  | SmallVector<Directive> Out1; | 
|  | auto Ret1 = getLeafOrCompositeConstructs( | 
|  | OMPD_target_teams_distribute_parallel_for, Out1); | 
|  | ASSERT_EQ(Ret1, ArrayRef<Directive>(Out1)); | 
|  | ASSERT_EQ((ArrayRef<Directive>(Out1)), | 
|  | (ArrayRef<Directive>{OMPD_target, OMPD_teams, | 
|  | OMPD_distribute_parallel_for})); | 
|  |  | 
|  | SmallVector<Directive> Out2; | 
|  | auto Ret2 = | 
|  | getLeafOrCompositeConstructs(OMPD_parallel_masked_taskloop_simd, Out2); | 
|  | ASSERT_EQ(Ret2, ArrayRef<Directive>(Out2)); | 
|  | ASSERT_EQ( | 
|  | (ArrayRef<Directive>(Out2)), | 
|  | (ArrayRef<Directive>{OMPD_parallel, OMPD_masked, OMPD_taskloop_simd})); | 
|  |  | 
|  | SmallVector<Directive> Out3; | 
|  | auto Ret3 = | 
|  | getLeafOrCompositeConstructs(OMPD_distribute_parallel_do_simd, Out3); | 
|  | ASSERT_EQ(Ret3, ArrayRef<Directive>(Out3)); | 
|  | ASSERT_EQ((ArrayRef<Directive>(Out3)), | 
|  | (ArrayRef<Directive>{OMPD_distribute_parallel_do_simd})); | 
|  |  | 
|  | SmallVector<Directive> Out4; | 
|  | auto Ret4 = getLeafOrCompositeConstructs(OMPD_target_parallel_loop, Out4); | 
|  | ASSERT_EQ(Ret4, ArrayRef<Directive>(Out4)); | 
|  | ASSERT_EQ((ArrayRef<Directive>(Out4)), | 
|  | (ArrayRef<Directive>{OMPD_target, OMPD_parallel, OMPD_loop})); | 
|  | } | 
|  |  | 
|  | TEST(Composition, IsLeafConstruct) { | 
|  | ASSERT_TRUE(isLeafConstruct(OMPD_loop)); | 
|  | ASSERT_TRUE(isLeafConstruct(OMPD_teams)); | 
|  | ASSERT_FALSE(isLeafConstruct(OMPD_for_simd)); | 
|  | ASSERT_FALSE(isLeafConstruct(OMPD_distribute_simd)); | 
|  | ASSERT_FALSE(isLeafConstruct(OMPD_parallel_for)); | 
|  | } | 
|  |  | 
|  | TEST(Composition, IsCompositeConstruct) { | 
|  | ASSERT_TRUE(isCompositeConstruct(OMPD_distribute_simd)); | 
|  | ASSERT_FALSE(isCompositeConstruct(OMPD_for)); | 
|  | ASSERT_TRUE(isCompositeConstruct(OMPD_for_simd)); | 
|  | // directive-name-A = "parallel", directive-name-B = "for simd", | 
|  | // only directive-name-B is loop-associated, so this is not a | 
|  | // composite construct, even though "for simd" is. | 
|  | ASSERT_FALSE(isCompositeConstruct(OMPD_parallel_for_simd)); | 
|  | } | 
|  |  | 
|  | TEST(Composition, IsCombinedConstruct) { | 
|  | // "parallel for simd" is a combined construct, see comment in | 
|  | // IsCompositeConstruct. | 
|  | ASSERT_TRUE(isCombinedConstruct(OMPD_parallel_for_simd)); | 
|  | ASSERT_FALSE(isCombinedConstruct(OMPD_for_simd)); | 
|  | ASSERT_TRUE(isCombinedConstruct(OMPD_parallel_for)); | 
|  | ASSERT_FALSE(isCombinedConstruct(OMPD_parallel)); | 
|  | } |