1 //===- TestOps.h - MLIR Test Dialect Operations ---------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 #define MLIR_TESTOPS_H
12 #include "TestAttributes.h"
13 #include "TestInterfaces.h"
14 #include "TestTypes.h"
15 #include "mlir/Bytecode/BytecodeImplementation.h"
16 #include "mlir/Dialect/DLTI/DLTI.h"
17 #include "mlir/Dialect/DLTI/Traits.h"
18 #include "mlir/Dialect/Func/IR/FuncOps.h"
19 #include "mlir/Dialect/Linalg/IR/Linalg.h"
20 #include "mlir/Dialect/Linalg/IR/LinalgInterfaces.h"
21 #include "mlir/Dialect/Traits.h"
22 #include "mlir/IR/AsmState.h"
23 #include "mlir/IR/BuiltinOps.h"
24 #include "mlir/IR/BuiltinTypes.h"
25 #include "mlir/IR/Dialect.h"
26 #include "mlir/IR/DialectResourceBlobManager.h"
27 #include "mlir/IR/ExtensibleDialect.h"
28 #include "mlir/IR/OpDefinition.h"
29 #include "mlir/IR/OpImplementation.h"
30 #include "mlir/IR/RegionKindInterface.h"
31 #include "mlir/IR/SymbolTable.h"
32 #include "mlir/Interfaces/CallInterfaces.h"
33 #include "mlir/Interfaces/ControlFlowInterfaces.h"
34 #include "mlir/Interfaces/CopyOpInterface.h"
35 #include "mlir/Interfaces/DerivedAttributeOpInterface.h"
36 #include "mlir/Interfaces/InferIntRangeInterface.h"
37 #include "mlir/Interfaces/InferTypeOpInterface.h"
38 #include "mlir/Interfaces/LoopLikeInterface.h"
39 #include "mlir/Interfaces/MemorySlotInterfaces.h"
40 #include "mlir/Interfaces/SideEffectInterfaces.h"
41 #include "mlir/Interfaces/ValueBoundsOpInterface.h"
42 #include "mlir/Interfaces/ViewLikeInterface.h"
43 #include "llvm/ADT/SetVector.h"
48 //===----------------------------------------------------------------------===//
50 //===----------------------------------------------------------------------===//
52 /// A test resource for side effects.
53 struct TestResource
: public mlir::SideEffects::Resource::Base
<TestResource
> {
54 llvm::StringRef
getName() final
{ return "<Test>"; }
57 //===----------------------------------------------------------------------===//
58 // PropertiesWithCustomPrint
59 //===----------------------------------------------------------------------===//
61 struct PropertiesWithCustomPrint
{
62 /// A shared_ptr to a const object is safe: it is equivalent to a value-based
63 /// member. Here the label will be deallocated when the last operation
64 /// refering to it is destroyed. However there is no pool-allocation: this is
65 /// offloaded to the client.
66 std::shared_ptr
<const std::string
> label
;
68 bool operator==(const PropertiesWithCustomPrint
&rhs
) const {
69 return value
== rhs
.value
&& *label
== *rhs
.label
;
73 llvm::LogicalResult
setPropertiesFromAttribute(
74 PropertiesWithCustomPrint
&prop
, mlir::Attribute attr
,
75 llvm::function_ref
<mlir::InFlightDiagnostic()> emitError
);
77 getPropertiesAsAttribute(mlir::MLIRContext
*ctx
,
78 const PropertiesWithCustomPrint
&prop
);
79 llvm::hash_code
computeHash(const PropertiesWithCustomPrint
&prop
);
80 void customPrintProperties(mlir::OpAsmPrinter
&p
,
81 const PropertiesWithCustomPrint
&prop
);
82 mlir::ParseResult
customParseProperties(mlir::OpAsmParser
&parser
,
83 PropertiesWithCustomPrint
&prop
);
85 //===----------------------------------------------------------------------===//
87 //===----------------------------------------------------------------------===//
92 // These three methods are invoked through the `MyStructProperty` wrapper
93 // defined in TestOps.td
94 mlir::Attribute
asAttribute(mlir::MLIRContext
*ctx
) const;
95 static llvm::LogicalResult
96 setFromAttr(MyPropStruct
&prop
, mlir::Attribute attr
,
97 llvm::function_ref
<mlir::InFlightDiagnostic()> emitError
);
98 llvm::hash_code
hash() const;
99 bool operator==(const MyPropStruct
&rhs
) const {
100 return content
== rhs
.content
;
104 llvm::LogicalResult
readFromMlirBytecode(mlir::DialectBytecodeReader
&reader
,
106 void writeToMlirBytecode(mlir::DialectBytecodeWriter
&writer
,
109 //===----------------------------------------------------------------------===//
110 // VersionedProperties
111 //===----------------------------------------------------------------------===//
113 struct VersionedProperties
{
114 // For the sake of testing, assume that this object was associated to version
115 // 1.2 of the test dialect when having only one int value. In the current
116 // version 2.0, the property has two values. We also assume that the class is
117 // upgrade-able if value2 = 0.
120 bool operator==(const VersionedProperties
&rhs
) const {
121 return value1
== rhs
.value1
&& value2
== rhs
.value2
;
125 llvm::LogicalResult
setPropertiesFromAttribute(
126 VersionedProperties
&prop
, mlir::Attribute attr
,
127 llvm::function_ref
<mlir::InFlightDiagnostic()> emitError
);
128 mlir::DictionaryAttr
getPropertiesAsAttribute(mlir::MLIRContext
*ctx
,
129 const VersionedProperties
&prop
);
130 llvm::hash_code
computeHash(const VersionedProperties
&prop
);
131 void customPrintProperties(mlir::OpAsmPrinter
&p
,
132 const VersionedProperties
&prop
);
133 mlir::ParseResult
customParseProperties(mlir::OpAsmParser
&parser
,
134 VersionedProperties
&prop
);
136 //===----------------------------------------------------------------------===//
138 //===----------------------------------------------------------------------===//
140 llvm::LogicalResult
readFromMlirBytecode(mlir::DialectBytecodeReader
&reader
,
141 llvm::MutableArrayRef
<int64_t> prop
);
142 void writeToMlirBytecode(mlir::DialectBytecodeWriter
&writer
,
143 llvm::ArrayRef
<int64_t> prop
);
147 #define GET_OP_CLASSES
148 #include "TestOps.h.inc"
150 #endif // MLIR_TESTOPS_H