Skip to content

Commit a9d003e

Browse files
committed
[mlir][bytecodegen] Add ReservedOrDead marker.
Enables reserving or marking dead in enum list, resulting in skipping in dispatches.
1 parent ba0aa2e commit a9d003e

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

mlir/include/mlir/IR/BytecodeBase.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,5 +155,10 @@ class DialectTypes<string d> {
155155
def attr;
156156
def type;
157157

158+
// Marker to indicate a skipped attribute or type in the enum. Could either be
159+
// reserved for a future value or for marking a previously used value as dead.
160+
def none;
161+
def ReservedOrDead : DialectAttrOrType<(none)>;
162+
158163
#endif // BYTECODE_BASE
159164

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: mlir-tblgen -gen-bytecode -bytecode-dialect=Test -I %S/../../include %s 2>&1 | FileCheck %s
2+
3+
include "mlir/IR/BuiltinDialectBytecode.td"
4+
5+
def TestDialectTypes : DialectTypes<"Test"> {
6+
// CHECK: static Type readType
7+
let elems = [
8+
// CHECK: case 0:
9+
// CHECK-NEXT: return readIntegerType(context, reader);
10+
IntegerType,
11+
// No case 1 generated as only reserved.
12+
ReservedOrDead,
13+
// CHECK-NEXT: case 2:
14+
// CHECK-NEXT: return readIndexType(context, reader);
15+
IndexType,
16+
// CHECK-NEXT: case 3:
17+
// CHECK-NEXT: return readBFloat16Type(context, reader);
18+
BFloat16Type,
19+
// No case 4 generated as only reserved.
20+
ReservedOrDead,
21+
// CHECK-NEXT: case 5:
22+
// CHECK-NEXT: return readFloat16Type(context, reader);
23+
Float16Type
24+
];
25+
}
26+

mlir/tools/mlir-tblgen/BytecodeDialectGen.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ void Generator::emitParseDispatch(StringRef kind, ArrayRef<Record *> vec) {
106106
{
107107
auto switchScope = os.scope("{\n", "}\n");
108108
for (const auto &it : llvm::enumerate(vec)) {
109+
if (it.value()->getName() == "ReservedOrDead")
110+
continue;
111+
109112
os << formatv("case {1}:\n return read{0}(context, reader);\n",
110113
it.value()->getName(), it.index());
111114
}
@@ -118,6 +121,9 @@ void Generator::emitParseDispatch(StringRef kind, ArrayRef<Record *> vec) {
118121
}
119122

120123
void Generator::emitParse(StringRef kind, Record &x) {
124+
if (x.getNameInitAsString() == "ReservedOrDead")
125+
return;
126+
121127
char const *head =
122128
R"(static {0} read{1}(MLIRContext* context, DialectBytecodeReader &reader) )";
123129
mlir::raw_indented_ostream os(output);
@@ -282,6 +288,9 @@ void Generator::emitParseHelper(StringRef kind, StringRef returnType,
282288

283289
void Generator::emitPrint(StringRef kind, StringRef type,
284290
ArrayRef<std::pair<int64_t, Record *>> vec) {
291+
if (type == "ReservedOrDead")
292+
return;
293+
285294
char const *head =
286295
R"(static void write({0} {1}, DialectBytecodeWriter &writer) )";
287296
mlir::raw_indented_ostream os(output);
@@ -394,6 +403,9 @@ void Generator::emitPrintDispatch(StringRef kind, ArrayRef<std::string> vec) {
394403
<< ")";
395404
auto switchScope = os.scope("", "");
396405
for (StringRef type : vec) {
406+
if (type == "ReservedOrDead")
407+
continue;
408+
397409
os << "\n.Case([&](" << type << " t)";
398410
auto caseScope = os.scope(" {\n", "})");
399411
os << "return write(t, writer), success();\n";

0 commit comments

Comments
 (0)