xref: /llvm-project/llvm/unittests/Frontend/OpenMPContextTest.cpp (revision 62c7f035b4392c1933550eead6ddab35122720bc)
1c953409fSJohannes Doerfert //===- unittest/IR/OpenMPContextTest.cpp - OpenMP Context handling tests --===//
2c953409fSJohannes Doerfert //
3c953409fSJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c953409fSJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information.
5c953409fSJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c953409fSJohannes Doerfert //
7c953409fSJohannes Doerfert //===----------------------------------------------------------------------===//
8c953409fSJohannes Doerfert 
9c953409fSJohannes Doerfert #include "llvm/Frontend/OpenMP/OMPConstants.h"
10c953409fSJohannes Doerfert #include "llvm/Frontend/OpenMP/OMPContext.h"
11*62c7f035SArchibald Elliott #include "llvm/TargetParser/Triple.h"
12c953409fSJohannes Doerfert #include "gtest/gtest.h"
13c953409fSJohannes Doerfert 
14c953409fSJohannes Doerfert using namespace llvm;
15c953409fSJohannes Doerfert using namespace omp;
16c953409fSJohannes Doerfert 
17c953409fSJohannes Doerfert namespace {
18c953409fSJohannes Doerfert 
19c953409fSJohannes Doerfert class OpenMPContextTest : public testing::Test {
20c953409fSJohannes Doerfert protected:
SetUp()21c953409fSJohannes Doerfert   void SetUp() override {}
22c953409fSJohannes Doerfert 
TearDown()23c953409fSJohannes Doerfert   void TearDown() override {}
24c953409fSJohannes Doerfert };
25c953409fSJohannes Doerfert 
TEST_F(OpenMPContextTest,RoundTripAndAssociation)26c953409fSJohannes Doerfert TEST_F(OpenMPContextTest, RoundTripAndAssociation) {
27c953409fSJohannes Doerfert #define OMP_TRAIT_SET(Enum, Str)                                               \
28c953409fSJohannes Doerfert   EXPECT_EQ(TraitSet::Enum,                                                    \
29c953409fSJohannes Doerfert             getOpenMPContextTraitSetKind(                                      \
30c953409fSJohannes Doerfert                 getOpenMPContextTraitSetName(TraitSet::Enum)));                \
31c953409fSJohannes Doerfert   EXPECT_EQ(Str,                                                               \
32c953409fSJohannes Doerfert             getOpenMPContextTraitSetName(getOpenMPContextTraitSetKind(Str)));
33c953409fSJohannes Doerfert #define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, RequiresProperty)          \
34c953409fSJohannes Doerfert   EXPECT_EQ(TraitSelector::Enum,                                               \
35c953409fSJohannes Doerfert             getOpenMPContextTraitSelectorKind(                                 \
36c953409fSJohannes Doerfert                 getOpenMPContextTraitSelectorName(TraitSelector::Enum)));      \
37c953409fSJohannes Doerfert   EXPECT_EQ(Str, getOpenMPContextTraitSelectorName(                            \
38c953409fSJohannes Doerfert                      getOpenMPContextTraitSelectorKind(Str)));
39c953409fSJohannes Doerfert #define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str)         \
40c953409fSJohannes Doerfert   EXPECT_EQ(TraitProperty::Enum,                                               \
41c953409fSJohannes Doerfert             getOpenMPContextTraitPropertyKind(                                 \
42ee05167cSJohannes Doerfert                 TraitSet::TraitSetEnum, TraitSelector::TraitSelectorEnum,      \
43ee05167cSJohannes Doerfert                 getOpenMPContextTraitPropertyName(TraitProperty::Enum, Str))); \
441228d42dSJohannes Doerfert   EXPECT_EQ(Str, getOpenMPContextTraitPropertyName(                            \
45ee05167cSJohannes Doerfert                      getOpenMPContextTraitPropertyKind(                        \
46ee05167cSJohannes Doerfert                          TraitSet::TraitSetEnum,                               \
47ee05167cSJohannes Doerfert                          TraitSelector::TraitSelectorEnum, Str),               \
48ee05167cSJohannes Doerfert                      Str));                                                    \
49c953409fSJohannes Doerfert   EXPECT_EQ(TraitSet::TraitSetEnum,                                            \
50c953409fSJohannes Doerfert             getOpenMPContextTraitSetForProperty(TraitProperty::Enum));         \
51c953409fSJohannes Doerfert   EXPECT_EQ(TraitSelector::TraitSelectorEnum,                                  \
52c953409fSJohannes Doerfert             getOpenMPContextTraitSelectorForProperty(TraitProperty::Enum));
53c953409fSJohannes Doerfert #include "llvm/Frontend/OpenMP/OMPKinds.def"
54c953409fSJohannes Doerfert }
55c953409fSJohannes Doerfert 
TEST_F(OpenMPContextTest,ValidNesting)56c953409fSJohannes Doerfert TEST_F(OpenMPContextTest, ValidNesting) {
57c953409fSJohannes Doerfert   bool AllowsTraitScore, ReqProperty;
58c953409fSJohannes Doerfert #define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, RequiresProperty)          \
59c953409fSJohannes Doerfert   EXPECT_TRUE(isValidTraitSelectorForTraitSet(TraitSelector::Enum,             \
60c953409fSJohannes Doerfert                                               TraitSet::TraitSetEnum,          \
61c953409fSJohannes Doerfert                                               AllowsTraitScore, ReqProperty)); \
62c953409fSJohannes Doerfert   EXPECT_EQ(RequiresProperty, ReqProperty);
63c953409fSJohannes Doerfert #define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str)         \
64c953409fSJohannes Doerfert   EXPECT_TRUE(isValidTraitPropertyForTraitSetAndSelector(                      \
65c953409fSJohannes Doerfert       TraitProperty::Enum, TraitSelector::TraitSelectorEnum,                   \
66c953409fSJohannes Doerfert       TraitSet::TraitSetEnum));
67c953409fSJohannes Doerfert #include "llvm/Frontend/OpenMP/OMPKinds.def"
68c953409fSJohannes Doerfert }
69c953409fSJohannes Doerfert 
TEST_F(OpenMPContextTest,ApplicabilityNonConstruct)70c953409fSJohannes Doerfert TEST_F(OpenMPContextTest, ApplicabilityNonConstruct) {
71c953409fSJohannes Doerfert   OMPContext HostLinux(false, Triple("x86_64-unknown-linux"));
72c953409fSJohannes Doerfert   OMPContext DeviceLinux(true, Triple("x86_64-unknown-linux"));
73c953409fSJohannes Doerfert   OMPContext HostNVPTX(false, Triple("nvptx64-nvidia-cuda"));
74c953409fSJohannes Doerfert   OMPContext DeviceNVPTX(true, Triple("nvptx64-nvidia-cuda"));
75c953409fSJohannes Doerfert 
76c953409fSJohannes Doerfert   VariantMatchInfo Empty;
77c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(Empty, HostLinux));
78c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(Empty, DeviceLinux));
79c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(Empty, HostNVPTX));
80c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(Empty, DeviceNVPTX));
81c953409fSJohannes Doerfert 
82c953409fSJohannes Doerfert   VariantMatchInfo UserCondFalse;
83ee05167cSJohannes Doerfert   UserCondFalse.addTrait(TraitProperty::user_condition_false, "");
84c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, HostLinux));
85c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, DeviceLinux));
86c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, HostNVPTX));
87c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, DeviceNVPTX));
88c953409fSJohannes Doerfert 
89c953409fSJohannes Doerfert   VariantMatchInfo DeviceArchArm;
90ee05167cSJohannes Doerfert   DeviceArchArm.addTrait(TraitProperty::device_arch_arm, "");
91c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, HostLinux));
92c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, DeviceLinux));
93c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, HostNVPTX));
94c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, DeviceNVPTX));
95c953409fSJohannes Doerfert 
96c953409fSJohannes Doerfert   VariantMatchInfo LLVMHostUserCondTrue;
97ee05167cSJohannes Doerfert   LLVMHostUserCondTrue.addTrait(TraitProperty::implementation_vendor_llvm, "");
98ee05167cSJohannes Doerfert   LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_host, "");
99ee05167cSJohannes Doerfert   LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_any, "");
100ee05167cSJohannes Doerfert   LLVMHostUserCondTrue.addTrait(TraitProperty::user_condition_true, "");
101c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrue, HostLinux));
102c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue, DeviceLinux));
103c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrue, HostNVPTX));
104c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue, DeviceNVPTX));
105c953409fSJohannes Doerfert 
106c953409fSJohannes Doerfert   VariantMatchInfo LLVMHostUserCondTrueCPU = LLVMHostUserCondTrue;
107ee05167cSJohannes Doerfert   LLVMHostUserCondTrueCPU.addTrait(TraitProperty::device_kind_cpu, "");
108c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU, HostLinux));
109c953409fSJohannes Doerfert   EXPECT_FALSE(
110c953409fSJohannes Doerfert       isVariantApplicableInContext(LLVMHostUserCondTrueCPU, DeviceLinux));
111c953409fSJohannes Doerfert   EXPECT_FALSE(
112c953409fSJohannes Doerfert       isVariantApplicableInContext(LLVMHostUserCondTrueCPU, HostNVPTX));
113c953409fSJohannes Doerfert   EXPECT_FALSE(
114c953409fSJohannes Doerfert       isVariantApplicableInContext(LLVMHostUserCondTrueCPU, DeviceNVPTX));
115c953409fSJohannes Doerfert 
116c953409fSJohannes Doerfert   VariantMatchInfo GPU;
117ee05167cSJohannes Doerfert   GPU.addTrait(TraitProperty::device_kind_gpu, "");
118c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(GPU, HostLinux));
119c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(GPU, DeviceLinux));
120c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(GPU, HostNVPTX));
121c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(GPU, DeviceNVPTX));
122c953409fSJohannes Doerfert 
123c953409fSJohannes Doerfert   VariantMatchInfo NoHost;
124ee05167cSJohannes Doerfert   NoHost.addTrait(TraitProperty::device_kind_nohost, "");
125c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(NoHost, HostLinux));
126c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(NoHost, DeviceLinux));
127c953409fSJohannes Doerfert   EXPECT_FALSE(isVariantApplicableInContext(NoHost, HostNVPTX));
128c953409fSJohannes Doerfert   EXPECT_TRUE(isVariantApplicableInContext(NoHost, DeviceNVPTX));
129c953409fSJohannes Doerfert }
130c953409fSJohannes Doerfert 
TEST_F(OpenMPContextTest,ApplicabilityAllTraits)131c953409fSJohannes Doerfert TEST_F(OpenMPContextTest, ApplicabilityAllTraits) {
132c953409fSJohannes Doerfert   OMPContext HostLinuxParallelParallel(false, Triple("x86_64-unknown-linux"));
133c953409fSJohannes Doerfert   HostLinuxParallelParallel.addTrait(
134c953409fSJohannes Doerfert       TraitProperty::construct_parallel_parallel);
135c953409fSJohannes Doerfert   HostLinuxParallelParallel.addTrait(
136c953409fSJohannes Doerfert       TraitProperty::construct_parallel_parallel);
137c953409fSJohannes Doerfert   OMPContext DeviceLinuxTargetParallel(true, Triple("x86_64-unknown-linux"));
138c953409fSJohannes Doerfert   DeviceLinuxTargetParallel.addTrait(TraitProperty::construct_target_target);
139c953409fSJohannes Doerfert   DeviceLinuxTargetParallel.addTrait(
140c953409fSJohannes Doerfert       TraitProperty::construct_parallel_parallel);
141c953409fSJohannes Doerfert   OMPContext HostNVPTXFor(false, Triple("nvptx64-nvidia-cuda"));
142c953409fSJohannes Doerfert   HostNVPTXFor.addTrait(TraitProperty::construct_for_for);
143c953409fSJohannes Doerfert   OMPContext DeviceNVPTXTargetTeamsParallel(true,
144c953409fSJohannes Doerfert                                             Triple("nvptx64-nvidia-cuda"));
145c953409fSJohannes Doerfert   DeviceNVPTXTargetTeamsParallel.addTrait(
146c953409fSJohannes Doerfert       TraitProperty::construct_target_target);
147c953409fSJohannes Doerfert   DeviceNVPTXTargetTeamsParallel.addTrait(TraitProperty::construct_teams_teams);
148c953409fSJohannes Doerfert   DeviceNVPTXTargetTeamsParallel.addTrait(
149c953409fSJohannes Doerfert       TraitProperty::construct_parallel_parallel);
150c953409fSJohannes Doerfert 
151c953409fSJohannes Doerfert   { // non-construct variants
152c953409fSJohannes Doerfert     VariantMatchInfo Empty;
153c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(Empty, HostLinuxParallelParallel));
154c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(Empty, DeviceLinuxTargetParallel));
155c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(Empty, HostNVPTXFor));
156c953409fSJohannes Doerfert     EXPECT_TRUE(
157c953409fSJohannes Doerfert         isVariantApplicableInContext(Empty, DeviceNVPTXTargetTeamsParallel));
158c953409fSJohannes Doerfert 
159c953409fSJohannes Doerfert     VariantMatchInfo UserCondFalse;
160ee05167cSJohannes Doerfert     UserCondFalse.addTrait(TraitProperty::user_condition_false, "");
161c953409fSJohannes Doerfert     EXPECT_FALSE(
162c953409fSJohannes Doerfert         isVariantApplicableInContext(UserCondFalse, HostLinuxParallelParallel));
163c953409fSJohannes Doerfert     EXPECT_FALSE(
164c953409fSJohannes Doerfert         isVariantApplicableInContext(UserCondFalse, DeviceLinuxTargetParallel));
165c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, HostNVPTXFor));
166c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse,
167c953409fSJohannes Doerfert                                               DeviceNVPTXTargetTeamsParallel));
168c953409fSJohannes Doerfert 
169c953409fSJohannes Doerfert     VariantMatchInfo DeviceArchArm;
170ee05167cSJohannes Doerfert     DeviceArchArm.addTrait(TraitProperty::device_arch_arm, "");
171c953409fSJohannes Doerfert     EXPECT_FALSE(
172c953409fSJohannes Doerfert         isVariantApplicableInContext(DeviceArchArm, HostLinuxParallelParallel));
173c953409fSJohannes Doerfert     EXPECT_FALSE(
174c953409fSJohannes Doerfert         isVariantApplicableInContext(DeviceArchArm, DeviceLinuxTargetParallel));
175c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, HostNVPTXFor));
176c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm,
177c953409fSJohannes Doerfert                                               DeviceNVPTXTargetTeamsParallel));
178c953409fSJohannes Doerfert 
179c953409fSJohannes Doerfert     APInt Score(32, 1000);
180c953409fSJohannes Doerfert     VariantMatchInfo LLVMHostUserCondTrue;
181ee05167cSJohannes Doerfert     LLVMHostUserCondTrue.addTrait(TraitProperty::implementation_vendor_llvm,
182ee05167cSJohannes Doerfert                                   "");
183ee05167cSJohannes Doerfert     LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_host, "");
184ee05167cSJohannes Doerfert     LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_any, "");
185ee05167cSJohannes Doerfert     LLVMHostUserCondTrue.addTrait(TraitProperty::user_condition_true, "",
186ee05167cSJohannes Doerfert                                   &Score);
187c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrue,
188c953409fSJohannes Doerfert                                              HostLinuxParallelParallel));
189c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue,
190c953409fSJohannes Doerfert                                               DeviceLinuxTargetParallel));
191c953409fSJohannes Doerfert     EXPECT_TRUE(
192c953409fSJohannes Doerfert         isVariantApplicableInContext(LLVMHostUserCondTrue, HostNVPTXFor));
193c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue,
194c953409fSJohannes Doerfert                                               DeviceNVPTXTargetTeamsParallel));
195c953409fSJohannes Doerfert 
196c953409fSJohannes Doerfert     VariantMatchInfo LLVMHostUserCondTrueCPU = LLVMHostUserCondTrue;
197ee05167cSJohannes Doerfert     LLVMHostUserCondTrueCPU.addTrait(TraitProperty::device_kind_cpu, "");
198c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU,
199c953409fSJohannes Doerfert                                              HostLinuxParallelParallel));
200c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU,
201c953409fSJohannes Doerfert                                               DeviceLinuxTargetParallel));
202c953409fSJohannes Doerfert     EXPECT_FALSE(
203c953409fSJohannes Doerfert         isVariantApplicableInContext(LLVMHostUserCondTrueCPU, HostNVPTXFor));
204c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU,
205c953409fSJohannes Doerfert                                               DeviceNVPTXTargetTeamsParallel));
206c953409fSJohannes Doerfert 
207c953409fSJohannes Doerfert     VariantMatchInfo GPU;
208ee05167cSJohannes Doerfert     GPU.addTrait(TraitProperty::device_kind_gpu, "");
209c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPU, HostLinuxParallelParallel));
210c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPU, DeviceLinuxTargetParallel));
211c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(GPU, HostNVPTXFor));
212c953409fSJohannes Doerfert     EXPECT_TRUE(
213c953409fSJohannes Doerfert         isVariantApplicableInContext(GPU, DeviceNVPTXTargetTeamsParallel));
214c953409fSJohannes Doerfert 
215c953409fSJohannes Doerfert     VariantMatchInfo NoHost;
216ee05167cSJohannes Doerfert     NoHost.addTrait(TraitProperty::device_kind_nohost, "");
217c953409fSJohannes Doerfert     EXPECT_FALSE(
218c953409fSJohannes Doerfert         isVariantApplicableInContext(NoHost, HostLinuxParallelParallel));
219c953409fSJohannes Doerfert     EXPECT_TRUE(
220c953409fSJohannes Doerfert         isVariantApplicableInContext(NoHost, DeviceLinuxTargetParallel));
221c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(NoHost, HostNVPTXFor));
222c953409fSJohannes Doerfert     EXPECT_TRUE(
223c953409fSJohannes Doerfert         isVariantApplicableInContext(NoHost, DeviceNVPTXTargetTeamsParallel));
224c953409fSJohannes Doerfert   }
225c953409fSJohannes Doerfert   { // variants with all sets
226c953409fSJohannes Doerfert     VariantMatchInfo DeviceArchArmParallel;
227ee05167cSJohannes Doerfert     DeviceArchArmParallel.addTrait(TraitProperty::construct_parallel_parallel,
228ee05167cSJohannes Doerfert                                    "");
229ee05167cSJohannes Doerfert     DeviceArchArmParallel.addTrait(TraitProperty::device_arch_arm, "");
230c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArmParallel,
231c953409fSJohannes Doerfert                                               HostLinuxParallelParallel));
232c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArmParallel,
233c953409fSJohannes Doerfert                                               DeviceLinuxTargetParallel));
234c953409fSJohannes Doerfert     EXPECT_FALSE(
235c953409fSJohannes Doerfert         isVariantApplicableInContext(DeviceArchArmParallel, HostNVPTXFor));
236c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArmParallel,
237c953409fSJohannes Doerfert                                               DeviceNVPTXTargetTeamsParallel));
238c953409fSJohannes Doerfert 
239c953409fSJohannes Doerfert     VariantMatchInfo LLVMHostUserCondTrueParallel;
240c953409fSJohannes Doerfert     LLVMHostUserCondTrueParallel.addTrait(
241ee05167cSJohannes Doerfert         TraitProperty::implementation_vendor_llvm, "");
242ee05167cSJohannes Doerfert     LLVMHostUserCondTrueParallel.addTrait(TraitProperty::device_kind_host, "");
243ee05167cSJohannes Doerfert     LLVMHostUserCondTrueParallel.addTrait(TraitProperty::device_kind_any, "");
244ee05167cSJohannes Doerfert     LLVMHostUserCondTrueParallel.addTrait(TraitProperty::user_condition_true,
245ee05167cSJohannes Doerfert                                           "");
246c953409fSJohannes Doerfert     LLVMHostUserCondTrueParallel.addTrait(
247ee05167cSJohannes Doerfert         TraitProperty::construct_parallel_parallel, "");
248c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel,
249c953409fSJohannes Doerfert                                              HostLinuxParallelParallel));
250c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel,
251c953409fSJohannes Doerfert                                               DeviceLinuxTargetParallel));
252c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel,
253c953409fSJohannes Doerfert                                               HostNVPTXFor));
254c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel,
255c953409fSJohannes Doerfert                                               DeviceNVPTXTargetTeamsParallel));
256c953409fSJohannes Doerfert 
257c953409fSJohannes Doerfert     VariantMatchInfo LLVMHostUserCondTrueParallelParallel =
258c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallel;
259c953409fSJohannes Doerfert     LLVMHostUserCondTrueParallelParallel.addTrait(
260ee05167cSJohannes Doerfert         TraitProperty::construct_parallel_parallel, "");
261c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(
262c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallel, HostLinuxParallelParallel));
263c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(
264c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallel, DeviceLinuxTargetParallel));
265c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(
266c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallel, HostNVPTXFor));
267c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(
268c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallel, DeviceNVPTXTargetTeamsParallel));
269c953409fSJohannes Doerfert 
270c953409fSJohannes Doerfert     VariantMatchInfo LLVMHostUserCondTrueParallelParallelParallel =
271c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallel;
272c953409fSJohannes Doerfert     LLVMHostUserCondTrueParallelParallelParallel.addTrait(
273ee05167cSJohannes Doerfert         TraitProperty::construct_parallel_parallel, "");
274c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(
275c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallelParallel,
276c953409fSJohannes Doerfert         HostLinuxParallelParallel));
277c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(
278c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallelParallel,
279c953409fSJohannes Doerfert         DeviceLinuxTargetParallel));
280c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(
281c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallelParallel, HostNVPTXFor));
282c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(
283c953409fSJohannes Doerfert         LLVMHostUserCondTrueParallelParallelParallel,
284c953409fSJohannes Doerfert         DeviceNVPTXTargetTeamsParallel));
285c953409fSJohannes Doerfert 
286c953409fSJohannes Doerfert     VariantMatchInfo GPUTargetTeams;
287ee05167cSJohannes Doerfert     GPUTargetTeams.addTrait(TraitProperty::construct_target_target, "");
288ee05167cSJohannes Doerfert     GPUTargetTeams.addTrait(TraitProperty::construct_teams_teams, "");
289ee05167cSJohannes Doerfert     GPUTargetTeams.addTrait(TraitProperty::device_kind_gpu, "");
290c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPUTargetTeams,
291c953409fSJohannes Doerfert                                               HostLinuxParallelParallel));
292c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPUTargetTeams,
293c953409fSJohannes Doerfert                                               DeviceLinuxTargetParallel));
294c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPUTargetTeams, HostNVPTXFor));
295c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(GPUTargetTeams,
296c953409fSJohannes Doerfert                                              DeviceNVPTXTargetTeamsParallel));
297c953409fSJohannes Doerfert 
298c953409fSJohannes Doerfert     VariantMatchInfo GPUTargetParallel;
299ee05167cSJohannes Doerfert     GPUTargetParallel.addTrait(TraitProperty::construct_target_target, "");
300ee05167cSJohannes Doerfert     GPUTargetParallel.addTrait(TraitProperty::construct_parallel_parallel, "");
301ee05167cSJohannes Doerfert     GPUTargetParallel.addTrait(TraitProperty::device_kind_gpu, "");
302c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPUTargetParallel,
303c953409fSJohannes Doerfert                                               HostLinuxParallelParallel));
304c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPUTargetParallel,
305c953409fSJohannes Doerfert                                               DeviceLinuxTargetParallel));
306c953409fSJohannes Doerfert     EXPECT_FALSE(isVariantApplicableInContext(GPUTargetParallel, HostNVPTXFor));
307c953409fSJohannes Doerfert     EXPECT_TRUE(isVariantApplicableInContext(GPUTargetParallel,
308c953409fSJohannes Doerfert                                              DeviceNVPTXTargetTeamsParallel));
309c953409fSJohannes Doerfert   }
310c953409fSJohannes Doerfert }
311c953409fSJohannes Doerfert 
TEST_F(OpenMPContextTest,ScoringSimple)312c953409fSJohannes Doerfert TEST_F(OpenMPContextTest, ScoringSimple) {
313c953409fSJohannes Doerfert   // TODO: Add scoring tests (via getBestVariantMatchForContext).
314c953409fSJohannes Doerfert }
315c953409fSJohannes Doerfert 
316c953409fSJohannes Doerfert } // namespace
317