diff options
author | Craig Topper <craig.topper@sifive.com> | 2024-05-01 14:56:14 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-01 14:56:14 -0700 |
commit | a7e07988549c79d9bfecec3e630141fff61f52f0 (patch) | |
tree | 34a758ff72ac64bab08ea4b7deffcf0d6d47f26a | |
parent | 41466a177a95ee6ff699d190f7625f0b32922a20 (diff) | |
download | llvm-a7e07988549c79d9bfecec3e630141fff61f52f0.zip llvm-a7e07988549c79d9bfecec3e630141fff61f52f0.tar.gz llvm-a7e07988549c79d9bfecec3e630141fff61f52f0.tar.bz2 |
[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.cpp | 16 | ||||
-rw-r--r-- | llvm/utils/TableGen/RISCVTargetDefEmitter.cpp | 5 |
2 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/TargetParser/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp index 64405ca..c763ee7 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 097e1de..6784514 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"; |