diff --git a/clang/lib/Basic/TargetID.cpp b/clang/lib/Basic/TargetID.cpp index 67f429607ef27..29d5d4a5d2996 100644 --- a/clang/lib/Basic/TargetID.cpp +++ b/clang/lib/Basic/TargetID.cpp @@ -24,12 +24,12 @@ getAllPossibleAMDGPUTargetIDFeatures(const llvm::Triple &T, llvm::StringRef Proc) { // Entries in returned vector should be in alphabetical order. llvm::SmallVector Ret; - auto ProcKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Proc) - : llvm::AMDGPU::parseArchR600(Proc); + if (!T.isAMDGCN()) + return Ret; + llvm::AMDGPU::GPUKind ProcKind = llvm::AMDGPU::parseArchAMDGCN(Proc); if (ProcKind == llvm::AMDGPU::GK_NONE) return Ret; - auto Features = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(ProcKind) - : llvm::AMDGPU::getArchAttrR600(ProcKind); + unsigned Features = llvm::AMDGPU::getArchAttrAMDGCN(ProcKind); if (Features & llvm::AMDGPU::FEATURE_SRAMECC) Ret.push_back("sramecc"); // Only allow xnack in target ID if the processor supports on/off modes. diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index 060df0b9b1b72..85cc1cd21619c 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -54,7 +54,8 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo { /// Has fast fma f32 bool hasFastFMAF() const { - return !!(GPUFeatures & llvm::AMDGPU::FEATURE_FAST_FMA_F32); + return getTriple().isAMDGCN() && + !!(GPUFeatures & llvm::AMDGPU::FEATURE_FAST_FMA_F32); } /// Has fast fma f64 @@ -62,11 +63,12 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo { bool hasFMAF() const { return getTriple().isAMDGCN() || - !!(GPUFeatures & llvm::AMDGPU::FEATURE_FMA); + !!(GPUFeatures & llvm::AMDGPU::R600_FEATURE_FMA); } bool hasFullRateDenormalsF32() const { - return !!(GPUFeatures & llvm::AMDGPU::FEATURE_FAST_DENORMAL_F32); + return getTriple().isAMDGCN() && + !!(GPUFeatures & llvm::AMDGPU::FEATURE_FAST_DENORMAL_F32); } bool hasLDEXPF() const { return getTriple().isAMDGCN(); } diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 5893f6f6b2915..67981cd55d5e8 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -1289,11 +1289,11 @@ LTOKind AMDGPUToolChain::getLTOMode(const ArgList &Args, static bool isXnackAvailable(const llvm::Triple &TT, llvm::StringRef TargetID) { // Arch-specific check - only report as supported if arch has xnack+ + if (!TT.isAMDGCN()) + return false; llvm::StringRef Processor = getProcessorFromTargetID(TT, TargetID); - auto ProcKind = TT.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor) - : llvm::AMDGPU::parseArchR600(Processor); - auto Features = TT.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(ProcKind) - : llvm::AMDGPU::getArchAttrR600(ProcKind); + llvm::AMDGPU::GPUKind ProcKind = llvm::AMDGPU::parseArchAMDGCN(Processor); + unsigned Features = llvm::AMDGPU::getArchAttrAMDGCN(ProcKind); // If processor has xnack but doesn't support on/off modes, xnack is always on bool XnackAlwaysOn = (Features & llvm::AMDGPU::FEATURE_XNACK) && diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 08c06951cf220..579e21d9c882f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -379,12 +379,10 @@ static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor) { // Warn no-cumode for AMDGCN processors not supporing WGP mode. - if (!T.isAMDGPU()) + if (!T.isAMDGCN()) return false; - auto GPUKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor) - : llvm::AMDGPU::parseArchR600(Processor); - auto GPUFeatures = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) - : llvm::AMDGPU::getArchAttrR600(GPUKind); + llvm::AMDGPU::GPUKind GPUKind = llvm::AMDGPU::parseArchAMDGCN(Processor); + unsigned GPUFeatures = llvm::AMDGPU::getArchAttrAMDGCN(GPUKind); if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP) return false; return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode); diff --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h index bb82252803c59..28d87be2eb648 100644 --- a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h +++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.h @@ -58,33 +58,39 @@ struct IsaVersion { // This isn't comprehensive for now, just things that are needed from the // frontend driver. +enum R600FeatureKind : uint32_t { + R600_FEATURE_NONE = 0, + + // Has fma instructions. + R600_FEATURE_FMA = 1 << 0, +}; + +// GFX6+ features. This isn't comprehensive for now, just things that are needed +// from the frontend driver. enum ArchFeatureKind : uint32_t { FEATURE_NONE = 0, - // This feature only exists for r600, and is implied true for amdgcn. - FEATURE_FMA = 1 << 0, - // Common features. - FEATURE_FAST_FMA_F32 = 1 << 1, - FEATURE_FAST_DENORMAL_F32 = 1 << 2, + FEATURE_FAST_FMA_F32 = 1 << 0, + FEATURE_FAST_DENORMAL_F32 = 1 << 1, // Wavefront 32 is available. - FEATURE_WAVE32 = 1 << 3, + FEATURE_WAVE32 = 1 << 2, // Xnack is available. - FEATURE_XNACK = 1 << 4, + FEATURE_XNACK = 1 << 3, // Sram-ecc is available. - FEATURE_SRAMECC = 1 << 5, + FEATURE_SRAMECC = 1 << 4, // WGP mode is supported. - FEATURE_WGP = 1 << 6, + FEATURE_WGP = 1 << 5, // Xnack on/off modes are supported. - FEATURE_XNACK_ON_OFF_MODES = 1 << 7, + FEATURE_XNACK_ON_OFF_MODES = 1 << 6, // VI SGPR initialization bug requiring a fixed SGPR allocation size. - FEATURE_SGPR_INIT_BUG = 1 << 8 + FEATURE_SGPR_INIT_BUG = 1 << 7 }; enum FeatureError : uint32_t { @@ -135,7 +141,7 @@ LLVM_ABI GPUKind parseArchR600(StringRef CPU); LLVM_ABI GPUKind getGPUKindFromSubArch(Triple::SubArchType SubArch); LLVM_ABI unsigned getArchAttrAMDGCN(GPUKind AK); LLVM_ABI unsigned getArchAttrAMDGCN(Triple::SubArchType SubArch); -LLVM_ABI unsigned getArchAttrR600(GPUKind AK); +LLVM_ABI R600FeatureKind getArchAttrR600(GPUKind AK); /// Append the valid AMDGCN GPU names to \p Values. If \p SubArch is not /// NoSubArch, only GPUs compatible with that subarch (see isCPUValidForSubArch) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td b/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td index ffa3869e7151e..28385babdeba7 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetParser.td @@ -18,7 +18,7 @@ class AMDGPUArchFeature { } // R600-only. -def FEATURE_FMA : AMDGPUArchFeature<"FEATURE_FMA">; +def R600_FEATURE_FMA : AMDGPUArchFeature<"R600_FEATURE_FMA">; // Marks a Processor/ProcessorModel record as a canonical TargetParser GPU. class AMDGPUGPUInfo { diff --git a/llvm/lib/Target/AMDGPU/R600Processors.td b/llvm/lib/Target/AMDGPU/R600Processors.td index c893f4a11c952..7a5847a493d6f 100644 --- a/llvm/lib/Target/AMDGPU/R600Processors.td +++ b/llvm/lib/Target/AMDGPU/R600Processors.td @@ -127,7 +127,7 @@ def : ProcessorAlias<"palm", "cedar">; def : R600ProcessorModel<"cypress", R600_VLIW5_Itin, [FeatureEvergreen, FeatureWavefrontSize64, FeatureVertexCache, FeatureFMA]> { - let ArchFeatures = [FEATURE_FMA]; + let ArchFeatures = [R600_FEATURE_FMA]; } def : ProcessorAlias<"hemlock", "cypress">; @@ -163,7 +163,7 @@ def : ProcessorAlias<"aruba", "cayman">; def : R600ProcessorModel<"cayman", R600_VLIW4_Itin, [FeatureNorthernIslands, FeatureCaymanISA, FeatureFMA]> { - let ArchFeatures = [FEATURE_FMA]; + let ArchFeatures = [R600_FEATURE_FMA]; } def : R600ProcessorModel<"turks", R600_VLIW5_Itin, diff --git a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp index dbc3b59a0861b..bfa771b6625dc 100644 --- a/llvm/lib/TargetParser/AMDGPUTargetParser.cpp +++ b/llvm/lib/TargetParser/AMDGPUTargetParser.cpp @@ -291,14 +291,14 @@ unsigned AMDGPU::getArchAttrAMDGCN(Triple::SubArchType SubArch) { } } -unsigned AMDGPU::getArchAttrR600(GPUKind AK) { +R600FeatureKind AMDGPU::getArchAttrR600(GPUKind AK) { switch (AK) { #define R600_GPU(NAME, ENUM, FEATURES) \ case ENUM: \ return FEATURES; #include "llvm/TargetParser/R600TargetParserDef.inc" default: - return FEATURE_NONE; + return R600_FEATURE_NONE; } } diff --git a/llvm/unittests/TargetParser/TargetParserTest.cpp b/llvm/unittests/TargetParser/TargetParserTest.cpp index 54325fcc20141..827c5aafac857 100644 --- a/llvm/unittests/TargetParser/TargetParserTest.cpp +++ b/llvm/unittests/TargetParser/TargetParserTest.cpp @@ -2667,25 +2667,25 @@ TEST(TargetParserTest, testAMDGPUparseArchR600) { struct CanonicalGPU { StringRef Name; AMDGPU::GPUKind Kind; - unsigned Features; + AMDGPU::R600FeatureKind Features; }; static const CanonicalGPU Canonicals[] = { - {"r600", AMDGPU::GK_R600, AMDGPU::FEATURE_NONE}, - {"r630", AMDGPU::GK_R630, AMDGPU::FEATURE_NONE}, - {"rs880", AMDGPU::GK_RS880, AMDGPU::FEATURE_NONE}, - {"rv670", AMDGPU::GK_RV670, AMDGPU::FEATURE_NONE}, - {"rv710", AMDGPU::GK_RV710, AMDGPU::FEATURE_NONE}, - {"rv730", AMDGPU::GK_RV730, AMDGPU::FEATURE_NONE}, - {"rv770", AMDGPU::GK_RV770, AMDGPU::FEATURE_NONE}, - {"cedar", AMDGPU::GK_CEDAR, AMDGPU::FEATURE_NONE}, - {"cypress", AMDGPU::GK_CYPRESS, AMDGPU::FEATURE_FMA}, - {"juniper", AMDGPU::GK_JUNIPER, AMDGPU::FEATURE_NONE}, - {"redwood", AMDGPU::GK_REDWOOD, AMDGPU::FEATURE_NONE}, - {"sumo", AMDGPU::GK_SUMO, AMDGPU::FEATURE_NONE}, - {"barts", AMDGPU::GK_BARTS, AMDGPU::FEATURE_NONE}, - {"caicos", AMDGPU::GK_CAICOS, AMDGPU::FEATURE_NONE}, - {"cayman", AMDGPU::GK_CAYMAN, AMDGPU::FEATURE_FMA}, - {"turks", AMDGPU::GK_TURKS, AMDGPU::FEATURE_NONE}, + {"r600", AMDGPU::GK_R600, AMDGPU::R600_FEATURE_NONE}, + {"r630", AMDGPU::GK_R630, AMDGPU::R600_FEATURE_NONE}, + {"rs880", AMDGPU::GK_RS880, AMDGPU::R600_FEATURE_NONE}, + {"rv670", AMDGPU::GK_RV670, AMDGPU::R600_FEATURE_NONE}, + {"rv710", AMDGPU::GK_RV710, AMDGPU::R600_FEATURE_NONE}, + {"rv730", AMDGPU::GK_RV730, AMDGPU::R600_FEATURE_NONE}, + {"rv770", AMDGPU::GK_RV770, AMDGPU::R600_FEATURE_NONE}, + {"cedar", AMDGPU::GK_CEDAR, AMDGPU::R600_FEATURE_NONE}, + {"cypress", AMDGPU::GK_CYPRESS, AMDGPU::R600_FEATURE_FMA}, + {"juniper", AMDGPU::GK_JUNIPER, AMDGPU::R600_FEATURE_NONE}, + {"redwood", AMDGPU::GK_REDWOOD, AMDGPU::R600_FEATURE_NONE}, + {"sumo", AMDGPU::GK_SUMO, AMDGPU::R600_FEATURE_NONE}, + {"barts", AMDGPU::GK_BARTS, AMDGPU::R600_FEATURE_NONE}, + {"caicos", AMDGPU::GK_CAICOS, AMDGPU::R600_FEATURE_NONE}, + {"cayman", AMDGPU::GK_CAYMAN, AMDGPU::R600_FEATURE_FMA}, + {"turks", AMDGPU::GK_TURKS, AMDGPU::R600_FEATURE_NONE}, }; for (const CanonicalGPU &G : Canonicals) { EXPECT_EQ(AMDGPU::parseArchR600(G.Name), G.Kind) << G.Name; diff --git a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp index e8a013227411a..d982fb45da9cc 100644 --- a/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp +++ b/llvm/utils/TableGen/Basic/AMDGPUTargetDefEmitter.cpp @@ -37,8 +37,10 @@ struct GPUEntry { }; } // namespace -// Emit the ArchFeature spellings joined with '|', or FEATURE_NONE when empty. -static void emitFeatureExpr(raw_ostream &OS, const Record *Rec) { +// Emit the ArchFeature spellings joined with '|', or \p NoneSpelling when +// empty. +static void emitFeatureExpr(raw_ostream &OS, const Record *Rec, + StringRef NoneSpelling) { ListSeparator LS("|"); bool Any = false; for (const Record *F : Rec->getValueAsListOfDefs("ArchFeatures")) { @@ -47,7 +49,7 @@ static void emitFeatureExpr(raw_ostream &OS, const Record *Rec) { } if (!Any) - OS << "FEATURE_NONE"; + OS << NoneSpelling; } // Collect canonical GPUs and their aliases, in TableGen definition order. @@ -116,7 +118,7 @@ static void emitR600(raw_ostream &OS, const RecordKeeper &RK) { OS << "R600_GPU(\"" << Name << "\", "; emitGPUKindEnum(OS, Name); OS << ", "; - emitFeatureExpr(OS, E.Rec); + emitFeatureExpr(OS, E.Rec, "R600_FEATURE_NONE"); OS << ")\n"; } }