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