15a7b9194SRiver Riddle //===- TestConvertCallOp.cpp - Test LLVM Conversion of Func CallOp --------===//
25a7b9194SRiver Riddle //
35a7b9194SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45a7b9194SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
55a7b9194SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a7b9194SRiver Riddle //
75a7b9194SRiver Riddle //===----------------------------------------------------------------------===//
85a7b9194SRiver Riddle
95a7b9194SRiver Riddle #include "TestDialect.h"
10*e95e94adSJeff Niu #include "TestOps.h"
115a7b9194SRiver Riddle #include "TestTypes.h"
125a7b9194SRiver Riddle #include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
135a7b9194SRiver Riddle #include "mlir/Conversion/LLVMCommon/Pattern.h"
145a7b9194SRiver Riddle #include "mlir/Dialect/Func/IR/FuncOps.h"
155a7b9194SRiver Riddle #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
165a7b9194SRiver Riddle #include "mlir/Pass/Pass.h"
175a7b9194SRiver Riddle
185a7b9194SRiver Riddle using namespace mlir;
195a7b9194SRiver Riddle
205a7b9194SRiver Riddle namespace {
215a7b9194SRiver Riddle
225a7b9194SRiver Riddle class TestTypeProducerOpConverter
235a7b9194SRiver Riddle : public ConvertOpToLLVMPattern<test::TestTypeProducerOp> {
245a7b9194SRiver Riddle public:
255a7b9194SRiver Riddle using ConvertOpToLLVMPattern<
265a7b9194SRiver Riddle test::TestTypeProducerOp>::ConvertOpToLLVMPattern;
275a7b9194SRiver Riddle
285a7b9194SRiver Riddle LogicalResult
matchAndRewrite(test::TestTypeProducerOp op,OpAdaptor adaptor,ConversionPatternRewriter & rewriter) const295a7b9194SRiver Riddle matchAndRewrite(test::TestTypeProducerOp op, OpAdaptor adaptor,
305a7b9194SRiver Riddle ConversionPatternRewriter &rewriter) const override {
3185175eddSTobias Gysi rewriter.replaceOpWithNewOp<LLVM::ZeroOp>(op, getVoidPtrType());
325a7b9194SRiver Riddle return success();
335a7b9194SRiver Riddle }
345a7b9194SRiver Riddle };
355a7b9194SRiver Riddle
365e50dd04SRiver Riddle struct TestConvertCallOp
375a7b9194SRiver Riddle : public PassWrapper<TestConvertCallOp, OperationPass<ModuleOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anoncc54da550111::TestConvertCallOp385e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestConvertCallOp)
395e50dd04SRiver Riddle
405a7b9194SRiver Riddle void getDependentDialects(DialectRegistry ®istry) const final {
415a7b9194SRiver Riddle registry.insert<LLVM::LLVMDialect>();
425a7b9194SRiver Riddle }
getArgument__anoncc54da550111::TestConvertCallOp435a7b9194SRiver Riddle StringRef getArgument() const final { return "test-convert-call-op"; }
getDescription__anoncc54da550111::TestConvertCallOp445a7b9194SRiver Riddle StringRef getDescription() const final {
455a7b9194SRiver Riddle return "Tests conversion of `func.call` to `llvm.call` in "
465a7b9194SRiver Riddle "presence of custom types";
475a7b9194SRiver Riddle }
485a7b9194SRiver Riddle
runOnOperation__anoncc54da550111::TestConvertCallOp495a7b9194SRiver Riddle void runOnOperation() override {
505a7b9194SRiver Riddle ModuleOp m = getOperation();
515a7b9194SRiver Riddle
52a85bd1b1SMarkus Böck LowerToLLVMOptions options(m.getContext());
53a85bd1b1SMarkus Böck
545a7b9194SRiver Riddle // Populate type conversions.
55a85bd1b1SMarkus Böck LLVMTypeConverter typeConverter(m.getContext(), options);
565a7b9194SRiver Riddle typeConverter.addConversion([&](test::TestType type) {
57610c7617SChristian Ulmann return LLVM::LLVMPointerType::get(m.getContext());
585a7b9194SRiver Riddle });
595a7b9194SRiver Riddle typeConverter.addConversion([&](test::SimpleAType type) {
605a7b9194SRiver Riddle return IntegerType::get(type.getContext(), 42);
615a7b9194SRiver Riddle });
625a7b9194SRiver Riddle
635a7b9194SRiver Riddle // Populate patterns.
645a7b9194SRiver Riddle RewritePatternSet patterns(m.getContext());
655a7b9194SRiver Riddle populateFuncToLLVMConversionPatterns(typeConverter, patterns);
665a7b9194SRiver Riddle patterns.add<TestTypeProducerOpConverter>(typeConverter);
675a7b9194SRiver Riddle
685a7b9194SRiver Riddle // Set target.
695a7b9194SRiver Riddle ConversionTarget target(getContext());
705a7b9194SRiver Riddle target.addLegalDialect<LLVM::LLVMDialect>();
715a7b9194SRiver Riddle target.addIllegalDialect<test::TestDialect>();
725a7b9194SRiver Riddle target.addIllegalDialect<func::FuncDialect>();
735a7b9194SRiver Riddle
745a7b9194SRiver Riddle if (failed(applyPartialConversion(m, target, std::move(patterns))))
755a7b9194SRiver Riddle signalPassFailure();
765a7b9194SRiver Riddle }
775a7b9194SRiver Riddle };
785a7b9194SRiver Riddle
795a7b9194SRiver Riddle } // namespace
805a7b9194SRiver Riddle
815a7b9194SRiver Riddle namespace mlir {
825a7b9194SRiver Riddle namespace test {
registerConvertCallOpPass()835a7b9194SRiver Riddle void registerConvertCallOpPass() { PassRegistration<TestConvertCallOp>(); }
845a7b9194SRiver Riddle } // namespace test
855a7b9194SRiver Riddle } // namespace mlir
86