1b739badaSJavier Setoain //===- LegalizeForLLVMExport.cpp - Prepare ArmSVE for LLVM translation ----===//
2b739badaSJavier Setoain //
3b739badaSJavier Setoain // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b739badaSJavier Setoain // See https://llvm.org/LICENSE.txt for license information.
5b739badaSJavier Setoain // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b739badaSJavier Setoain //
7b739badaSJavier Setoain //===----------------------------------------------------------------------===//
8b739badaSJavier Setoain
975e5f0aaSAlex Zinenko #include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
1075e5f0aaSAlex Zinenko #include "mlir/Conversion/LLVMCommon/Pattern.h"
11b739badaSJavier Setoain #include "mlir/Dialect/ArmSVE/ArmSVEDialect.h"
12b739badaSJavier Setoain #include "mlir/Dialect/ArmSVE/Transforms.h"
13*1f971e23SRiver Riddle #include "mlir/Dialect/Func/IR/FuncOps.h"
14b739badaSJavier Setoain #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
15b739badaSJavier Setoain #include "mlir/IR/BuiltinOps.h"
16b739badaSJavier Setoain #include "mlir/IR/PatternMatch.h"
17b739badaSJavier Setoain
18b739badaSJavier Setoain using namespace mlir;
19b739badaSJavier Setoain using namespace mlir::arm_sve;
20b739badaSJavier Setoain
21b739badaSJavier Setoain template <typename OpTy>
22b739badaSJavier Setoain class ForwardOperands : public OpConversionPattern<OpTy> {
23b739badaSJavier Setoain using OpConversionPattern<OpTy>::OpConversionPattern;
24b739badaSJavier Setoain
25b739badaSJavier Setoain LogicalResult
matchAndRewrite(OpTy op,typename OpTy::Adaptor adaptor,ConversionPatternRewriter & rewriter) const26b54c724bSRiver Riddle matchAndRewrite(OpTy op, typename OpTy::Adaptor adaptor,
27b739badaSJavier Setoain ConversionPatternRewriter &rewriter) const final {
28b54c724bSRiver Riddle if (adaptor.getOperands().getTypes() == op->getOperands().getTypes())
29b739badaSJavier Setoain return rewriter.notifyMatchFailure(op, "operand types already match");
30b739badaSJavier Setoain
31b54c724bSRiver Riddle rewriter.updateRootInPlace(
32b54c724bSRiver Riddle op, [&]() { op->setOperands(adaptor.getOperands()); });
33b739badaSJavier Setoain return success();
34b739badaSJavier Setoain }
35b739badaSJavier Setoain };
36b739badaSJavier Setoain
37b739badaSJavier Setoain using SdotOpLowering = OneToOneConvertToLLVMPattern<SdotOp, SdotIntrOp>;
38b739badaSJavier Setoain using SmmlaOpLowering = OneToOneConvertToLLVMPattern<SmmlaOp, SmmlaIntrOp>;
39b739badaSJavier Setoain using UdotOpLowering = OneToOneConvertToLLVMPattern<UdotOp, UdotIntrOp>;
40b739badaSJavier Setoain using UmmlaOpLowering = OneToOneConvertToLLVMPattern<UmmlaOp, UmmlaIntrOp>;
4195861216SJavier Setoain using ScalableMaskedAddIOpLowering =
4295861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedAddIOp,
4395861216SJavier Setoain ScalableMaskedAddIIntrOp>;
4495861216SJavier Setoain using ScalableMaskedAddFOpLowering =
4595861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedAddFOp,
4695861216SJavier Setoain ScalableMaskedAddFIntrOp>;
4795861216SJavier Setoain using ScalableMaskedSubIOpLowering =
4895861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedSubIOp,
4995861216SJavier Setoain ScalableMaskedSubIIntrOp>;
5095861216SJavier Setoain using ScalableMaskedSubFOpLowering =
5195861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedSubFOp,
5295861216SJavier Setoain ScalableMaskedSubFIntrOp>;
5395861216SJavier Setoain using ScalableMaskedMulIOpLowering =
5495861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedMulIOp,
5595861216SJavier Setoain ScalableMaskedMulIIntrOp>;
5695861216SJavier Setoain using ScalableMaskedMulFOpLowering =
5795861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedMulFOp,
5895861216SJavier Setoain ScalableMaskedMulFIntrOp>;
5995861216SJavier Setoain using ScalableMaskedSDivIOpLowering =
6095861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedSDivIOp,
6195861216SJavier Setoain ScalableMaskedSDivIIntrOp>;
6295861216SJavier Setoain using ScalableMaskedUDivIOpLowering =
6395861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedUDivIOp,
6495861216SJavier Setoain ScalableMaskedUDivIIntrOp>;
6595861216SJavier Setoain using ScalableMaskedDivFOpLowering =
6695861216SJavier Setoain OneToOneConvertToLLVMPattern<ScalableMaskedDivFOp,
6795861216SJavier Setoain ScalableMaskedDivFIntrOp>;
68b739badaSJavier Setoain
69b739badaSJavier Setoain /// Populate the given list with patterns that convert from ArmSVE to LLVM.
populateArmSVELegalizeForLLVMExportPatterns(LLVMTypeConverter & converter,RewritePatternSet & patterns)70b739badaSJavier Setoain void mlir::populateArmSVELegalizeForLLVMExportPatterns(
719f85c198SRiver Riddle LLVMTypeConverter &converter, RewritePatternSet &patterns) {
72b739badaSJavier Setoain // Populate conversion patterns
73b739badaSJavier Setoain
74b739badaSJavier Setoain // clang-format off
7523aa5a74SRiver Riddle patterns.add<ForwardOperands<func::CallOp>,
7623aa5a74SRiver Riddle ForwardOperands<func::CallIndirectOp>,
7723aa5a74SRiver Riddle ForwardOperands<func::ReturnOp>>(converter,
78b739badaSJavier Setoain &converter.getContext());
79b739badaSJavier Setoain patterns.add<SdotOpLowering,
80b739badaSJavier Setoain SmmlaOpLowering,
81b739badaSJavier Setoain UdotOpLowering,
82b739badaSJavier Setoain UmmlaOpLowering,
8395861216SJavier Setoain ScalableMaskedAddIOpLowering,
8495861216SJavier Setoain ScalableMaskedAddFOpLowering,
8595861216SJavier Setoain ScalableMaskedSubIOpLowering,
8695861216SJavier Setoain ScalableMaskedSubFOpLowering,
8795861216SJavier Setoain ScalableMaskedMulIOpLowering,
8895861216SJavier Setoain ScalableMaskedMulFOpLowering,
8995861216SJavier Setoain ScalableMaskedSDivIOpLowering,
9095861216SJavier Setoain ScalableMaskedUDivIOpLowering,
9195861216SJavier Setoain ScalableMaskedDivFOpLowering>(converter);
92b739badaSJavier Setoain // clang-format on
93b739badaSJavier Setoain }
94b739badaSJavier Setoain
configureArmSVELegalizeForExportTarget(LLVMConversionTarget & target)95b739badaSJavier Setoain void mlir::configureArmSVELegalizeForExportTarget(
96b739badaSJavier Setoain LLVMConversionTarget &target) {
9795861216SJavier Setoain // clang-format off
9895861216SJavier Setoain target.addLegalOp<SdotIntrOp,
9995861216SJavier Setoain SmmlaIntrOp,
10095861216SJavier Setoain UdotIntrOp,
10195861216SJavier Setoain UmmlaIntrOp,
10295861216SJavier Setoain ScalableMaskedAddIIntrOp,
10395861216SJavier Setoain ScalableMaskedAddFIntrOp,
10495861216SJavier Setoain ScalableMaskedSubIIntrOp,
10595861216SJavier Setoain ScalableMaskedSubFIntrOp,
10695861216SJavier Setoain ScalableMaskedMulIIntrOp,
10795861216SJavier Setoain ScalableMaskedMulFIntrOp,
10895861216SJavier Setoain ScalableMaskedSDivIIntrOp,
10995861216SJavier Setoain ScalableMaskedUDivIIntrOp,
11095861216SJavier Setoain ScalableMaskedDivFIntrOp>();
11195861216SJavier Setoain target.addIllegalOp<SdotOp,
11295861216SJavier Setoain SmmlaOp,
11395861216SJavier Setoain UdotOp,
11495861216SJavier Setoain UmmlaOp,
11595861216SJavier Setoain ScalableMaskedAddIOp,
11695861216SJavier Setoain ScalableMaskedAddFOp,
11795861216SJavier Setoain ScalableMaskedSubIOp,
11895861216SJavier Setoain ScalableMaskedSubFOp,
11995861216SJavier Setoain ScalableMaskedMulIOp,
12095861216SJavier Setoain ScalableMaskedMulFOp,
12195861216SJavier Setoain ScalableMaskedSDivIOp,
12295861216SJavier Setoain ScalableMaskedUDivIOp,
123a4830d14SJavier Setoain ScalableMaskedDivFOp>();
12495861216SJavier Setoain // clang-format on
125b739badaSJavier Setoain }
126