[llvm] [TableGen][NFC] Factor early-out range check. (PR #123645)
Jason Eckhardt via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 20 12:40:02 PST 2025
https://github.com/nvjle updated https://github.com/llvm/llvm-project/pull/123645
>From d919d4d28a2d2343abf68d14ea908d514986ebbf Mon Sep 17 00:00:00 2001
From: Jason Eckhardt <jeckhardt at nvidia.com>
Date: Mon, 20 Jan 2025 10:35:06 -0600
Subject: [PATCH 1/2] [TableGen][NFC] Factor early-out range check.
Combine the EarlyOut and IsContiguous range check.
Also avoid "comparison is always false" warnings in emitted code when
the lower-bound check is against 0.
---
.../utils/TableGen/SearchableTableEmitter.cpp | 41 ++++++++-----------
1 file changed, 18 insertions(+), 23 deletions(-)
diff --git a/llvm/utils/TableGen/SearchableTableEmitter.cpp b/llvm/utils/TableGen/SearchableTableEmitter.cpp
index 38b6f2b3951375..5788e6eb56a683 100644
--- a/llvm/utils/TableGen/SearchableTableEmitter.cpp
+++ b/llvm/utils/TableGen/SearchableTableEmitter.cpp
@@ -392,37 +392,32 @@ void SearchableTableEmitter::emitLookupFunction(const GenericTable &Table,
}
}
- if (IsContiguous) {
+ if (Index.EarlyOut || IsContiguous) {
const GenericField &Field = Index.Fields[0];
std::string FirstRepr = primaryRepresentation(
Index.Loc, Field, IndexRows[0]->getValueInit(Field.Name));
std::string LastRepr = primaryRepresentation(
Index.Loc, Field, IndexRows.back()->getValueInit(Field.Name));
- OS << " if ((" << Field.Name << " < " << FirstRepr << ") ||\n";
- OS << " (" << Field.Name << " > " << LastRepr << "))\n";
- OS << " return nullptr;\n";
- OS << " auto Table = ArrayRef(" << IndexName << ");\n";
- OS << " size_t Idx = " << Index.Fields[0].Name << " - " << FirstRepr
- << ";\n";
- OS << " return ";
- if (IsPrimary)
- OS << "&Table[Idx]";
+ if (getNumericKey(Index, IndexRows[0]) == 0)
+ OS << " if (";
else
- OS << "&" << Table.Name << "[Table[Idx]._index]";
- OS << ";\n";
- OS << "}\n";
- return;
- }
-
- if (Index.EarlyOut) {
- const GenericField &Field = Index.Fields[0];
- std::string FirstRepr = primaryRepresentation(
- Index.Loc, Field, IndexRows[0]->getValueInit(Field.Name));
- std::string LastRepr = primaryRepresentation(
- Index.Loc, Field, IndexRows.back()->getValueInit(Field.Name));
- OS << " if ((" << Field.Name << " < " << FirstRepr << ") ||\n";
+ OS << " if ((" << Field.Name << " < " << FirstRepr << ") ||\n";
OS << " (" << Field.Name << " > " << LastRepr << "))\n";
OS << " return nullptr;\n\n";
+
+ if (IsContiguous) {
+ OS << " auto Table = ArrayRef(" << IndexName << ");\n";
+ OS << " size_t Idx = " << Index.Fields[0].Name << " - " << FirstRepr
+ << ";\n";
+ OS << " return ";
+ if (IsPrimary)
+ OS << "&Table[Idx]";
+ else
+ OS << "&" << Table.Name << "[Table[Idx]._index]";
+ OS << ";\n";
+ OS << "}\n";
+ return;
+ }
}
OS << " struct KeyType {\n";
>From 5a5e07274b4227b6089d0f50ef87f1ca5ab59790 Mon Sep 17 00:00:00 2001
From: Jason Eckhardt <jeckhardt at nvidia.com>
Date: Mon, 20 Jan 2025 14:38:24 -0600
Subject: [PATCH 2/2] wip
---
.../utils/TableGen/SearchableTableEmitter.cpp | 20 +++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/llvm/utils/TableGen/SearchableTableEmitter.cpp b/llvm/utils/TableGen/SearchableTableEmitter.cpp
index 5788e6eb56a683..2ee996bffb3813 100644
--- a/llvm/utils/TableGen/SearchableTableEmitter.cpp
+++ b/llvm/utils/TableGen/SearchableTableEmitter.cpp
@@ -211,20 +211,21 @@ class SearchableTableEmitter {
// known, return that numeric value.
int64_t SearchableTableEmitter::getNumericKey(const SearchIndex &Index,
const Record *Rec) {
- assert(Index.Fields.size() == 1);
+ const GenericField &Field = Index.Fields[0];
// To be consistent with compareBy and primaryRepresentation elsewhere,
// we check for IsInstruction before Enum-- these fields are not exclusive.
- if (Index.Fields[0].IsInstruction) {
- const Record *TheDef = Rec->getValueAsDef(Index.Fields[0].Name);
+ if (Field.IsInstruction) {
+ const Record *TheDef = Rec->getValueAsDef(Field.Name);
return Target->getInstrIntValue(TheDef);
}
- if (Index.Fields[0].Enum) {
- const Record *EnumEntry = Rec->getValueAsDef(Index.Fields[0].Name);
- return Index.Fields[0].Enum->EntryMap[EnumEntry]->second;
+ if (Field.Enum) {
+ const Record *EnumEntry = Rec->getValueAsDef(Field.Name);
+ return Field.Enum->EntryMap[EnumEntry]->second;
}
+ assert(isa<BitsRecTy>(Field.RecType) && "unexpected field type");
- return getInt(Rec, Index.Fields[0].Name);
+ return getInt(Rec, Field.Name);
}
/// Less-than style comparison between \p LHS and \p RHS according to the
@@ -405,10 +406,9 @@ void SearchableTableEmitter::emitLookupFunction(const GenericTable &Table,
OS << " (" << Field.Name << " > " << LastRepr << "))\n";
OS << " return nullptr;\n\n";
- if (IsContiguous) {
+ if (IsContiguous && !Index.EarlyOut) {
OS << " auto Table = ArrayRef(" << IndexName << ");\n";
- OS << " size_t Idx = " << Index.Fields[0].Name << " - " << FirstRepr
- << ";\n";
+ OS << " size_t Idx = " << Field.Name << " - " << FirstRepr << ";\n";
OS << " return ";
if (IsPrimary)
OS << "&Table[Idx]";
More information about the llvm-commits
mailing list