brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.8 KiB · f9683ae Raw
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