| //===- unittest/IR/OpenMPContextTest.cpp - OpenMP Context handling tests --===// |
| // |
| // 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/Frontend/OpenMP/OMPConstants.h" |
| #include "llvm/Frontend/OpenMP/OMPContext.h" |
| #include "gtest/gtest.h" |
| |
| using namespace llvm; |
| using namespace omp; |
| |
| namespace { |
| |
| class OpenMPContextTest : public testing::Test { |
| protected: |
| void SetUp() override {} |
| |
| void TearDown() override {} |
| }; |
| |
| TEST_F(OpenMPContextTest, RoundTripAndAssociation) { |
| #define OMP_TRAIT_SET(Enum, Str) \ |
| EXPECT_EQ(TraitSet::Enum, \ |
| getOpenMPContextTraitSetKind( \ |
| getOpenMPContextTraitSetName(TraitSet::Enum))); \ |
| EXPECT_EQ(Str, \ |
| getOpenMPContextTraitSetName(getOpenMPContextTraitSetKind(Str))); |
| #define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, RequiresProperty) \ |
| EXPECT_EQ(TraitSelector::Enum, \ |
| getOpenMPContextTraitSelectorKind( \ |
| getOpenMPContextTraitSelectorName(TraitSelector::Enum))); \ |
| EXPECT_EQ(Str, getOpenMPContextTraitSelectorName( \ |
| getOpenMPContextTraitSelectorKind(Str))); |
| #define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \ |
| EXPECT_EQ(TraitProperty::Enum, \ |
| getOpenMPContextTraitPropertyKind( \ |
| TraitSet::TraitSetEnum, TraitSelector::TraitSelectorEnum, \ |
| getOpenMPContextTraitPropertyName(TraitProperty::Enum, Str))); \ |
| EXPECT_EQ(Str, getOpenMPContextTraitPropertyName( \ |
| getOpenMPContextTraitPropertyKind( \ |
| TraitSet::TraitSetEnum, \ |
| TraitSelector::TraitSelectorEnum, Str), \ |
| Str)); \ |
| EXPECT_EQ(TraitSet::TraitSetEnum, \ |
| getOpenMPContextTraitSetForProperty(TraitProperty::Enum)); \ |
| EXPECT_EQ(TraitSelector::TraitSelectorEnum, \ |
| getOpenMPContextTraitSelectorForProperty(TraitProperty::Enum)); |
| #include "llvm/Frontend/OpenMP/OMPKinds.def" |
| } |
| |
| TEST_F(OpenMPContextTest, ValidNesting) { |
| bool AllowsTraitScore, ReqProperty; |
| #define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, RequiresProperty) \ |
| EXPECT_TRUE(isValidTraitSelectorForTraitSet(TraitSelector::Enum, \ |
| TraitSet::TraitSetEnum, \ |
| AllowsTraitScore, ReqProperty)); \ |
| EXPECT_EQ(RequiresProperty, ReqProperty); |
| #define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \ |
| EXPECT_TRUE(isValidTraitPropertyForTraitSetAndSelector( \ |
| TraitProperty::Enum, TraitSelector::TraitSelectorEnum, \ |
| TraitSet::TraitSetEnum)); |
| #include "llvm/Frontend/OpenMP/OMPKinds.def" |
| } |
| |
| TEST_F(OpenMPContextTest, ApplicabilityNonConstruct) { |
| OMPContext HostLinux(false, Triple("x86_64-unknown-linux")); |
| OMPContext DeviceLinux(true, Triple("x86_64-unknown-linux")); |
| OMPContext HostNVPTX(false, Triple("nvptx64-nvidia-cuda")); |
| OMPContext DeviceNVPTX(true, Triple("nvptx64-nvidia-cuda")); |
| |
| VariantMatchInfo Empty; |
| EXPECT_TRUE(isVariantApplicableInContext(Empty, HostLinux)); |
| EXPECT_TRUE(isVariantApplicableInContext(Empty, DeviceLinux)); |
| EXPECT_TRUE(isVariantApplicableInContext(Empty, HostNVPTX)); |
| EXPECT_TRUE(isVariantApplicableInContext(Empty, DeviceNVPTX)); |
| |
| VariantMatchInfo UserCondFalse; |
| UserCondFalse.addTrait(TraitProperty::user_condition_false, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, HostLinux)); |
| EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, DeviceLinux)); |
| EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, HostNVPTX)); |
| EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, DeviceNVPTX)); |
| |
| VariantMatchInfo DeviceArchArm; |
| DeviceArchArm.addTrait(TraitProperty::device_arch_arm, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, HostLinux)); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, DeviceLinux)); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, HostNVPTX)); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, DeviceNVPTX)); |
| |
| VariantMatchInfo LLVMHostUserCondTrue; |
| LLVMHostUserCondTrue.addTrait(TraitProperty::implementation_vendor_llvm, ""); |
| LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_host, ""); |
| LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_any, ""); |
| LLVMHostUserCondTrue.addTrait(TraitProperty::user_condition_true, ""); |
| EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrue, HostLinux)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue, DeviceLinux)); |
| EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrue, HostNVPTX)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue, DeviceNVPTX)); |
| |
| VariantMatchInfo LLVMHostUserCondTrueCPU = LLVMHostUserCondTrue; |
| LLVMHostUserCondTrueCPU.addTrait(TraitProperty::device_kind_cpu, ""); |
| EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU, HostLinux)); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(LLVMHostUserCondTrueCPU, DeviceLinux)); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(LLVMHostUserCondTrueCPU, HostNVPTX)); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(LLVMHostUserCondTrueCPU, DeviceNVPTX)); |
| |
| VariantMatchInfo GPU; |
| GPU.addTrait(TraitProperty::device_kind_gpu, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(GPU, HostLinux)); |
| EXPECT_FALSE(isVariantApplicableInContext(GPU, DeviceLinux)); |
| EXPECT_TRUE(isVariantApplicableInContext(GPU, HostNVPTX)); |
| EXPECT_TRUE(isVariantApplicableInContext(GPU, DeviceNVPTX)); |
| |
| VariantMatchInfo NoHost; |
| NoHost.addTrait(TraitProperty::device_kind_nohost, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(NoHost, HostLinux)); |
| EXPECT_TRUE(isVariantApplicableInContext(NoHost, DeviceLinux)); |
| EXPECT_FALSE(isVariantApplicableInContext(NoHost, HostNVPTX)); |
| EXPECT_TRUE(isVariantApplicableInContext(NoHost, DeviceNVPTX)); |
| } |
| |
| TEST_F(OpenMPContextTest, ApplicabilityAllTraits) { |
| OMPContext HostLinuxParallelParallel(false, Triple("x86_64-unknown-linux")); |
| HostLinuxParallelParallel.addTrait( |
| TraitProperty::construct_parallel_parallel); |
| HostLinuxParallelParallel.addTrait( |
| TraitProperty::construct_parallel_parallel); |
| OMPContext DeviceLinuxTargetParallel(true, Triple("x86_64-unknown-linux")); |
| DeviceLinuxTargetParallel.addTrait(TraitProperty::construct_target_target); |
| DeviceLinuxTargetParallel.addTrait( |
| TraitProperty::construct_parallel_parallel); |
| OMPContext HostNVPTXFor(false, Triple("nvptx64-nvidia-cuda")); |
| HostNVPTXFor.addTrait(TraitProperty::construct_for_for); |
| OMPContext DeviceNVPTXTargetTeamsParallel(true, |
| Triple("nvptx64-nvidia-cuda")); |
| DeviceNVPTXTargetTeamsParallel.addTrait( |
| TraitProperty::construct_target_target); |
| DeviceNVPTXTargetTeamsParallel.addTrait(TraitProperty::construct_teams_teams); |
| DeviceNVPTXTargetTeamsParallel.addTrait( |
| TraitProperty::construct_parallel_parallel); |
| |
| { // non-construct variants |
| VariantMatchInfo Empty; |
| EXPECT_TRUE(isVariantApplicableInContext(Empty, HostLinuxParallelParallel)); |
| EXPECT_TRUE(isVariantApplicableInContext(Empty, DeviceLinuxTargetParallel)); |
| EXPECT_TRUE(isVariantApplicableInContext(Empty, HostNVPTXFor)); |
| EXPECT_TRUE( |
| isVariantApplicableInContext(Empty, DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo UserCondFalse; |
| UserCondFalse.addTrait(TraitProperty::user_condition_false, ""); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(UserCondFalse, HostLinuxParallelParallel)); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(UserCondFalse, DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext(UserCondFalse, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo DeviceArchArm; |
| DeviceArchArm.addTrait(TraitProperty::device_arch_arm, ""); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(DeviceArchArm, HostLinuxParallelParallel)); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(DeviceArchArm, DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArm, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| APInt Score(32, 1000); |
| VariantMatchInfo LLVMHostUserCondTrue; |
| LLVMHostUserCondTrue.addTrait(TraitProperty::implementation_vendor_llvm, |
| ""); |
| LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_host, ""); |
| LLVMHostUserCondTrue.addTrait(TraitProperty::device_kind_any, ""); |
| LLVMHostUserCondTrue.addTrait(TraitProperty::user_condition_true, "", |
| &Score); |
| EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrue, |
| HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue, |
| DeviceLinuxTargetParallel)); |
| EXPECT_TRUE( |
| isVariantApplicableInContext(LLVMHostUserCondTrue, HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrue, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo LLVMHostUserCondTrueCPU = LLVMHostUserCondTrue; |
| LLVMHostUserCondTrueCPU.addTrait(TraitProperty::device_kind_cpu, ""); |
| EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU, |
| HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU, |
| DeviceLinuxTargetParallel)); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(LLVMHostUserCondTrueCPU, HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueCPU, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo GPU; |
| GPU.addTrait(TraitProperty::device_kind_gpu, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(GPU, HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(GPU, DeviceLinuxTargetParallel)); |
| EXPECT_TRUE(isVariantApplicableInContext(GPU, HostNVPTXFor)); |
| EXPECT_TRUE( |
| isVariantApplicableInContext(GPU, DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo NoHost; |
| NoHost.addTrait(TraitProperty::device_kind_nohost, ""); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(NoHost, HostLinuxParallelParallel)); |
| EXPECT_TRUE( |
| isVariantApplicableInContext(NoHost, DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(NoHost, HostNVPTXFor)); |
| EXPECT_TRUE( |
| isVariantApplicableInContext(NoHost, DeviceNVPTXTargetTeamsParallel)); |
| } |
| { // variants with all sets |
| VariantMatchInfo DeviceArchArmParallel; |
| DeviceArchArmParallel.addTrait(TraitProperty::construct_parallel_parallel, |
| ""); |
| DeviceArchArmParallel.addTrait(TraitProperty::device_arch_arm, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArmParallel, |
| HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArmParallel, |
| DeviceLinuxTargetParallel)); |
| EXPECT_FALSE( |
| isVariantApplicableInContext(DeviceArchArmParallel, HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext(DeviceArchArmParallel, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo LLVMHostUserCondTrueParallel; |
| LLVMHostUserCondTrueParallel.addTrait( |
| TraitProperty::implementation_vendor_llvm, ""); |
| LLVMHostUserCondTrueParallel.addTrait(TraitProperty::device_kind_host, ""); |
| LLVMHostUserCondTrueParallel.addTrait(TraitProperty::device_kind_any, ""); |
| LLVMHostUserCondTrueParallel.addTrait(TraitProperty::user_condition_true, |
| ""); |
| LLVMHostUserCondTrueParallel.addTrait( |
| TraitProperty::construct_parallel_parallel, ""); |
| EXPECT_TRUE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel, |
| HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel, |
| DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel, |
| HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext(LLVMHostUserCondTrueParallel, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo LLVMHostUserCondTrueParallelParallel = |
| LLVMHostUserCondTrueParallel; |
| LLVMHostUserCondTrueParallelParallel.addTrait( |
| TraitProperty::construct_parallel_parallel, ""); |
| EXPECT_TRUE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallel, HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallel, DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallel, HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallel, DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo LLVMHostUserCondTrueParallelParallelParallel = |
| LLVMHostUserCondTrueParallelParallel; |
| LLVMHostUserCondTrueParallelParallelParallel.addTrait( |
| TraitProperty::construct_parallel_parallel, ""); |
| EXPECT_FALSE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallelParallel, |
| HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallelParallel, |
| DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallelParallel, HostNVPTXFor)); |
| EXPECT_FALSE(isVariantApplicableInContext( |
| LLVMHostUserCondTrueParallelParallelParallel, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo GPUTargetTeams; |
| GPUTargetTeams.addTrait(TraitProperty::construct_target_target, ""); |
| GPUTargetTeams.addTrait(TraitProperty::construct_teams_teams, ""); |
| GPUTargetTeams.addTrait(TraitProperty::device_kind_gpu, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(GPUTargetTeams, |
| HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(GPUTargetTeams, |
| DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(GPUTargetTeams, HostNVPTXFor)); |
| EXPECT_TRUE(isVariantApplicableInContext(GPUTargetTeams, |
| DeviceNVPTXTargetTeamsParallel)); |
| |
| VariantMatchInfo GPUTargetParallel; |
| GPUTargetParallel.addTrait(TraitProperty::construct_target_target, ""); |
| GPUTargetParallel.addTrait(TraitProperty::construct_parallel_parallel, ""); |
| GPUTargetParallel.addTrait(TraitProperty::device_kind_gpu, ""); |
| EXPECT_FALSE(isVariantApplicableInContext(GPUTargetParallel, |
| HostLinuxParallelParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(GPUTargetParallel, |
| DeviceLinuxTargetParallel)); |
| EXPECT_FALSE(isVariantApplicableInContext(GPUTargetParallel, HostNVPTXFor)); |
| EXPECT_TRUE(isVariantApplicableInContext(GPUTargetParallel, |
| DeviceNVPTXTargetTeamsParallel)); |
| } |
| } |
| |
| TEST_F(OpenMPContextTest, ScoringSimple) { |
| // TODO: Add scoring tests (via getBestVariantMatchForContext). |
| } |
| |
| } // namespace |