//===- 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 L1 = getLeafConstructs(OMPD_loop); ASSERT_EQ(L1, (ArrayRef{})); ArrayRef L2 = getLeafConstructs(OMPD_parallel_for); ASSERT_EQ(L2, (ArrayRef{OMPD_parallel, OMPD_for})); ArrayRef L3 = getLeafConstructs(OMPD_parallel_for_simd); ASSERT_EQ(L3, (ArrayRef{OMPD_parallel, OMPD_for, OMPD_simd})); } TEST(Composition, GetLeafConstructsOrSelf) { ArrayRef L1 = getLeafConstructsOrSelf(OMPD_loop); ASSERT_EQ(L1, (ArrayRef{OMPD_loop})); ArrayRef L2 = getLeafConstructsOrSelf(OMPD_parallel_for); ASSERT_EQ(L2, (ArrayRef{OMPD_parallel, OMPD_for})); ArrayRef L3 = getLeafConstructsOrSelf(OMPD_parallel_for_simd); ASSERT_EQ(L3, (ArrayRef{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 Out1; auto Ret1 = getLeafOrCompositeConstructs( OMPD_target_teams_distribute_parallel_for, Out1); ASSERT_EQ(Ret1, ArrayRef(Out1)); ASSERT_EQ((ArrayRef(Out1)), (ArrayRef{OMPD_target, OMPD_teams, OMPD_distribute_parallel_for})); SmallVector Out2; auto Ret2 = getLeafOrCompositeConstructs(OMPD_parallel_masked_taskloop_simd, Out2); ASSERT_EQ(Ret2, ArrayRef(Out2)); ASSERT_EQ( (ArrayRef(Out2)), (ArrayRef{OMPD_parallel, OMPD_masked, OMPD_taskloop_simd})); SmallVector Out3; auto Ret3 = getLeafOrCompositeConstructs(OMPD_distribute_parallel_do_simd, Out3); ASSERT_EQ(Ret3, ArrayRef(Out3)); ASSERT_EQ((ArrayRef(Out3)), (ArrayRef{OMPD_distribute_parallel_do_simd})); SmallVector Out4; auto Ret4 = getLeafOrCompositeConstructs(OMPD_target_parallel_loop, Out4); ASSERT_EQ(Ret4, ArrayRef(Out4)); ASSERT_EQ((ArrayRef(Out4)), (ArrayRef{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)); }