| //===----------- NVPTXTargetParserTest.cpp - NVPTX Target Parser ----------===// | |
| // | |
| // 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/TargetParser/NVPTXTargetParser.h" | |
| #include "gtest/gtest.h" | |
| using namespace llvm; | |
| namespace { | |
| TEST(NVPTXTargetParserTest, ParseArch) { | |
| EXPECT_EQ(NVPTX::parseArch("sm_90"), NVPTX::GK_SM_90); | |
| EXPECT_EQ(NVPTX::parseArch("sm_90a"), NVPTX::GK_SM_90a); | |
| EXPECT_EQ(NVPTX::parseArch("sm_100f"), NVPTX::GK_SM_100f); | |
| // sm_32 uses the underscore-suffixed enumerator internally but the canonical | |
| // name has no trailing underscore. | |
| EXPECT_EQ(NVPTX::parseArch("sm_32"), NVPTX::GK_SM_32_); | |
| EXPECT_EQ(NVPTX::parseArch("gfx900"), NVPTX::GK_NONE); | |
| EXPECT_EQ(NVPTX::parseArch(""), NVPTX::GK_NONE); | |
| } | |
| TEST(NVPTXTargetParserTest, ArchNames) { | |
| EXPECT_EQ(NVPTX::getArchName(NVPTX::GK_SM_90), "sm_90"); | |
| EXPECT_EQ(NVPTX::getArchName(NVPTX::GK_SM_32_), "sm_32"); | |
| EXPECT_EQ(NVPTX::getVirtualArch(NVPTX::GK_SM_90), "compute_90"); | |
| // sm_21 shares the compute_20 virtual arch. | |
| EXPECT_EQ(NVPTX::getVirtualArch(NVPTX::GK_SM_21), "compute_20"); | |
| EXPECT_EQ(NVPTX::getArchName(NVPTX::GK_NONE), ""); | |
| EXPECT_EQ(NVPTX::getVirtualArch(NVPTX::GK_NONE), ""); | |
| } | |
| TEST(NVPTXTargetParserTest, SmVersion) { | |
| EXPECT_EQ(NVPTX::getSmVersion(NVPTX::GK_SM_90), 900u); | |
| EXPECT_EQ(NVPTX::getSmVersion(NVPTX::GK_SM_90a), 900u); | |
| EXPECT_EQ(NVPTX::getSmVersion(NVPTX::GK_SM_100f), 1000u); | |
| EXPECT_EQ(NVPTX::getSmVersion(NVPTX::GK_NONE), 0u); | |
| } | |
| TEST(NVPTXTargetParserTest, ArchSuffix) { | |
| EXPECT_FALSE(NVPTX::isAcceleratedArch(NVPTX::GK_SM_90)); | |
| EXPECT_TRUE(NVPTX::isAcceleratedArch(NVPTX::GK_SM_90a)); | |
| EXPECT_FALSE(NVPTX::isAcceleratedArch(NVPTX::GK_SM_100f)); | |
| // Family-specific covers both 'f' and 'a' variants. | |
| EXPECT_FALSE(NVPTX::isFamilySpecificArch(NVPTX::GK_SM_100)); | |
| EXPECT_TRUE(NVPTX::isFamilySpecificArch(NVPTX::GK_SM_100f)); | |
| EXPECT_TRUE(NVPTX::isFamilySpecificArch(NVPTX::GK_SM_100a)); | |
| } | |
| // Every parseable name must round-trip back to the same canonical name. | |
| TEST(NVPTXTargetParserTest, RoundTrip) { | |
| static const char *const Names[] = { | |
| #define NVPTX_GPU(NAME, KIND, VIRTUAL, SM_ID, MIN_VER, MAX_VER, SUFFIX) NAME, | |
| #include "llvm/TargetParser/NVPTXTargetParser.def" | |
| }; | |
| for (const char *Name : Names) { | |
| NVPTX::GPUKind Kind = NVPTX::parseArch(Name); | |
| EXPECT_NE(Kind, NVPTX::GK_NONE) << Name; | |
| EXPECT_EQ(NVPTX::getArchName(Kind), Name); | |
| } | |
| } | |
| } // namespace |