Skip to content

Commit

Permalink
AMDGPU: Cleanup most of the macros
Browse files Browse the repository at this point in the history
- Insert __AMD__ macro
- Insert __AMDGPU__ macro
- Insert __devicename__ macro
- Add missing tests for arch macros

Differential Revision: https://reviews.llvm.org/D36802

llvm-svn: 325193
  • Loading branch information
kzhuravl committed Feb 15, 2018
1 parent bab7b0a commit 5c9d4e7
Show file tree
Hide file tree
Showing 3 changed files with 208 additions and 91 deletions.
50 changes: 28 additions & 22 deletions clang/lib/Basic/Targets/AMDGPU.cpp
Expand Up @@ -161,7 +161,7 @@ bool AMDGPUTargetInfo::initFeatureMap(
if (CPU.empty())
CPU = "tahiti";

switch (parseAMDGCNName(CPU)) {
switch (parseAMDGCNName(CPU).Kind) {
case GK_GFX6:
case GK_GFX7:
break;
Expand All @@ -184,7 +184,7 @@ bool AMDGPUTargetInfo::initFeatureMap(
if (CPU.empty())
CPU = "r600";

switch (parseR600Name(CPU)) {
switch (parseR600Name(CPU).Kind) {
case GK_R600:
case GK_R700:
case GK_EVERGREEN:
Expand Down Expand Up @@ -229,36 +229,36 @@ void AMDGPUTargetInfo::adjustTargetOptions(const CodeGenOptions &CGOpts,
}


constexpr AMDGPUTargetInfo::NameGPUKind AMDGPUTargetInfo::R600Names[];
constexpr AMDGPUTargetInfo::NameGPUKind AMDGPUTargetInfo::AMDGCNNames[];
AMDGPUTargetInfo::GPUKind AMDGPUTargetInfo::parseR600Name(StringRef Name) {
constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::R600Names[];
constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::AMDGCNNames[];
AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseR600Name(StringRef Name) {
const auto *Result = llvm::find_if(
R600Names, [Name](const NameGPUKind &Kind) { return Kind.Name == Name; });
R600Names, [Name](const GPUInfo &GPU) { return GPU.Name == Name; });

if (Result == std::end(R600Names))
return GK_NONE;
return Result->Kind;
return InvalidGPU;
return *Result;
}

AMDGPUTargetInfo::GPUKind AMDGPUTargetInfo::parseAMDGCNName(StringRef Name) {
AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseAMDGCNName(StringRef Name) {
const auto *Result =
llvm::find_if(AMDGCNNames, [Name](const NameGPUKind &Kind) {
return Kind.Name == Name;
llvm::find_if(AMDGCNNames, [Name](const GPUInfo &GPU) {
return GPU.Name == Name;
});

if (Result == std::end(AMDGCNNames))
return GK_NONE;
return Result->Kind;
return InvalidGPU;
return *Result;
}

void AMDGPUTargetInfo::fillValidCPUList(
SmallVectorImpl<StringRef> &Values) const {
if (getTriple().getArch() == llvm::Triple::amdgcn)
llvm::for_each(AMDGCNNames, [&Values](const NameGPUKind &Kind) {
Values.emplace_back(Kind.Name);});
llvm::for_each(AMDGCNNames, [&Values](const GPUInfo &GPU) {
Values.emplace_back(GPU.Name);});
else
llvm::for_each(R600Names, [&Values](const NameGPUKind &Kind) {
Values.emplace_back(Kind.Name);});
llvm::for_each(R600Names, [&Values](const GPUInfo &GPU) {
Values.emplace_back(GPU.Name);});
}

void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {
Expand All @@ -273,17 +273,17 @@ void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {

AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
const TargetOptions &Opts)
: TargetInfo(Triple),
GPU(isAMDGCN(Triple) ? GK_GFX6 : parseR600Name(Opts.CPU)),
hasFP64(false), hasFMAF(false), hasLDEXPF(false),
AS(isGenericZero(Triple)) {
: TargetInfo(Triple),
GPU(isAMDGCN(Triple) ? AMDGCNNames[0] : parseR600Name(Opts.CPU)),
hasFP64(false), hasFMAF(false), hasLDEXPF(false),
AS(isGenericZero(Triple)) {
if (getTriple().getArch() == llvm::Triple::amdgcn) {
hasFP64 = true;
hasFMAF = true;
hasLDEXPF = true;
}
if (getTriple().getArch() == llvm::Triple::r600) {
if (GPU == GK_EVERGREEN_DOUBLE_OPS || GPU == GK_CAYMAN) {
if (GPU.Kind == GK_EVERGREEN_DOUBLE_OPS || GPU.Kind == GK_CAYMAN) {
hasFMAF = true;
}
}
Expand Down Expand Up @@ -324,11 +324,17 @@ ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {

void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const {
Builder.defineMacro("__AMD__");
Builder.defineMacro("__AMDGPU__");

if (getTriple().getArch() == llvm::Triple::amdgcn)
Builder.defineMacro("__AMDGCN__");
else
Builder.defineMacro("__R600__");

if (GPU.Kind != GK_NONE)
Builder.defineMacro(Twine("__") + Twine(GPU.CanonicalName) + Twine("__"));

if (hasFMAF)
Builder.defineMacro("__HAS_FMAF__");
if (hasLDEXPF)
Expand Down
142 changes: 73 additions & 69 deletions clang/lib/Basic/Targets/AMDGPU.h
Expand Up @@ -62,72 +62,76 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
GK_GFX7,
GK_GFX8,
GK_GFX9
} GPU;
};

struct NameGPUKind {
struct GPUInfo {
llvm::StringLiteral Name;
llvm::StringLiteral CanonicalName;
AMDGPUTargetInfo::GPUKind Kind;
};

static constexpr NameGPUKind R600Names[26] = {
{{"r600"}, GK_R600},
{{"rv630"}, GK_R600},
{{"rv635"}, GK_R600},
{{"r630"}, GK_R600},
{{"rs780"}, GK_R600},
{{"rs880"}, GK_R600},
{{"rv610"}, GK_R600},
{{"rv620"}, GK_R600},
{{"rv670"}, GK_R600_DOUBLE_OPS},
{{"rv710"}, GK_R700},
{{"rv730"}, GK_R700},
{{"rv740"}, GK_R700_DOUBLE_OPS},
{{"rv770"}, GK_R700_DOUBLE_OPS},
{{"cedar"}, GK_EVERGREEN},
{{"palm"}, GK_EVERGREEN},
{{"cypress"}, GK_EVERGREEN_DOUBLE_OPS},
{{"hemlock"}, GK_EVERGREEN_DOUBLE_OPS},
{{"juniper"}, GK_EVERGREEN},
{{"redwood"}, GK_EVERGREEN},
{{"sumo"}, GK_EVERGREEN},
{{"sumo2"}, GK_EVERGREEN},
{{"barts"}, GK_NORTHERN_ISLANDS},
{{"caicos"}, GK_NORTHERN_ISLANDS},
{{"turks"}, GK_NORTHERN_ISLANDS},
{{"aruba"}, GK_CAYMAN},
{{"cayman"}, GK_CAYMAN},
GPUInfo GPU;

static constexpr GPUInfo InvalidGPU = {{""}, {""}, GK_NONE};
static constexpr GPUInfo R600Names[26] = {
{{"r600"}, {"r600"}, GK_R600},
{{"rv630"}, {"r600"}, GK_R600},
{{"rv635"}, {"r600"}, GK_R600},
{{"r630"}, {"r630"}, GK_R600},
{{"rs780"}, {"rs880"}, GK_R600},
{{"rs880"}, {"rs880"}, GK_R600},
{{"rv610"}, {"rs880"}, GK_R600},
{{"rv620"}, {"rs880"}, GK_R600},
{{"rv670"}, {"rv670"}, GK_R600_DOUBLE_OPS},
{{"rv710"}, {"rv710"}, GK_R700},
{{"rv730"}, {"rv730"}, GK_R700},
{{"rv740"}, {"rv770"}, GK_R700_DOUBLE_OPS},
{{"rv770"}, {"rv770"}, GK_R700_DOUBLE_OPS},
{{"cedar"}, {"cedar"}, GK_EVERGREEN},
{{"palm"}, {"cedar"}, GK_EVERGREEN},
{{"cypress"}, {"cypress"}, GK_EVERGREEN_DOUBLE_OPS},
{{"hemlock"}, {"cypress"}, GK_EVERGREEN_DOUBLE_OPS},
{{"juniper"}, {"juniper"}, GK_EVERGREEN},
{{"redwood"}, {"redwood"}, GK_EVERGREEN},
{{"sumo"}, {"sumo"}, GK_EVERGREEN},
{{"sumo2"}, {"sumo"}, GK_EVERGREEN},
{{"barts"}, {"barts"}, GK_NORTHERN_ISLANDS},
{{"caicos"}, {"caicos"}, GK_NORTHERN_ISLANDS},
{{"turks"}, {"turks"}, GK_NORTHERN_ISLANDS},
{{"aruba"}, {"cayman"}, GK_CAYMAN},
{{"cayman"}, {"cayman"}, GK_CAYMAN},
};
static constexpr NameGPUKind AMDGCNNames[30] = {
{{"gfx600"}, GK_GFX6},
{{"tahiti"}, GK_GFX6},
{{"gfx601"}, GK_GFX6},
{{"hainan"}, GK_GFX6},
{{"oland"}, GK_GFX6},
{{"pitcairn"}, GK_GFX6},
{{"verde"}, GK_GFX6},
{{"gfx700"}, GK_GFX7},
{{"kaveri"}, GK_GFX7},
{{"gfx701"}, GK_GFX7},
{{"hawaii"}, GK_GFX7},
{{"gfx702"}, GK_GFX7},
{{"gfx703"}, GK_GFX7},
{{"kabini"}, GK_GFX7},
{{"mullins"}, GK_GFX7},
{{"gfx704"}, GK_GFX7},
{{"bonaire"}, GK_GFX7},
{{"gfx801"}, GK_GFX8},
{{"carrizo"}, GK_GFX8},
{{"gfx802"}, GK_GFX8},
{{"iceland"}, GK_GFX8},
{{"tonga"}, GK_GFX8},
{{"gfx803"}, GK_GFX8},
{{"fiji"}, GK_GFX8},
{{"polaris10"}, GK_GFX8},
{{"polaris11"}, GK_GFX8},
{{"gfx810"}, GK_GFX8},
{{"stoney"}, GK_GFX8},
{{"gfx900"}, GK_GFX9},
{{"gfx902"}, GK_GFX9},
static constexpr GPUInfo AMDGCNNames[30] = {
{{"gfx600"}, {"gfx600"}, GK_GFX6},
{{"tahiti"}, {"gfx600"}, GK_GFX6},
{{"gfx601"}, {"gfx601"}, GK_GFX6},
{{"hainan"}, {"gfx601"}, GK_GFX6},
{{"oland"}, {"gfx601"}, GK_GFX6},
{{"pitcairn"}, {"gfx601"}, GK_GFX6},
{{"verde"}, {"gfx601"}, GK_GFX6},
{{"gfx700"}, {"gfx700"}, GK_GFX7},
{{"kaveri"}, {"gfx700"}, GK_GFX7},
{{"gfx701"}, {"gfx701"}, GK_GFX7},
{{"hawaii"}, {"gfx701"}, GK_GFX7},
{{"gfx702"}, {"gfx702"}, GK_GFX7},
{{"gfx703"}, {"gfx703"}, GK_GFX7},
{{"kabini"}, {"gfx703"}, GK_GFX7},
{{"mullins"}, {"gfx703"}, GK_GFX7},
{{"gfx704"}, {"gfx704"}, GK_GFX7},
{{"bonaire"}, {"gfx704"}, GK_GFX7},
{{"gfx801"}, {"gfx801"}, GK_GFX8},
{{"carrizo"}, {"gfx801"}, GK_GFX8},
{{"gfx802"}, {"gfx802"}, GK_GFX8},
{{"iceland"}, {"gfx802"}, GK_GFX8},
{{"tonga"}, {"gfx802"}, GK_GFX8},
{{"gfx803"}, {"gfx803"}, GK_GFX8},
{{"fiji"}, {"gfx803"}, GK_GFX8},
{{"polaris10"}, {"gfx803"}, GK_GFX8},
{{"polaris11"}, {"gfx803"}, GK_GFX8},
{{"gfx810"}, {"gfx810"}, GK_GFX8},
{{"stoney"}, {"gfx810"}, GK_GFX8},
{{"gfx900"}, {"gfx900"}, GK_GFX9},
{{"gfx902"}, {"gfx902"}, GK_GFX9},
};

bool hasFP64 : 1;
Expand All @@ -136,7 +140,7 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
const AddrSpace AS;

static bool hasFullSpeedFMAF32(StringRef GPUName) {
return parseAMDGCNName(GPUName) >= GK_GFX9;
return parseAMDGCNName(GPUName).Kind >= GK_GFX9;
}

static bool isAMDGCN(const llvm::Triple &TT) {
Expand All @@ -153,7 +157,7 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
void adjust(LangOptions &Opts) override;

uint64_t getPointerWidthV(unsigned AddrSpace) const override {
if (GPU <= GK_CAYMAN)
if (GPU.Kind <= GK_CAYMAN)
return 32;

if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
Expand Down Expand Up @@ -274,15 +278,15 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
return TargetInfo::CharPtrBuiltinVaList;
}

static GPUKind parseR600Name(StringRef Name);
static GPUInfo parseR600Name(StringRef Name);

static GPUKind parseAMDGCNName(StringRef Name);
static GPUInfo parseAMDGCNName(StringRef Name);

bool isValidCPUName(StringRef Name) const override {
if (getTriple().getArch() == llvm::Triple::amdgcn)
return GK_NONE != parseAMDGCNName(Name);
return GK_NONE != parseAMDGCNName(Name).Kind;
else
return GK_NONE != parseR600Name(Name);
return GK_NONE != parseR600Name(Name).Kind;
}

void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
Expand All @@ -293,7 +297,7 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
else
GPU = parseR600Name(Name);

return GPU != GK_NONE;
return GPU.Kind != GK_NONE;
}

void setSupportedOpenCLOpts() override {
Expand All @@ -303,14 +307,14 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {

if (hasFP64)
Opts.support("cl_khr_fp64");
if (GPU >= GK_EVERGREEN) {
if (GPU.Kind >= GK_EVERGREEN) {
Opts.support("cl_khr_byte_addressable_store");
Opts.support("cl_khr_global_int32_base_atomics");
Opts.support("cl_khr_global_int32_extended_atomics");
Opts.support("cl_khr_local_int32_base_atomics");
Opts.support("cl_khr_local_int32_extended_atomics");
}
if (GPU >= GK_GFX6) {
if (GPU.Kind >= GK_GFX6) {
Opts.support("cl_khr_fp16");
Opts.support("cl_khr_int64_base_atomics");
Opts.support("cl_khr_int64_extended_atomics");
Expand Down

0 comments on commit 5c9d4e7

Please sign in to comment.