316 lines
16 KiB
C++
316 lines
16 KiB
C++
|
//===- 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
|