diff llvm/unittests/Frontend/OpenMPContextTest.cpp @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 0572611fdcc8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/llvm/unittests/Frontend/OpenMPContextTest.cpp	Thu Feb 13 15:10:13 2020 +0900
@@ -0,0 +1,310 @@
+//===- 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)));      \
+  EXPECT_EQ(                                                                   \
+      Str,                                                                     \
+      getOpenMPContextTraitPropertyName(getOpenMPContextTraitPropertyKind(     \
+          TraitSet::TraitSetEnum, TraitSelector::TraitSelectorEnum, 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