[llvm] [TableGen] Add support for sparse direct-lookup tables (PR #201158)
Igor Wodiany via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 29 03:01:01 PDT 2026
================
@@ -575,25 +577,70 @@ void SearchableTableEmitter::emitGenericTable(const GenericTable &Table,
emitIfdef((Twine("GET_") + Table.PreprocessorGuard + "_IMPL").str(), OS);
+ SmallVector<const Record *, 0> SparseEntries;
+ ArrayRef<const Record *> Entries;
+ unsigned DirectLookupSlots = 0;
+ if (Table.AllowSparseTable) {
+ const auto *KeyBits = cast<BitsRecTy>(Table.PrimaryKey->Fields[0].RecType);
+ DirectLookupSlots = 1u << KeyBits->getNumBits();
+ SparseEntries.resize(DirectLookupSlots);
+ StringRef KeyFieldName = Table.PrimaryKey->Fields[0].Name;
+ for (const Record *Entry : Table.Entries) {
+ uint64_t Key = static_cast<uint64_t>(getInt(Entry, KeyFieldName));
+ assert(Key < DirectLookupSlots && "key exceeds table size");
+ if (SparseEntries[Key])
+ PrintFatalError(Entry, Twine("In table '") + Table.Name +
+ "', duplicate primary key value " +
+ Twine(Key));
+ SparseEntries[Key] = Entry;
+ }
+ Entries = SparseEntries;
+ } else {
+ Entries = Table.Entries;
+ }
+
// The primary data table contains all the fields defined for this map.
OS << "constexpr " << Table.CppTypeName << " " << Table.Name << "[] = {\n";
- for (const auto &[Idx, Entry] : enumerate(Table.Entries)) {
+ for (const auto &[Idx, Entry] : enumerate(Entries)) {
OS << " { ";
-
ListSeparator LS;
- for (const auto &Field : Table.Fields)
- OS << LS
- << primaryRepresentation(Table.Locs[0], Field,
- Entry->getValueInit(Field.Name));
-
+ if (Entry) {
+ for (const auto &Field : Table.Fields)
+ OS << LS
+ << primaryRepresentation(Table.Locs[0], Field,
+ Entry->getValueInit(Field.Name));
+ } else if (Table.AllowSparseTable) {
+ // For empty rows emit a sentinel value as a key, so we can return null
+ // during lookup. Value is constructed such that LookupKey != KeyField.
+ for (const auto &Field : Table.Fields) {
+ OS << LS;
+ if (Field.Name == Table.PrimaryKey->Fields[0].Name)
+ OS << "0x" << utohexstr((DirectLookupSlots - 1) ^ Idx);
----------------
IgWod wrote:
Yes, it's good idea. I've updated it.
https://github.com/llvm/llvm-project/pull/201158
More information about the llvm-commits
mailing list