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"
105a7b9194SRiver Riddle #include "TestTypes.h"
115a7b9194SRiver Riddle #include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
125a7b9194SRiver Riddle #include "mlir/Conversion/LLVMCommon/Pattern.h"
135a7b9194SRiver Riddle #include "mlir/Dialect/Func/IR/FuncOps.h"
145a7b9194SRiver Riddle #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
155a7b9194SRiver Riddle #include "mlir/Pass/Pass.h"
165a7b9194SRiver Riddle 
175a7b9194SRiver Riddle using namespace mlir;
185a7b9194SRiver Riddle 
195a7b9194SRiver Riddle namespace {
205a7b9194SRiver Riddle 
215a7b9194SRiver Riddle class TestTypeProducerOpConverter
225a7b9194SRiver Riddle     : public ConvertOpToLLVMPattern<test::TestTypeProducerOp> {
235a7b9194SRiver Riddle public:
245a7b9194SRiver Riddle   using ConvertOpToLLVMPattern<
255a7b9194SRiver Riddle       test::TestTypeProducerOp>::ConvertOpToLLVMPattern;
265a7b9194SRiver Riddle 
275a7b9194SRiver Riddle   LogicalResult
matchAndRewrite(test::TestTypeProducerOp op,OpAdaptor adaptor,ConversionPatternRewriter & rewriter) const285a7b9194SRiver Riddle   matchAndRewrite(test::TestTypeProducerOp op, OpAdaptor adaptor,
295a7b9194SRiver Riddle                   ConversionPatternRewriter &rewriter) const override {
305a7b9194SRiver Riddle     rewriter.replaceOpWithNewOp<LLVM::NullOp>(op, getVoidPtrType());
315a7b9194SRiver Riddle     return success();
325a7b9194SRiver Riddle   }
335a7b9194SRiver Riddle };
345a7b9194SRiver Riddle 
35*5e50dd04SRiver Riddle struct TestConvertCallOp
365a7b9194SRiver Riddle     : public PassWrapper<TestConvertCallOp, OperationPass<ModuleOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonf1a190d20111::TestConvertCallOp37*5e50dd04SRiver Riddle   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestConvertCallOp)
38*5e50dd04SRiver Riddle 
395a7b9194SRiver Riddle   void getDependentDialects(DialectRegistry &registry) const final {
405a7b9194SRiver Riddle     registry.insert<LLVM::LLVMDialect>();
415a7b9194SRiver Riddle   }
getArgument__anonf1a190d20111::TestConvertCallOp425a7b9194SRiver Riddle   StringRef getArgument() const final { return "test-convert-call-op"; }
getDescription__anonf1a190d20111::TestConvertCallOp435a7b9194SRiver Riddle   StringRef getDescription() const final {
445a7b9194SRiver Riddle     return "Tests conversion of `func.call` to `llvm.call` in "
455a7b9194SRiver Riddle            "presence of custom types";
465a7b9194SRiver Riddle   }
475a7b9194SRiver Riddle 
runOnOperation__anonf1a190d20111::TestConvertCallOp485a7b9194SRiver Riddle   void runOnOperation() override {
495a7b9194SRiver Riddle     ModuleOp m = getOperation();
505a7b9194SRiver Riddle 
515a7b9194SRiver Riddle     // Populate type conversions.
525a7b9194SRiver Riddle     LLVMTypeConverter typeConverter(m.getContext());
535a7b9194SRiver Riddle     typeConverter.addConversion([&](test::TestType type) {
545a7b9194SRiver Riddle       return LLVM::LLVMPointerType::get(IntegerType::get(m.getContext(), 8));
555a7b9194SRiver Riddle     });
565a7b9194SRiver Riddle     typeConverter.addConversion([&](test::SimpleAType type) {
575a7b9194SRiver Riddle       return IntegerType::get(type.getContext(), 42);
585a7b9194SRiver Riddle     });
595a7b9194SRiver Riddle 
605a7b9194SRiver Riddle     // Populate patterns.
615a7b9194SRiver Riddle     RewritePatternSet patterns(m.getContext());
625a7b9194SRiver Riddle     populateFuncToLLVMConversionPatterns(typeConverter, patterns);
635a7b9194SRiver Riddle     patterns.add<TestTypeProducerOpConverter>(typeConverter);
645a7b9194SRiver Riddle 
655a7b9194SRiver Riddle     // Set target.
665a7b9194SRiver Riddle     ConversionTarget target(getContext());
675a7b9194SRiver Riddle     target.addLegalDialect<LLVM::LLVMDialect>();
685a7b9194SRiver Riddle     target.addIllegalDialect<test::TestDialect>();
695a7b9194SRiver Riddle     target.addIllegalDialect<func::FuncDialect>();
705a7b9194SRiver Riddle 
715a7b9194SRiver Riddle     if (failed(applyPartialConversion(m, target, std::move(patterns))))
725a7b9194SRiver Riddle       signalPassFailure();
735a7b9194SRiver Riddle   }
745a7b9194SRiver Riddle };
755a7b9194SRiver Riddle 
765a7b9194SRiver Riddle } // namespace
775a7b9194SRiver Riddle 
785a7b9194SRiver Riddle namespace mlir {
795a7b9194SRiver Riddle namespace test {
registerConvertCallOpPass()805a7b9194SRiver Riddle void registerConvertCallOpPass() { PassRegistration<TestConvertCallOp>(); }
815a7b9194SRiver Riddle } // namespace test
825a7b9194SRiver Riddle } // namespace mlir
83