blob: 99b3e67e95e2b1e434126dfaf5599927f3b507f2 [file] [edit]
//===----------- 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