MLIR: lib/Dialect/SPIRV/IR/AtomicOps.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
14
17
19
21
22 template
24
25 template <>
27 return "integer";
28 }
29
30 template <>
32 return "float";
33 }
34
35
36 template <typename AtomicOpTy, typename ExpectedElementType>
38 auto ptrType = llvm::castspirv::PointerType(op->getOperand(0).getType());
39 auto elementType = ptrType.getPointeeType();
40 if (!llvm::isa(elementType))
41 return op->emitOpError() << "pointer operand must point to an "
42 << stringifyTypeName()
43 << " value, found " << elementType;
44
45 StringAttr semanticsAttrName =
46 AtomicOpTy::getSemanticsAttrName(op->getName());
47 auto memorySemantics =
48 op->getAttrOfTypespirv::MemorySemanticsAttr(semanticsAttrName)
49 .getValue();
51 return failure();
52 }
53 return success();
54 }
55
56
57
58
59
61 return verifyAtomicUpdateOp<AtomicAndOp, IntegerType>(getOperation());
62 }
63
64
65
66
67
69 return verifyAtomicUpdateOp<AtomicIAddOp, IntegerType>(getOperation());
70 }
71
72
73
74
75
77 return verifyAtomicUpdateOp<EXTAtomicFAddOp, FloatType>(getOperation());
78 }
79
80
81
82
83
85 return verifyAtomicUpdateOp<AtomicIDecrementOp, IntegerType>(getOperation());
86 }
87
88
89
90
91
93 return verifyAtomicUpdateOp<AtomicIIncrementOp, IntegerType>(getOperation());
94 }
95
96
97
98
99
101 return verifyAtomicUpdateOp<AtomicISubOp, IntegerType>(getOperation());
102 }
103
104
105
106
107
109 return verifyAtomicUpdateOp<AtomicOrOp, IntegerType>(getOperation());
110 }
111
112
113
114
115
117 return verifyAtomicUpdateOp<AtomicSMaxOp, IntegerType>(getOperation());
118 }
119
120
121
122
123
125 return verifyAtomicUpdateOp<AtomicSMinOp, IntegerType>(getOperation());
126 }
127
128
129
130
131
133 return verifyAtomicUpdateOp<AtomicUMaxOp, IntegerType>(getOperation());
134 }
135
136
137
138
139
141 return verifyAtomicUpdateOp<AtomicUMinOp, IntegerType>(getOperation());
142 }
143
144
145
146
147
149 return verifyAtomicUpdateOp<AtomicXorOp, IntegerType>(getOperation());
150 }
151
152 }
Operation is the basic unit of execution within MLIR.
Value getOperand(unsigned idx)
AttrClass getAttrOfType(StringAttr name)
OperationName getName()
The name of an operation is the key identifier for it.
InFlightDiagnostic emitOpError(const Twine &message={})
Emit an error with the op name prefixed, like "'dim' op " which is convenient for verifiers.
Type getType() const
Return the type of this value.
static StringRef stringifyTypeName()
LogicalResult verifyMemorySemantics(Operation *op, spirv::MemorySemantics memorySemantics)
StringRef stringifyTypeName< FloatType >()
StringRef stringifyTypeName< IntegerType >()
static LogicalResult verifyAtomicUpdateOp(Operation *op)
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...