xref: /llvm-project/mlir/test/lib/Dialect/Test/TestDialect.cpp (revision db791b278a414fb6df1acc1799adcf11d8fb9169)
1fec6c5acSUday Bondhugula //===- TestDialect.cpp - MLIR Dialect for Testing -------------------------===//
2fec6c5acSUday Bondhugula //
3fec6c5acSUday Bondhugula // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fec6c5acSUday Bondhugula // See https://llvm.org/LICENSE.txt for license information.
5fec6c5acSUday Bondhugula // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fec6c5acSUday Bondhugula //
7fec6c5acSUday Bondhugula //===----------------------------------------------------------------------===//
8fec6c5acSUday Bondhugula 
9fec6c5acSUday Bondhugula #include "TestDialect.h"
10e95e94adSJeff Niu #include "TestOps.h"
112e2cdd0aSRiver Riddle #include "TestTypes.h"
120e0b6070SMatteo Franciolini #include "mlir/Bytecode/BytecodeImplementation.h"
13abc362a1SJakub Kuderski #include "mlir/Dialect/Arith/IR/Arith.h"
1423aa5a74SRiver Riddle #include "mlir/Dialect/Func/IR/FuncOps.h"
153ed3e438SMaheshRavishankar #include "mlir/Dialect/Tensor/IR/Tensor.h"
16ea488bd6SRiver Riddle #include "mlir/IR/AsmState.h"
1795aff23eSKrzysztof Drewniak #include "mlir/IR/BuiltinAttributes.h"
1865fcddffSRiver Riddle #include "mlir/IR/BuiltinOps.h"
1995aff23eSKrzysztof Drewniak #include "mlir/IR/Diagnostics.h"
209e0b5533SMathieu Fehr #include "mlir/IR/ExtensibleDialect.h"
2195aff23eSKrzysztof Drewniak #include "mlir/IR/MLIRContext.h"
225e118f93SMehdi Amini #include "mlir/IR/ODSSupport.h"
2395aff23eSKrzysztof Drewniak #include "mlir/IR/OperationSupport.h"
24fec6c5acSUday Bondhugula #include "mlir/IR/PatternMatch.h"
25fec6c5acSUday Bondhugula #include "mlir/IR/TypeUtilities.h"
265232c5c5SChia-hung Duan #include "mlir/IR/Verifier.h"
275d8813deSAlex Zinenko #include "mlir/Interfaces/CallInterfaces.h"
2834a35a8bSMartin Erhart #include "mlir/Interfaces/FunctionImplementation.h"
2995aff23eSKrzysztof Drewniak #include "mlir/Interfaces/InferIntRangeInterface.h"
308c2bff1aSMehdi Amini #include "mlir/Support/LLVM.h"
31fec6c5acSUday Bondhugula #include "mlir/Transforms/FoldUtils.h"
32fec6c5acSUday Bondhugula #include "mlir/Transforms/InliningUtils.h"
338c2bff1aSMehdi Amini #include "llvm/ADT/STLFunctionalExtras.h"
3495aff23eSKrzysztof Drewniak #include "llvm/ADT/SmallString.h"
35a266a210SJeremy Furtek #include "llvm/ADT/StringExtras.h"
36fec6c5acSUday Bondhugula #include "llvm/ADT/StringSwitch.h"
37b89b3cdbSRahul Kayaith #include "llvm/Support/Base64.h"
38830b9b07SMehdi Amini #include "llvm/Support/Casting.h"
39fec6c5acSUday Bondhugula 
40e95e94adSJeff Niu #include "mlir/Dialect/Arith/IR/Arith.h"
41e95e94adSJeff Niu #include "mlir/Dialect/DLTI/DLTI.h"
42e95e94adSJeff Niu #include "mlir/Interfaces/FoldInterfaces.h"
43e95e94adSJeff Niu #include "mlir/Reducer/ReductionPatternInterface.h"
44e95e94adSJeff Niu #include "mlir/Transforms/InliningUtils.h"
45660f714eSMehdi Amini #include <cstdint>
46bbfa7ef1SMarkus Böck #include <numeric>
470e0b6070SMatteo Franciolini #include <optional>
48bbfa7ef1SMarkus Böck 
49e95e94adSJeff Niu // Include this before the using namespace lines below to test that we don't
50e95e94adSJeff Niu // have namespace dependencies.
51485cc55eSStella Laurenzo #include "TestOpsDialect.cpp.inc"
52485cc55eSStella Laurenzo 
537776b19eSStephen Neuendorffer using namespace mlir;
547776b19eSStephen Neuendorffer using namespace test;
557776b19eSStephen Neuendorffer 
56e95e94adSJeff Niu //===----------------------------------------------------------------------===//
57e95e94adSJeff Niu // PropertiesWithCustomPrint
58e95e94adSJeff Niu //===----------------------------------------------------------------------===//
59e95e94adSJeff Niu 
60e95e94adSJeff Niu LogicalResult
setPropertiesFromAttribute(PropertiesWithCustomPrint & prop,Attribute attr,function_ref<InFlightDiagnostic ()> emitError)61e95e94adSJeff Niu test::setPropertiesFromAttribute(PropertiesWithCustomPrint &prop,
62e95e94adSJeff Niu                                  Attribute attr,
63e95e94adSJeff Niu                                  function_ref<InFlightDiagnostic()> emitError) {
64e95e94adSJeff Niu   DictionaryAttr dict = dyn_cast<DictionaryAttr>(attr);
65e95e94adSJeff Niu   if (!dict) {
66e95e94adSJeff Niu     emitError() << "expected DictionaryAttr to set TestProperties";
67e95e94adSJeff Niu     return failure();
68e95e94adSJeff Niu   }
69e95e94adSJeff Niu   auto label = dict.getAs<mlir::StringAttr>("label");
70e95e94adSJeff Niu   if (!label) {
71e95e94adSJeff Niu     emitError() << "expected StringAttr for key `label`";
72e95e94adSJeff Niu     return failure();
73e95e94adSJeff Niu   }
74e95e94adSJeff Niu   auto valueAttr = dict.getAs<IntegerAttr>("value");
75e95e94adSJeff Niu   if (!valueAttr) {
76e95e94adSJeff Niu     emitError() << "expected IntegerAttr for key `value`";
77e95e94adSJeff Niu     return failure();
78e95e94adSJeff Niu   }
79e95e94adSJeff Niu 
80e95e94adSJeff Niu   prop.label = std::make_shared<std::string>(label.getValue());
81e95e94adSJeff Niu   prop.value = valueAttr.getValue().getSExtValue();
82e95e94adSJeff Niu   return success();
83e95e94adSJeff Niu }
84e95e94adSJeff Niu 
85e95e94adSJeff Niu DictionaryAttr
getPropertiesAsAttribute(MLIRContext * ctx,const PropertiesWithCustomPrint & prop)86e95e94adSJeff Niu test::getPropertiesAsAttribute(MLIRContext *ctx,
87e95e94adSJeff Niu                                const PropertiesWithCustomPrint &prop) {
88e95e94adSJeff Niu   SmallVector<NamedAttribute> attrs;
89e95e94adSJeff Niu   Builder b{ctx};
90e95e94adSJeff Niu   attrs.push_back(b.getNamedAttr("label", b.getStringAttr(*prop.label)));
91e95e94adSJeff Niu   attrs.push_back(b.getNamedAttr("value", b.getI32IntegerAttr(prop.value)));
92e95e94adSJeff Niu   return b.getDictionaryAttr(attrs);
93e95e94adSJeff Niu }
94e95e94adSJeff Niu 
computeHash(const PropertiesWithCustomPrint & prop)95e95e94adSJeff Niu llvm::hash_code test::computeHash(const PropertiesWithCustomPrint &prop) {
96e95e94adSJeff Niu   return llvm::hash_combine(prop.value, StringRef(*prop.label));
97e95e94adSJeff Niu }
98e95e94adSJeff Niu 
customPrintProperties(OpAsmPrinter & p,const PropertiesWithCustomPrint & prop)99e95e94adSJeff Niu void test::customPrintProperties(OpAsmPrinter &p,
100e95e94adSJeff Niu                                  const PropertiesWithCustomPrint &prop) {
101e95e94adSJeff Niu   p.printKeywordOrString(*prop.label);
102e95e94adSJeff Niu   p << " is " << prop.value;
103e95e94adSJeff Niu }
104e95e94adSJeff Niu 
customParseProperties(OpAsmParser & parser,PropertiesWithCustomPrint & prop)105e95e94adSJeff Niu ParseResult test::customParseProperties(OpAsmParser &parser,
106e95e94adSJeff Niu                                         PropertiesWithCustomPrint &prop) {
107e95e94adSJeff Niu   std::string label;
108e95e94adSJeff Niu   if (parser.parseKeywordOrString(&label) || parser.parseKeyword("is") ||
109e95e94adSJeff Niu       parser.parseInteger(prop.value))
110e95e94adSJeff Niu     return failure();
111e95e94adSJeff Niu   prop.label = std::make_shared<std::string>(std::move(label));
112e95e94adSJeff Niu   return success();
113e95e94adSJeff Niu }
114e95e94adSJeff Niu 
115e95e94adSJeff Niu //===----------------------------------------------------------------------===//
116e95e94adSJeff Niu // MyPropStruct
117e95e94adSJeff Niu //===----------------------------------------------------------------------===//
118e95e94adSJeff Niu 
asAttribute(MLIRContext * ctx) const1195e118f93SMehdi Amini Attribute MyPropStruct::asAttribute(MLIRContext *ctx) const {
1205e118f93SMehdi Amini   return StringAttr::get(ctx, content);
1215e118f93SMehdi Amini }
122a0c19bd4SMaksim Levental 
1238c2bff1aSMehdi Amini LogicalResult
setFromAttr(MyPropStruct & prop,Attribute attr,function_ref<InFlightDiagnostic ()> emitError)1248c2bff1aSMehdi Amini MyPropStruct::setFromAttr(MyPropStruct &prop, Attribute attr,
125c50617daSMehdi Amini                           function_ref<InFlightDiagnostic()> emitError) {
1265550c821STres Popp   StringAttr strAttr = dyn_cast<StringAttr>(attr);
1275e118f93SMehdi Amini   if (!strAttr) {
128c50617daSMehdi Amini     emitError() << "Expect StringAttr but got " << attr;
1295e118f93SMehdi Amini     return failure();
1305e118f93SMehdi Amini   }
1315e118f93SMehdi Amini   prop.content = strAttr.getValue();
1325e118f93SMehdi Amini   return success();
1335e118f93SMehdi Amini }
134a0c19bd4SMaksim Levental 
hash() const1355e118f93SMehdi Amini llvm::hash_code MyPropStruct::hash() const {
1365e118f93SMehdi Amini   return hash_value(StringRef(content));
1375e118f93SMehdi Amini }
1385e118f93SMehdi Amini 
readFromMlirBytecode(DialectBytecodeReader & reader,MyPropStruct & prop)139e95e94adSJeff Niu LogicalResult test::readFromMlirBytecode(DialectBytecodeReader &reader,
140660f714eSMehdi Amini                                          MyPropStruct &prop) {
141660f714eSMehdi Amini   StringRef str;
142660f714eSMehdi Amini   if (failed(reader.readString(str)))
143660f714eSMehdi Amini     return failure();
144660f714eSMehdi Amini   prop.content = str.str();
145660f714eSMehdi Amini   return success();
146660f714eSMehdi Amini }
147660f714eSMehdi Amini 
writeToMlirBytecode(DialectBytecodeWriter & writer,MyPropStruct & prop)148e95e94adSJeff Niu void test::writeToMlirBytecode(DialectBytecodeWriter &writer,
149660f714eSMehdi Amini                                MyPropStruct &prop) {
150660f714eSMehdi Amini   writer.writeOwnedString(prop.content);
151660f714eSMehdi Amini }
152660f714eSMehdi Amini 
153e95e94adSJeff Niu //===----------------------------------------------------------------------===//
154e95e94adSJeff Niu // VersionedProperties
155e95e94adSJeff Niu //===----------------------------------------------------------------------===//
156e95e94adSJeff Niu 
157e95e94adSJeff Niu LogicalResult
setPropertiesFromAttribute(VersionedProperties & prop,Attribute attr,function_ref<InFlightDiagnostic ()> emitError)158e95e94adSJeff Niu test::setPropertiesFromAttribute(VersionedProperties &prop, Attribute attr,
159e95e94adSJeff Niu                                  function_ref<InFlightDiagnostic()> emitError) {
160e95e94adSJeff Niu   DictionaryAttr dict = dyn_cast<DictionaryAttr>(attr);
161e95e94adSJeff Niu   if (!dict) {
162e95e94adSJeff Niu     emitError() << "expected DictionaryAttr to set VersionedProperties";
163e95e94adSJeff Niu     return failure();
164e95e94adSJeff Niu   }
165e95e94adSJeff Niu   auto value1Attr = dict.getAs<IntegerAttr>("value1");
166e95e94adSJeff Niu   if (!value1Attr) {
167e95e94adSJeff Niu     emitError() << "expected IntegerAttr for key `value1`";
168e95e94adSJeff Niu     return failure();
169e95e94adSJeff Niu   }
170e95e94adSJeff Niu   auto value2Attr = dict.getAs<IntegerAttr>("value2");
171e95e94adSJeff Niu   if (!value2Attr) {
172e95e94adSJeff Niu     emitError() << "expected IntegerAttr for key `value2`";
173e95e94adSJeff Niu     return failure();
174e95e94adSJeff Niu   }
175e95e94adSJeff Niu 
176e95e94adSJeff Niu   prop.value1 = value1Attr.getValue().getSExtValue();
177e95e94adSJeff Niu   prop.value2 = value2Attr.getValue().getSExtValue();
178e95e94adSJeff Niu   return success();
179e95e94adSJeff Niu }
180e95e94adSJeff Niu 
getPropertiesAsAttribute(MLIRContext * ctx,const VersionedProperties & prop)181e95e94adSJeff Niu DictionaryAttr test::getPropertiesAsAttribute(MLIRContext *ctx,
182e95e94adSJeff Niu                                               const VersionedProperties &prop) {
183e95e94adSJeff Niu   SmallVector<NamedAttribute> attrs;
184e95e94adSJeff Niu   Builder b{ctx};
185e95e94adSJeff Niu   attrs.push_back(b.getNamedAttr("value1", b.getI32IntegerAttr(prop.value1)));
186e95e94adSJeff Niu   attrs.push_back(b.getNamedAttr("value2", b.getI32IntegerAttr(prop.value2)));
187e95e94adSJeff Niu   return b.getDictionaryAttr(attrs);
188e95e94adSJeff Niu }
189e95e94adSJeff Niu 
computeHash(const VersionedProperties & prop)190e95e94adSJeff Niu llvm::hash_code test::computeHash(const VersionedProperties &prop) {
191e95e94adSJeff Niu   return llvm::hash_combine(prop.value1, prop.value2);
192e95e94adSJeff Niu }
193e95e94adSJeff Niu 
customPrintProperties(OpAsmPrinter & p,const VersionedProperties & prop)194e95e94adSJeff Niu void test::customPrintProperties(OpAsmPrinter &p,
195e95e94adSJeff Niu                                  const VersionedProperties &prop) {
196e95e94adSJeff Niu   p << prop.value1 << " | " << prop.value2;
197e95e94adSJeff Niu }
198e95e94adSJeff Niu 
customParseProperties(OpAsmParser & parser,VersionedProperties & prop)199e95e94adSJeff Niu ParseResult test::customParseProperties(OpAsmParser &parser,
200e95e94adSJeff Niu                                         VersionedProperties &prop) {
201e95e94adSJeff Niu   if (parser.parseInteger(prop.value1) || parser.parseVerticalBar() ||
202e95e94adSJeff Niu       parser.parseInteger(prop.value2))
203e95e94adSJeff Niu     return failure();
204e95e94adSJeff Niu   return success();
205e95e94adSJeff Niu }
206e95e94adSJeff Niu 
207e95e94adSJeff Niu //===----------------------------------------------------------------------===//
208e95e94adSJeff Niu // Bytecode Support
209e95e94adSJeff Niu //===----------------------------------------------------------------------===//
210e95e94adSJeff Niu 
readFromMlirBytecode(DialectBytecodeReader & reader,MutableArrayRef<int64_t> prop)211e95e94adSJeff Niu LogicalResult test::readFromMlirBytecode(DialectBytecodeReader &reader,
212660f714eSMehdi Amini                                          MutableArrayRef<int64_t> prop) {
213660f714eSMehdi Amini   uint64_t size;
214660f714eSMehdi Amini   if (failed(reader.readVarInt(size)))
215660f714eSMehdi Amini     return failure();
216660f714eSMehdi Amini   if (size != prop.size())
217660f714eSMehdi Amini     return reader.emitError("array size mismach when reading properties: ")
218660f714eSMehdi Amini            << size << " vs expected " << prop.size();
219660f714eSMehdi Amini   for (auto &elt : prop) {
220660f714eSMehdi Amini     uint64_t value;
221660f714eSMehdi Amini     if (failed(reader.readVarInt(value)))
222660f714eSMehdi Amini       return failure();
223660f714eSMehdi Amini     elt = value;
224660f714eSMehdi Amini   }
225660f714eSMehdi Amini   return success();
226660f714eSMehdi Amini }
227660f714eSMehdi Amini 
writeToMlirBytecode(DialectBytecodeWriter & writer,ArrayRef<int64_t> prop)228e95e94adSJeff Niu void test::writeToMlirBytecode(DialectBytecodeWriter &writer,
229660f714eSMehdi Amini                                ArrayRef<int64_t> prop) {
230660f714eSMehdi Amini   writer.writeVarInt(prop.size());
231660f714eSMehdi Amini   for (auto elt : prop)
232660f714eSMehdi Amini     writer.writeVarInt(elt);
233660f714eSMehdi Amini }
234660f714eSMehdi Amini 
235fec6c5acSUday Bondhugula //===----------------------------------------------------------------------===//
2369e0b5533SMathieu Fehr // Dynamic operations
2379e0b5533SMathieu Fehr //===----------------------------------------------------------------------===//
2389e0b5533SMathieu Fehr 
getDynamicGenericOp(TestDialect * dialect)2399e0b5533SMathieu Fehr std::unique_ptr<DynamicOpDefinition> getDynamicGenericOp(TestDialect *dialect) {
2409e0b5533SMathieu Fehr   return DynamicOpDefinition::get(
2419e0b5533SMathieu Fehr       "dynamic_generic", dialect, [](Operation *op) { return success(); },
2429e0b5533SMathieu Fehr       [](Operation *op) { return success(); });
2439e0b5533SMathieu Fehr }
2449e0b5533SMathieu Fehr 
2459e0b5533SMathieu Fehr std::unique_ptr<DynamicOpDefinition>
getDynamicOneOperandTwoResultsOp(TestDialect * dialect)2469e0b5533SMathieu Fehr getDynamicOneOperandTwoResultsOp(TestDialect *dialect) {
2479e0b5533SMathieu Fehr   return DynamicOpDefinition::get(
2489e0b5533SMathieu Fehr       "dynamic_one_operand_two_results", dialect,
2499e0b5533SMathieu Fehr       [](Operation *op) {
2509e0b5533SMathieu Fehr         if (op->getNumOperands() != 1) {
2519e0b5533SMathieu Fehr           op->emitOpError()
2529e0b5533SMathieu Fehr               << "expected 1 operand, but had " << op->getNumOperands();
2539e0b5533SMathieu Fehr           return failure();
2549e0b5533SMathieu Fehr         }
2559e0b5533SMathieu Fehr         if (op->getNumResults() != 2) {
2569e0b5533SMathieu Fehr           op->emitOpError()
2579e0b5533SMathieu Fehr               << "expected 2 results, but had " << op->getNumResults();
2589e0b5533SMathieu Fehr           return failure();
2599e0b5533SMathieu Fehr         }
2609e0b5533SMathieu Fehr         return success();
2619e0b5533SMathieu Fehr       },
2629e0b5533SMathieu Fehr       [](Operation *op) { return success(); });
2639e0b5533SMathieu Fehr }
2649e0b5533SMathieu Fehr 
2659e0b5533SMathieu Fehr std::unique_ptr<DynamicOpDefinition>
getDynamicCustomParserPrinterOp(TestDialect * dialect)2669e0b5533SMathieu Fehr getDynamicCustomParserPrinterOp(TestDialect *dialect) {
2679e0b5533SMathieu Fehr   auto verifier = [](Operation *op) {
2689e0b5533SMathieu Fehr     if (op->getNumOperands() == 0 && op->getNumResults() == 0)
2699e0b5533SMathieu Fehr       return success();
2709e0b5533SMathieu Fehr     op->emitError() << "operation should have no operands and no results";
2719e0b5533SMathieu Fehr     return failure();
2729e0b5533SMathieu Fehr   };
2739e0b5533SMathieu Fehr   auto regionVerifier = [](Operation *op) { return success(); };
2749e0b5533SMathieu Fehr 
2759e0b5533SMathieu Fehr   auto parser = [](OpAsmParser &parser, OperationState &state) {
2769e0b5533SMathieu Fehr     return parser.parseKeyword("custom_keyword");
2779e0b5533SMathieu Fehr   };
2789e0b5533SMathieu Fehr 
2799e0b5533SMathieu Fehr   auto printer = [](Operation *op, OpAsmPrinter &printer, llvm::StringRef) {
2809e0b5533SMathieu Fehr     printer << op->getName() << " custom_keyword";
2819e0b5533SMathieu Fehr   };
2829e0b5533SMathieu Fehr 
2839e0b5533SMathieu Fehr   return DynamicOpDefinition::get("dynamic_custom_parser_printer", dialect,
2849e0b5533SMathieu Fehr                                   verifier, regionVerifier, parser, printer);
2859e0b5533SMathieu Fehr }
2869e0b5533SMathieu Fehr 
2879e0b5533SMathieu Fehr //===----------------------------------------------------------------------===//
288fec6c5acSUday Bondhugula // TestDialect
289fec6c5acSUday Bondhugula //===----------------------------------------------------------------------===//
290fec6c5acSUday Bondhugula 
registerTestDialect(DialectRegistry & registry)291e95e94adSJeff Niu void test::registerTestDialect(DialectRegistry &registry) {
292e95e94adSJeff Niu   registry.insert<TestDialect>();
293e95e94adSJeff Niu }
294e95e94adSJeff Niu 
testSideEffectOpGetEffect(Operation * op,SmallVectorImpl<SideEffects::EffectInstance<TestEffects::Effect>> & effects)295e95e94adSJeff Niu void test::testSideEffectOpGetEffect(
296d905c103SMehdi Amini     Operation *op,
297e95e94adSJeff Niu     SmallVectorImpl<SideEffects::EffectInstance<TestEffects::Effect>>
298e95e94adSJeff Niu         &effects) {
299e95e94adSJeff Niu   auto effectsAttr = op->getAttrOfType<AffineMapAttr>("effect_parameter");
300e95e94adSJeff Niu   if (!effectsAttr)
301e95e94adSJeff Niu     return;
302e95e94adSJeff Niu 
303e95e94adSJeff Niu   effects.emplace_back(TestEffects::Concrete::get(), effectsAttr);
304e95e94adSJeff Niu }
305d905c103SMehdi Amini 
306d905c103SMehdi Amini // This is the implementation of a dialect fallback for `TestEffectOpInterface`.
307d905c103SMehdi Amini struct TestOpEffectInterfaceFallback
308d905c103SMehdi Amini     : public TestEffectOpInterface::FallbackModel<
309d905c103SMehdi Amini           TestOpEffectInterfaceFallback> {
classofTestOpEffectInterfaceFallback310d905c103SMehdi Amini   static bool classof(Operation *op) {
311d905c103SMehdi Amini     bool isSupportedOp =
312d905c103SMehdi Amini         op->getName().getStringRef() == "test.unregistered_side_effect_op";
313d905c103SMehdi Amini     assert(isSupportedOp && "Unexpected dispatch");
314d905c103SMehdi Amini     return isSupportedOp;
315d905c103SMehdi Amini   }
316d905c103SMehdi Amini 
317d905c103SMehdi Amini   void
getEffectsTestOpEffectInterfaceFallback318d905c103SMehdi Amini   getEffects(Operation *op,
319d905c103SMehdi Amini              SmallVectorImpl<SideEffects::EffectInstance<TestEffects::Effect>>
320d905c103SMehdi Amini                  &effects) const {
321d905c103SMehdi Amini     testSideEffectOpGetEffect(op, effects);
322d905c103SMehdi Amini   }
323d905c103SMehdi Amini };
324d905c103SMehdi Amini 
initialize()325575b22b5SMehdi Amini void TestDialect::initialize() {
32631bb8efdSRiver Riddle   registerAttributes();
32731bb8efdSRiver Riddle   registerTypes();
3288a7a7137SAlex Zinenko   registerOpsSyntax();
329225f11cfSMarkus Böck   addOperations<ManualCppOpWithFold>();
330*ae22ac95SJeff Niu   registerTestDialectOperations(this);
3319e0b5533SMathieu Fehr   registerDynamicOp(getDynamicGenericOp(this));
3329e0b5533SMathieu Fehr   registerDynamicOp(getDynamicOneOperandTwoResultsOp(this));
3339e0b5533SMathieu Fehr   registerDynamicOp(getDynamicCustomParserPrinterOp(this));
3348a7a7137SAlex Zinenko   registerInterfaces();
335fec6c5acSUday Bondhugula   allowUnknownOperations();
336d905c103SMehdi Amini 
337d905c103SMehdi Amini   // Instantiate our fallback op interface that we'll use on specific
338d905c103SMehdi Amini   // unregistered op.
339d905c103SMehdi Amini   fallbackEffectOpInterfaces = new TestOpEffectInterfaceFallback;
340d905c103SMehdi Amini }
341a0c19bd4SMaksim Levental 
~TestDialect()342d905c103SMehdi Amini TestDialect::~TestDialect() {
343d905c103SMehdi Amini   delete static_cast<TestOpEffectInterfaceFallback *>(
344d905c103SMehdi Amini       fallbackEffectOpInterfaces);
345fec6c5acSUday Bondhugula }
346fec6c5acSUday Bondhugula 
materializeConstant(OpBuilder & builder,Attribute value,Type type,Location loc)347186c1549SRiver Riddle Operation *TestDialect::materializeConstant(OpBuilder &builder, Attribute value,
348186c1549SRiver Riddle                                             Type type, Location loc) {
349186c1549SRiver Riddle   return builder.create<TestOpConstant>(loc, type, value);
350186c1549SRiver Riddle }
351186c1549SRiver Riddle 
getRegisteredInterfaceForOp(TypeID typeID,OperationName opName)352d905c103SMehdi Amini void *TestDialect::getRegisteredInterfaceForOp(TypeID typeID,
353d905c103SMehdi Amini                                                OperationName opName) {
354d905c103SMehdi Amini   if (opName.getIdentifier() == "test.unregistered_side_effect_op" &&
355d905c103SMehdi Amini       typeID == TypeID::get<TestEffectOpInterface>())
356d905c103SMehdi Amini     return fallbackEffectOpInterfaces;
357d905c103SMehdi Amini   return nullptr;
358d905c103SMehdi Amini }
359d905c103SMehdi Amini 
verifyOperationAttribute(Operation * op,NamedAttribute namedAttr)360fec6c5acSUday Bondhugula LogicalResult TestDialect::verifyOperationAttribute(Operation *op,
361fec6c5acSUday Bondhugula                                                     NamedAttribute namedAttr) {
3620c7890c8SRiver Riddle   if (namedAttr.getName() == "test.invalid_attr")
363fec6c5acSUday Bondhugula     return op->emitError() << "invalid to use 'test.invalid_attr'";
364fec6c5acSUday Bondhugula   return success();
365fec6c5acSUday Bondhugula }
366fec6c5acSUday Bondhugula 
verifyRegionArgAttribute(Operation * op,unsigned regionIndex,unsigned argIndex,NamedAttribute namedAttr)367fec6c5acSUday Bondhugula LogicalResult TestDialect::verifyRegionArgAttribute(Operation *op,
368fec6c5acSUday Bondhugula                                                     unsigned regionIndex,
369fec6c5acSUday Bondhugula                                                     unsigned argIndex,
370fec6c5acSUday Bondhugula                                                     NamedAttribute namedAttr) {
3710c7890c8SRiver Riddle   if (namedAttr.getName() == "test.invalid_attr")
372fec6c5acSUday Bondhugula     return op->emitError() << "invalid to use 'test.invalid_attr'";
373fec6c5acSUday Bondhugula   return success();
374fec6c5acSUday Bondhugula }
375fec6c5acSUday Bondhugula 
376fec6c5acSUday Bondhugula LogicalResult
verifyRegionResultAttribute(Operation * op,unsigned regionIndex,unsigned resultIndex,NamedAttribute namedAttr)377fec6c5acSUday Bondhugula TestDialect::verifyRegionResultAttribute(Operation *op, unsigned regionIndex,
378fec6c5acSUday Bondhugula                                          unsigned resultIndex,
379fec6c5acSUday Bondhugula                                          NamedAttribute namedAttr) {
3800c7890c8SRiver Riddle   if (namedAttr.getName() == "test.invalid_attr")
381fec6c5acSUday Bondhugula     return op->emitError() << "invalid to use 'test.invalid_attr'";
382fec6c5acSUday Bondhugula   return success();
383fec6c5acSUday Bondhugula }
384fec6c5acSUday Bondhugula 
38522426110SRamkumar Ramachandra std::optional<Dialect::ParseOpHook>
getParseOperationHook(StringRef opName) const386a0c776fcSMehdi Amini TestDialect::getParseOperationHook(StringRef opName) const {
387a0c776fcSMehdi Amini   if (opName == "test.dialect_custom_printer") {
388a0c776fcSMehdi Amini     return ParseOpHook{[](OpAsmParser &parser, OperationState &state) {
389a0c776fcSMehdi Amini       return parser.parseKeyword("custom_format");
390a0c776fcSMehdi Amini     }};
391a0c776fcSMehdi Amini   }
3920845635eSMogball   if (opName == "test.dialect_custom_format_fallback") {
3930845635eSMogball     return ParseOpHook{[](OpAsmParser &parser, OperationState &state) {
3940845635eSMogball       return parser.parseKeyword("custom_format_fallback");
3950845635eSMogball     }};
3960845635eSMogball   }
397122e6858SAlex Zinenko   if (opName == "test.dialect_custom_printer.with.dot") {
398122e6858SAlex Zinenko     return ParseOpHook{[](OpAsmParser &parser, OperationState &state) {
399122e6858SAlex Zinenko       return ParseResult::success();
400122e6858SAlex Zinenko     }};
401122e6858SAlex Zinenko   }
4021a36588eSKazu Hirata   return std::nullopt;
403a0c776fcSMehdi Amini }
404a0c776fcSMehdi Amini 
405fd87963eSMehdi Amini llvm::unique_function<void(Operation *, OpAsmPrinter &)>
getOperationPrinter(Operation * op) const406fd87963eSMehdi Amini TestDialect::getOperationPrinter(Operation *op) const {
407a0c776fcSMehdi Amini   StringRef opName = op->getName().getStringRef();
408a0c776fcSMehdi Amini   if (opName == "test.dialect_custom_printer") {
409fd87963eSMehdi Amini     return [](Operation *op, OpAsmPrinter &printer) {
410c41b16c2SMehdi Amini       printer.getStream() << " custom_format";
411fd87963eSMehdi Amini     };
412a0c776fcSMehdi Amini   }
4130845635eSMogball   if (opName == "test.dialect_custom_format_fallback") {
4140845635eSMogball     return [](Operation *op, OpAsmPrinter &printer) {
4150845635eSMogball       printer.getStream() << " custom_format_fallback";
4160845635eSMogball     };
4170845635eSMogball   }
418fd87963eSMehdi Amini   return {};
419a0c776fcSMehdi Amini }
420a0c776fcSMehdi Amini 
421108ca7a7SMatthias Springer static LogicalResult
dialectCanonicalizationPattern(TestDialectCanonicalizerOp op,PatternRewriter & rewriter)422108ca7a7SMatthias Springer dialectCanonicalizationPattern(TestDialectCanonicalizerOp op,
423108ca7a7SMatthias Springer                                PatternRewriter &rewriter) {
424a54f4eaeSMogball   rewriter.replaceOpWithNewOp<arith::ConstantOp>(
425a54f4eaeSMogball       op, rewriter.getI32IntegerAttr(42));
426108ca7a7SMatthias Springer   return success();
427108ca7a7SMatthias Springer }
428108ca7a7SMatthias Springer 
getCanonicalizationPatterns(RewritePatternSet & results) const429108ca7a7SMatthias Springer void TestDialect::getCanonicalizationPatterns(
430108ca7a7SMatthias Springer     RewritePatternSet &results) const {
431108ca7a7SMatthias Springer   results.add(&dialectCanonicalizationPattern);
432108ca7a7SMatthias Springer }
433