[Mlir-commits] [mlir] [mlir][spirv] Lower `arith` overflow flags to corresponding SPIR-V op decorations (PR #77714)
Jakub Kuderski
llvmlistbot at llvm.org
Wed Jan 10 20:20:33 PST 2024
================
@@ -158,8 +158,61 @@ getTypeConversionFailure(ConversionPatternRewriter &rewriter, Operation *op) {
return getTypeConversionFailure(rewriter, op, op->getResultTypes().front());
}
+// TODO: Move to some common place?
+static std::string getDecorationString(spirv::Decoration decor) {
+ return llvm::convertToSnakeFromCamelCase(stringifyDecoration(decor));
+}
+
namespace {
+/// Converts elementwise unary, binary and ternary arith operations to SPIR-V
+/// operations. Op can potentially support overflow flags.
+template <typename Op, typename SPIRVOp>
+struct ElementwiseArithOpPattern : public OpConversionPattern<Op> {
+ using OpConversionPattern<Op>::OpConversionPattern;
+
+ LogicalResult
+ matchAndRewrite(Op op, typename Op::Adaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ assert(adaptor.getOperands().size() <= 3);
+ Type dstType = this->getTypeConverter()->convertType(op.getType());
+ if (!dstType) {
+ return rewriter.notifyMatchFailure(
+ op->getLoc(),
+ llvm::formatv("failed to convert type {0} for SPIR-V", op.getType()));
+ }
+
+ if (SPIRVOp::template hasTrait<OpTrait::spirv::UnsignedOp>() &&
+ !getElementTypeOrSelf(op.getType()).isIndex() &&
+ dstType != op.getType()) {
+ return op.emitError("bitwidth emulation is not implemented yet on "
+ "unsigned op pattern version");
+ }
+
+ auto converter = this->template getTypeConverter<SPIRVTypeConverter>();
----------------
kuhar wrote:
We can move this up to the very top where we need it for the `dstType`
https://github.com/llvm/llvm-project/pull/77714
More information about the Mlir-commits
mailing list