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,...