summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@sifive.com>2024-05-01 14:56:14 -0700
committerGitHub <noreply@github.com>2024-05-01 14:56:14 -0700
commita7e07988549c79d9bfecec3e630141fff61f52f0 (patch)
tree34a758ff72ac64bab08ea4b7deffcf0d6d47f26a
parent41466a177a95ee6ff699d190f7625f0b32922a20 (diff)
[RISCV] Use binary search to look up supported profiles. (#90767)
As the list of profiles grow, this will be a more efficient lookup. Because the profile name is a prefix of the Arch string, we use upper_bound to find the first profile that definitely comes after the Arch string. If that isn't the first supported profile, we move back 1 profile and see if that profile is a prefix of our Arch string.
-rw-r--r--llvm/lib/TargetParser/RISCVISAInfo.cpp16
-rw-r--r--llvm/utils/TableGen/RISCVTargetDefEmitter.cpp5
2 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/TargetParser/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp
index 64405ca8cb9f..c763ee73b4b0 100644
--- a/llvm/lib/TargetParser/RISCVISAInfo.cpp
+++ b/llvm/lib/TargetParser/RISCVISAInfo.cpp
@@ -598,14 +598,14 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
XLen = 64;
} else {
// Try parsing as a profile.
- const auto *FoundProfile =
- llvm::find_if(SupportedProfiles, [Arch](const RISCVProfile &Profile) {
- return Arch.starts_with(Profile.Name);
- });
-
- if (FoundProfile != std::end(SupportedProfiles)) {
- std::string NewArch = FoundProfile->MArch.str();
- StringRef ArchWithoutProfile = Arch.drop_front(FoundProfile->Name.size());
+ auto I = llvm::upper_bound(SupportedProfiles, Arch,
+ [](StringRef Arch, const RISCVProfile &Profile) {
+ return Arch < Profile.Name;
+ });
+
+ if (I != std::begin(SupportedProfiles) && Arch.starts_with((--I)->Name)) {
+ std::string NewArch = I->MArch.str();
+ StringRef ArchWithoutProfile = Arch.drop_front(I->Name.size());
if (!ArchWithoutProfile.empty()) {
if (ArchWithoutProfile.front() != '_')
return createStringError(
diff --git a/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp b/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp
index 097e1deb3ed1..6784514032eb 100644
--- a/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp
+++ b/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp
@@ -124,7 +124,10 @@ static void emitRISCVProfiles(RecordKeeper &Records, raw_ostream &OS) {
OS << "static constexpr RISCVProfile SupportedProfiles[] = {\n";
- for (const Record *Rec : Records.getAllDerivedDefinitions("RISCVProfile")) {
+ auto Profiles = Records.getAllDerivedDefinitions("RISCVProfile");
+ llvm::sort(Profiles, LessRecordFieldName());
+
+ for (const Record *Rec : Profiles) {
OS.indent(4) << "{\"" << Rec->getValueAsString("Name") << "\",\"";
printMArch(OS, Rec->getValueAsListOfDefs("Implies"));
OS << "\"},\n";