[PATCH] D152423: [RISCV] Add function that check extension name with version
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG4b60e1e821b4: [RISCV] Add function that check extension name with version (authored by BeMg). Herald added a subscriber: sunshaoce. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D152423/new/ https://reviews.llvm.org/D152423 Files: llvm/include/llvm/Support/RISCVISAInfo.h llvm/lib/Support/RISCVISAInfo.cpp llvm/unittests/Support/RISCVISAInfoTest.cpp Index: llvm/unittests/Support/RISCVISAInfoTest.cpp === --- llvm/unittests/Support/RISCVISAInfoTest.cpp +++ llvm/unittests/Support/RISCVISAInfoTest.cpp @@ -604,3 +604,25 @@ EXPECT_EQ(ExtsRV64IDZce.count("zcmp"), 1U); EXPECT_EQ(ExtsRV64IDZce.count("zcmt"), 1U); } + +TEST(isSupportedExtensionWithVersion, AcceptsSingleExtensionWithVersion) { + EXPECT_TRUE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("c2p0zbb1p0")); +} + +TEST(getTargetFeatureForExtension, RetrieveTargetFeatureFromOneExt) { + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zbb"), "zbb"); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zicond1p0"), +"experimental-zicond"); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zicond"), +"experimental-zicond"); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zihintntl1234p4321"), +""); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zfoo"), ""); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension(""), ""); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zbbzihintntl"), ""); +} Index: llvm/lib/Support/RISCVISAInfo.cpp === --- llvm/lib/Support/RISCVISAInfo.cpp +++ llvm/lib/Support/RISCVISAInfo.cpp @@ -1253,3 +1253,40 @@ } llvm_unreachable("Invalid XLEN"); } + +bool RISCVISAInfo::isSupportedExtensionWithVersion(StringRef Ext) { + if (Ext.empty()) +return false; + + auto Pos = findLastNonVersionCharacter(Ext) + 1; + StringRef Name = Ext.substr(0, Pos); + StringRef Vers = Ext.substr(Pos); + if (Vers.empty()) +return false; + + unsigned Major, Minor, ConsumeLength; + if (auto E = getExtensionVersion(Name, Vers, Major, Minor, ConsumeLength, + true, true)) { +consumeError(std::move(E)); +return false; + } + + return true; +} + +std::string RISCVISAInfo::getTargetFeatureForExtension(StringRef Ext) { + if (Ext.empty()) +return std::string(); + + auto Pos = findLastNonVersionCharacter(Ext) + 1; + StringRef Name = Ext.substr(0, Pos); + + if (Pos != Ext.size() && !isSupportedExtensionWithVersion(Ext)) +return std::string(); + + if (!isSupportedExtension(Name)) +return std::string(); + + return isExperimentalExtension(Name) ? "experimental-" + Name.str() + : Name.str(); +} Index: llvm/include/llvm/Support/RISCVISAInfo.h === --- llvm/include/llvm/Support/RISCVISAInfo.h +++ llvm/include/llvm/Support/RISCVISAInfo.h @@ -85,10 +85,12 @@ static bool isSupportedExtensionFeature(StringRef Ext); static bool isSupportedExtension(StringRef Ext); + static bool isSupportedExtensionWithVersion(StringRef Ext); static bool isSupportedExtension(StringRef Ext, unsigned MajorVersion, unsigned MinorVersion); static llvm::Expected> postProcessAndChecking(std::unique_ptr &&ISAInfo); + static std::string getTargetFeatureForExtension(StringRef Ext); private: RISCVISAInfo(unsigned XLen) Index: llvm/unittests/Support/RISCVISAInfoTest.cpp === --- llvm/unittests/Support/RISCVISAInfoTest.cpp +++ llvm/unittests/Support/RISCVISAInfoTest.cpp @@ -604,3 +604,25 @@ EXPECT_EQ(ExtsRV64IDZce.count("zcmp"), 1U); EXPECT_EQ(ExtsRV64IDZce.count("zcmt"), 1U); } + +TEST(isSupportedExtensionWithVersion, AcceptsSingleExtensionWithVersion) { + EXPECT_TRUE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("c2p0zbb1p0")); +} + +TEST(getTargetFeatureForExtension, RetrieveTarget
[PATCH] D152423: [RISCV] Add function that check extension name with version
craig.topper accepted this revision. craig.topper added a comment. This revision is now accepted and ready to land. LGTM Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D152423/new/ https://reviews.llvm.org/D152423 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D152423: [RISCV] Add function that check extension name with version
BeMg updated this revision to Diff 550238. BeMg added a comment. revert last patch because it's wrong one Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D152423/new/ https://reviews.llvm.org/D152423 Files: llvm/include/llvm/Support/RISCVISAInfo.h llvm/lib/Support/RISCVISAInfo.cpp llvm/unittests/Support/RISCVISAInfoTest.cpp Index: llvm/unittests/Support/RISCVISAInfoTest.cpp === --- llvm/unittests/Support/RISCVISAInfoTest.cpp +++ llvm/unittests/Support/RISCVISAInfoTest.cpp @@ -604,3 +604,25 @@ EXPECT_EQ(ExtsRV64IDZce.count("zcmp"), 1U); EXPECT_EQ(ExtsRV64IDZce.count("zcmt"), 1U); } + +TEST(isSupportedExtensionWithVersion, AcceptsSingleExtensionWithVersion) { + EXPECT_TRUE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("c2p0zbb1p0")); +} + +TEST(getTargetFeatureForExtension, RetrieveTargetFeatureFromOneExt) { + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zbb"), "zbb"); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zicond1p0"), +"experimental-zicond"); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zicond"), +"experimental-zicond"); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zihintntl1234p4321"), +""); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zfoo"), ""); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension(""), ""); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zbbzihintntl"), ""); +} Index: llvm/lib/Support/RISCVISAInfo.cpp === --- llvm/lib/Support/RISCVISAInfo.cpp +++ llvm/lib/Support/RISCVISAInfo.cpp @@ -1249,3 +1249,40 @@ } llvm_unreachable("Invalid XLEN"); } + +bool RISCVISAInfo::isSupportedExtensionWithVersion(StringRef Ext) { + if (Ext.empty()) +return false; + + auto Pos = findLastNonVersionCharacter(Ext) + 1; + StringRef Name = Ext.substr(0, Pos); + StringRef Vers = Ext.substr(Pos); + if (Vers.empty()) +return false; + + unsigned Major, Minor, ConsumeLength; + if (auto E = getExtensionVersion(Name, Vers, Major, Minor, ConsumeLength, + true, true)) { +consumeError(std::move(E)); +return false; + } + + return true; +} + +std::string RISCVISAInfo::getTargetFeatureForExtension(StringRef Ext) { + if (Ext.empty()) +return std::string(); + + auto Pos = findLastNonVersionCharacter(Ext) + 1; + StringRef Name = Ext.substr(0, Pos); + + if (Pos != Ext.size() && !isSupportedExtensionWithVersion(Ext)) +return std::string(); + + if (!isSupportedExtension(Name)) +return std::string(); + + return isExperimentalExtension(Name) ? "experimental-" + Name.str() + : Name.str(); +} Index: llvm/include/llvm/Support/RISCVISAInfo.h === --- llvm/include/llvm/Support/RISCVISAInfo.h +++ llvm/include/llvm/Support/RISCVISAInfo.h @@ -85,10 +85,12 @@ static bool isSupportedExtensionFeature(StringRef Ext); static bool isSupportedExtension(StringRef Ext); + static bool isSupportedExtensionWithVersion(StringRef Ext); static bool isSupportedExtension(StringRef Ext, unsigned MajorVersion, unsigned MinorVersion); static llvm::Expected> postProcessAndChecking(std::unique_ptr &&ISAInfo); + static std::string getTargetFeatureForExtension(StringRef Ext); private: RISCVISAInfo(unsigned XLen) Index: llvm/unittests/Support/RISCVISAInfoTest.cpp === --- llvm/unittests/Support/RISCVISAInfoTest.cpp +++ llvm/unittests/Support/RISCVISAInfoTest.cpp @@ -604,3 +604,25 @@ EXPECT_EQ(ExtsRV64IDZce.count("zcmp"), 1U); EXPECT_EQ(ExtsRV64IDZce.count("zcmt"), 1U); } + +TEST(isSupportedExtensionWithVersion, AcceptsSingleExtensionWithVersion) { + EXPECT_TRUE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo1p0")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("")); + EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("c2p0zbb1p0")); +} + +TEST(getTargetFeatureForExtension, RetrieveTargetFeatureFromOneExt) { + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zbb"), "zbb"); + EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zicond1p0"), +
[PATCH] D152423: [RISCV] Add function that check extension name with version
BeMg updated this revision to Diff 549892. BeMg added a comment. Herald added a project: clang. Herald added a subscriber: cfe-commits. rebase and update testcase Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D152423/new/ https://reviews.llvm.org/D152423 Files: clang/lib/Basic/Targets/RISCV.cpp clang/lib/Basic/Targets/RISCV.h clang/test/CodeGen/RISCV/riscv-func-attr-target.c Index: clang/test/CodeGen/RISCV/riscv-func-attr-target.c === --- /dev/null +++ clang/test/CodeGen/RISCV/riscv-func-attr-target.c @@ -0,0 +1,19 @@ +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zifencei \ +// RUN: -target-feature +m -target-feature +a \ +// RUN: -target-feature +f -target-feature +d \ +// RUN: -emit-llvm %s -o - | FileCheck %s \ +// RUN: --check-prefix=CHECK-IR + +// CHECK-IR: void @test1() #0 +__attribute__((target("arch=-a,+v,+zbb,+zicond1p0"))) void test1() {} + +// CHECK-IR: void @test2() #1 +__attribute__((target("arch=rv64gc_zbb"))) void test2 () {} + +// CHECK-IR: void @test3() #2 +__attribute__((target("cpu=rocket-rv64;tune=generic-rv64;arch=+v"))) void test3 () {} + +// CHECK-IR: attributes #0 {{.*}}+experimental-zicond{{.*}}+v,+zbb{{.*}}+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b,-a{{.*}} +// CHECK-IR: attributes #1 {{.*}}+c{{.*}}+zbb{{.*}} +// CHECK-IR: attributes #2 {{.*}} "target-cpu"="rocket-rv64" {{.*}}+v{{.*}} "tune-cpu"="generic-rv64" {{.*}} Index: clang/lib/Basic/Targets/RISCV.h === --- clang/lib/Basic/Targets/RISCV.h +++ clang/lib/Basic/Targets/RISCV.h @@ -114,6 +114,9 @@ void fillValidCPUList(SmallVectorImpl &Values) const override; bool isValidTuneCPUName(StringRef Name) const override; void fillValidTuneCPUList(SmallVectorImpl &Values) const override; + bool supportsTargetAttributeTune() const override { return true; } + bool validateCpuSupports(StringRef FeatureStr) const override; + ParsedTargetAttr parseTargetAttr(StringRef Str) const override; }; class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo { public: Index: clang/lib/Basic/Targets/RISCV.cpp === --- clang/lib/Basic/Targets/RISCV.cpp +++ clang/lib/Basic/Targets/RISCV.cpp @@ -250,12 +250,17 @@ // RISCVISAInfo makes implications for ISA features std::vector ImpliedFeatures = (*ParseResult)->toFeatureVector(); + std::vector UpdatedFeatures; + // Add non-ISA features like `relax` and `save-restore` back for (const std::string &Feature : FeaturesVec) if (!llvm::is_contained(ImpliedFeatures, Feature)) - ImpliedFeatures.push_back(Feature); + UpdatedFeatures.push_back(Feature); + + UpdatedFeatures.insert(UpdatedFeatures.end(), ImpliedFeatures.begin(), + ImpliedFeatures.end()); - return TargetInfo::initFeatureMap(Features, Diags, CPU, ImpliedFeatures); + return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeatures); } std::optional> @@ -346,3 +351,77 @@ bool Is64Bit = getTriple().isArch64Bit(); llvm::RISCV::fillValidTuneCPUArchList(Values, Is64Bit); } + +// Parse RISC-V Target attributes, which are a comma separated list of: +// "arch=" - parsed to features as per -march=.. +// "cpu=" - parsed to features as per -mcpu=.., with CPU set to +// "tune=" - TuneCPU set to +ParsedTargetAttr RISCVTargetInfo::parseTargetAttr(StringRef Features) const { + ParsedTargetAttr Ret; + if (Features == "default") +return Ret; + SmallVector AttrFeatures; + Features.split(AttrFeatures, ";"); + bool FoundArch = false; + + for (auto &Feature : AttrFeatures) { +Feature = Feature.trim(); +StringRef AttrString = Feature.split("=").second.trim(); + +if (Feature.startswith("arch=")) { + if (FoundArch) +Ret.Duplicate = "arch="; + FoundArch = true; + + if (AttrString.startswith("+") || AttrString.startswith("-")) { +// EXTENSION like arch=+v,+zbb,-c +SmallVector Exts; +AttrString.split(Exts, ","); +for (auto Ext : Exts) { + if (Ext.empty()) +continue; + + StringRef ExtName = Ext.substr(1); + std::string TargetFeature = + llvm::RISCVISAInfo::getTargetFeatureForExtension(ExtName); + if (!TargetFeature.empty()) +Ret.Features.push_back(Ext.front() + TargetFeature); + else +Ret.Features.push_back(Ext.str()); +} + } else { +// full-arch-string like arch=rv64gcv +auto RII = llvm::RISCVISAInfo::parseArchString( +AttrString, /* EnableExperimentalExtension */ true); +if (!RII) { + consumeError(RII.takeError()); +} else { + std::vector FeatStrings = (*RII)->toFeatureVe