Skip to content

Commit 8d8ac5f

Browse files
committed
example w/ unknown attributes
1 parent ed4a22d commit 8d8ac5f

File tree

4 files changed

+144
-13
lines changed

4 files changed

+144
-13
lines changed

mlir/test/Bytecode/versioning/versioning-fallback.mlir

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
// RUN: mlir-opt %s --emit-bytecode > %T/versioning-fallback.mlirbc
2-
"test.versionedD"() <{attribute = #test.attr_params<42, 24>}> : () -> ()
2+
"test.versionedD"() <{
3+
attribute = #test.compound_attr_no_reading<
4+
noReadingNested = #test.compound_attr_no_reading_nested<
5+
value = "foo",
6+
payload = [24, "bar"]
7+
>,
8+
supportsReading = #test.attr_params<42, 24>
9+
>
10+
}> : () -> ()
311

412
// COM: check that versionedD was parsed as a fallback op.
513
// RUN: mlir-opt %T/versioning-fallback.mlirbc | FileCheck %s --check-prefix=CHECK-PARSE
614
// CHECK-PARSE: test.bytecode.fallback
7-
// CHECK-PARSE-SAME: opname = "test.versionedD"
15+
// CHECK-PARSE-SAME: encodedReqdAttributes = [#test.bytecode_fallback<attrIndex = 100,
16+
// CHECK-PARSE-SAME: encodedReqdAttributes = [#test.bytecode_fallback<attrIndex = 101,
17+
// CHECK-PARSE-SAME: encodedReqdAttributes = ["foo", [24, "bar"]],
18+
// CHECK-PARSE-SAME: #test.attr_params<42, 24>
19+
// CHECK-PARSE-SAME: opname = "test.versionedD",
20+
// CHECK-PARSE-SAME: opversion = 1
821

922
// COM: check that the bytecode roundtrip was successful
1023
// RUN: mlir-opt %T/versioning-fallback.mlirbc --verify-roundtrip

mlir/test/lib/Dialect/Test/TestAttrDefs.td

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,4 +405,41 @@ def TestOpAsmAttrInterfaceAttr : Test_Attr<"TestOpAsmAttrInterface",
405405
}];
406406
}
407407

408+
// Test fallback attributes.
409+
def TestBytecodeFallbackAttr : Test_Attr<"TestBytecodeFallback"> {
410+
let mnemonic = "bytecode_fallback";
411+
let parameters = (ins
412+
"uint64_t":$attrIndex,
413+
"::mlir::ArrayAttr":$encodedReqdAttributes,
414+
"::mlir::ArrayAttr":$encodedOptAttributes);
415+
416+
let assemblyFormat = [{
417+
`<` struct(params) `>`
418+
}];
419+
}
420+
421+
// New nested CompoundAttr to validate bytecode fallback attr.
422+
def CompoundAttrNoReadingNested : Test_Attr<"CompoundAttrNoReadingNested"> {
423+
let mnemonic = "compound_attr_no_reading_nested";
424+
let parameters = (ins
425+
"::mlir::StringAttr":$value,
426+
"::mlir::ArrayAttr":$payload);
427+
428+
let assemblyFormat = [{
429+
`<` struct(params) `>`
430+
}];
431+
}
432+
433+
// New CompoundAttr to validate bytecode fallback attr.
434+
def CompoundAttrNoReading : Test_Attr<"CompoundAttrNoReading"> {
435+
let mnemonic = "compound_attr_no_reading";
436+
let parameters = (ins
437+
CompoundAttrNoReadingNested:$noReadingNested,
438+
TestAttrParams:$supportsReading);
439+
440+
let assemblyFormat = [{
441+
`<` struct(params) `>`
442+
}];
443+
}
444+
408445
#endif // TEST_ATTRDEFS

mlir/test/lib/Dialect/Test/TestDialectInterfaces.cpp

Lines changed: 91 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88

99
#include "TestDialect.h"
1010
#include "TestOps.h"
11+
#include "mlir/Bytecode/BytecodeImplementation.h"
12+
#include "mlir/IR/Attributes.h"
1113
#include "mlir/IR/OperationSupport.h"
1214
#include "mlir/Interfaces/FoldInterfaces.h"
1315
#include "mlir/Reducer/ReductionPatternInterface.h"
1416
#include "mlir/Transforms/InliningUtils.h"
17+
#include "llvm/ADT/SmallVector.h"
18+
#include "llvm/Support/LogicalResult.h"
1519

1620
using namespace mlir;
1721
using namespace test;
@@ -40,7 +44,12 @@ struct TestResourceBlobManagerInterface
4044
};
4145

4246
namespace {
43-
enum test_encoding { k_attr_params = 0, k_test_i32 = 99 };
47+
enum test_encoding {
48+
k_attr_params = 0,
49+
k_test_i32 = 99,
50+
kCompoundAttrNoReading = 100,
51+
kCompoundAttrNoReadingNested = 101
52+
};
4453
} // namespace
4554

4655
// Test support for interacting with the Bytecode reader/writer.
@@ -67,6 +76,39 @@ struct TestBytecodeDialectInterface : public BytecodeDialectInterface {
6776
return Type();
6877
}
6978

