//===- Pattern.h - SPIRV Common Conversion Patterns -----------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef MLIR_CONVERSION_SPIRVCOMMON_PATTERN_H #define MLIR_CONVERSION_SPIRVCOMMON_PATTERN_H #include "mlir/Dialect/SPIRV/IR/SPIRVOpTraits.h" #include "mlir/Transforms/DialectConversion.h" namespace mlir { namespace spirv { /// Converts unary and binary standard operations to SPIR-V operations. template class UnaryAndBinaryOpPattern final : public OpConversionPattern { public: using OpConversionPattern::OpConversionPattern; LogicalResult matchAndRewrite(Op op, typename Op::Adaptor adaptor, ConversionPatternRewriter &rewriter) const override { assert(adaptor.getOperands().size() <= 2); auto dstType = this->getTypeConverter()->convertType(op.getType()); if (!dstType) return failure(); if (SPIRVOp::template hasTrait() && dstType != op.getType()) { return op.emitError( "bitwidth emulation is not implemented yet on unsigned op"); } rewriter.template replaceOpWithNewOp(op, dstType, adaptor.getOperands()); return success(); } }; } // namespace spirv } // namespace mlir #endif // MLIR_CONVERSION_SPIRVCOMMON_PATTERN_H