79+
struct FallbackCompliantAttributeEncoding {
80+
SmallVector<Attribute> requiredAttributes;
81+
SmallVector<Attribute> optionalAttributes;
82+
83+
LogicalResult write(DialectBytecodeWriter &writer, uint64_t attributeCode) {
84+
writer.writeVarInt(attributeCode);
85+
writer.writeList(requiredAttributes,
86+
[&](Attribute attr) { writer.writeAttribute(attr); });
87+
writer.writeList(optionalAttributes, [&](Attribute attr) {
88+
writer.writeOptionalAttribute(attr);
89+
});
90+
return success();
91+
}
92+
93+
LogicalResult read(DialectBytecodeReader &reader) {
94+
// The attribute code should be pre-populated.
95+
96+
// Read the required attributes.
97+
if (failed(reader.readList(requiredAttributes, [&](Attribute &attr) {
98+
return reader.readAttribute(attr);
99+
})))
100+
return failure();
101+
102+
// Read the optional attributes.
103+
if (failed(reader.readList(optionalAttributes, [&](Attribute &attr) {
104+
return reader.readOptionalAttribute(attr);
105+
})))
106+
return failure();
107+
108+
return success();
109+
}
110+
};
111+
70112
LogicalResult writeAttribute(Attribute attr,
71113
DialectBytecodeWriter &writer) const final {
72114
if (auto concreteAttr = llvm::dyn_cast<TestAttrParamsAttr>(attr)) {
@@ -75,6 +117,32 @@ struct TestBytecodeDialectInterface : public BytecodeDialectInterface {
75117
writer.writeVarInt(concreteAttr.getV1());
76118
return success();
77119
}
120+
121+
if (auto concreteAttr = dyn_cast<CompoundAttrNoReadingAttr>(attr)) {
122+
FallbackCompliantAttributeEncoding encoding = {
123+
.requiredAttributes = {concreteAttr.getNoReadingNested(),
124+
concreteAttr.getSupportsReading()},
125+
.optionalAttributes = {}};
126+
return encoding.write(writer, kCompoundAttrNoReading);
127+
}
128+
129+
if (auto concreteAttr = dyn_cast<CompoundAttrNoReadingNestedAttr>(attr)) {
130+
FallbackCompliantAttributeEncoding encoding = {
131+
.requiredAttributes = {concreteAttr.getValue(),
132+
concreteAttr.getPayload()},
133+
.optionalAttributes = {}};
134+
return encoding.write(writer, kCompoundAttrNoReadingNested);
135+
}
136+
137+
if (auto concreteAttr = dyn_cast<TestBytecodeFallbackAttr>(attr)) {
138+
FallbackCompliantAttributeEncoding encoding = {
139+
.requiredAttributes =
140+
llvm::to_vector(concreteAttr.getEncodedReqdAttributes()),
141+
.optionalAttributes =
142+
llvm::to_vector(concreteAttr.getEncodedOptAttributes())};
143+
return encoding.write(writer, concreteAttr.getAttrIndex());
144+
}
145+
78146
return failure();
79147
}
80148

@@ -146,16 +214,29 @@ struct TestBytecodeDialectInterface : public BytecodeDialectInterface {
146214

147215
private:
148216
Attribute readAttrNewEncoding(DialectBytecodeReader &reader) const {
149-
uint64_t encoding;
150-
if (failed(reader.readVarInt(encoding)) ||
151-
encoding != test_encoding::k_attr_params)
217+
uint64_t attributeCode;
218+
if (failed(reader.readVarInt(attributeCode)))
152219
return Attribute();
153-
// The new encoding has v0 first, v1 second.
154-
uint64_t v0, v1;
155-
if (failed(reader.readVarInt(v0)) || failed(reader.readVarInt(v1)))
156-
return Attribute();
157-
return TestAttrParamsAttr::get(getContext(), static_cast<int>(v0),
158-
static_cast<int>(v1));
220+
221+
switch (attributeCode) {
222+
case test_encoding::k_attr_params: {
223+
// The new encoding has v0 first, v1 second.
224+
uint64_t v0, v1;
225+
if (failed(reader.readVarInt(v0)) || failed(reader.readVarInt(v1)))
226+
return Attribute();
227+
return TestAttrParamsAttr::get(getContext(), static_cast<int>(v0),
228+
static_cast<int>(v1));
229+
}
230+
default: {
231+
FallbackCompliantAttributeEncoding encoding;
232+
if (failed(encoding.read(reader)))
233+
return {};
234+
return TestBytecodeFallbackAttr::get(
235+
reader.getContext(), attributeCode,
236+
ArrayAttr::get(reader.getContext(), encoding.requiredAttributes),
237+
ArrayAttr::get(reader.getContext(), encoding.optionalAttributes));
238+
}
239+
}
159240
}
160241

161242
Attribute readAttrOldEncoding(DialectBytecodeReader &reader) const {

mlir/test/lib/Dialect/Test/TestOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3032,7 +3032,7 @@ def TestVersionedOpC : TEST_Op<"versionedC"> {
30323032

30333033
// This op is used to generate tests for the bytecode dialect fallback path.
30343034
def TestVersionedOpD : TEST_Op<"versionedD"> {
3035-
let arguments = (ins AnyAttrOf<[TestAttrParams,
3035+
let arguments = (ins AnyAttrOf<[CompoundAttrNoReading,
30363036
I32ElementsAttr]>:$attribute
30373037
);
30383038

0 commit comments

Comments
 (0)