MLIR 24.0.0git
ACCToLLVM.cpp
Go to the documentation of this file.
1//===- ACCToLLVM.cpp - Convert OpenACC to LLVM dialect ----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
19#include "mlir/Pass/Pass.h"
20
21namespace mlir {
22#define GEN_PASS_DEF_CONVERTACCTOLLVMPASS
23#include "mlir/Conversion/Passes.h.inc"
24} // namespace mlir
25
26using namespace mlir;
27
28namespace {
29struct ConvertACCToLLVMPass
30 : public impl::ConvertACCToLLVMPassBase<ConvertACCToLLVMPass> {
31 using Base::Base;
32
33 void getDependentDialects(DialectRegistry &registry) const override {
34 Base::getDependentDialects(registry);
36 }
37
38 void runOnOperation() override;
39};
40} // namespace
41
42void ConvertACCToLLVMPass::runOnOperation() {
43 ModuleOp module = getOperation();
44
45 SymbolTable symbolTable(module);
46 LLVMTypeConverter converter(&getContext());
47 RewritePatternSet patterns(&getContext());
48 arith::populateArithToLLVMConversionPatterns(converter, patterns);
50 populateFuncToLLVMConversionPatterns(converter, patterns);
52
53 acc::ACCRuntimeCallConfig runtimeConfig;
54
56 converter, patterns, module.getBodyRegion(), symbolTable, runtimeConfig);
57
58 acc::OpenACCSupport &accSupport = getAnalysis<acc::OpenACCSupport>();
59 populateACCDataDirectivePatterns(converter, patterns, accSupport,
60 module.getBodyRegion(), symbolTable,
61 runtimeConfig);
62 populateACCHostDataPatterns(converter, patterns, module.getBodyRegion(),
63 symbolTable, runtimeConfig);
64 populateACCKernelLaunchPatterns(converter, patterns, accSupport,
65 module.getBodyRegion(), symbolTable,
66 runtimeConfig);
67 populateACCAtomicPatterns(converter, patterns, accSupport);
68 populateACCDataClauseOpPatterns(converter, patterns, accSupport,
69 module.getBodyRegion(), symbolTable,
70 runtimeConfig);
71
72 LLVMConversionTarget target(getContext());
78 if (failed(applyPartialConversion(module, target, std::move(patterns))))
79 signalPassFailure();
80}
b getContext())
void registerAllExtensions(DialectRegistry &registry)
Register the standard OpenACC models for GPU, LLVM and MemRef IR.
void populateControlFlowToLLVMConversionPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns)
Collect the patterns to convert from the ControlFlow dialect to LLVM.
detail::InFlightRemark failed(Location loc, RemarkOpts opts)
Report an optimization remark that failed.
Definition Remarks.h:734
Include the generated interface declarations.
void configureACCKernelLaunchConversionLegality(ConversionTarget &target)
Configure conversion legality for acc.kernel_environment.
void populateACCDataClauseOpPatterns(LLVMTypeConverter &converter, RewritePatternSet &patterns, acc::OpenACCSupport &accSupport, Region &globalSymbolRegion, SymbolTable &symbolTable, const acc::ACCRuntimeCallConfig &config={})
Populate the patterns that remove OpenACC data clause operations once the constructs holding them hav...
void populateACCAtomicPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns, acc::OpenACCSupport &accSupport, ACCAtomicLoadAddressCallback getLoadAddress={})
Populate patterns that lower OpenACC atomic operations to LLVM dialect.
void populateACCDataDirectivePatterns(LLVMTypeConverter &converter, RewritePatternSet &patterns, acc::OpenACCSupport &accSupport, Region &globalSymbolRegion, SymbolTable &symbolTable, const acc::ACCRuntimeCallConfig &config={}, acc::DeviceType clauseDeviceType=acc::DeviceType::None)
Populate patterns that lower OpenACC data directives (acc.data, enter_data, exit_data,...
void populateFuncToLLVMConversionPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns, SymbolTableCollection *symbolTables=nullptr)
Collect the patterns to convert from the Func dialect to LLVM.
void configureACCHostDataConversionLegality(ConversionTarget &target)
Configure conversion legality for the OpenACC host_data construct.
void populateFinalizeMemRefToLLVMConversionPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns, SymbolTableCollection *symbolTables=nullptr)
Collect a set of patterns to convert memory-related operations from the MemRef dialect to the LLVM di...
void populateACCKernelLaunchPatterns(LLVMTypeConverter &converter, RewritePatternSet &patterns, acc::OpenACCSupport &accSupport, Region &globalSymbolRegion, SymbolTable &symbolTable, const acc::ACCRuntimeCallConfig &config={}, acc::DeviceType clauseDeviceType=acc::DeviceType::None)
Populate patterns that lower an acc.kernel_environment and all gpu.launch_func operations in its body...
void populateACCExecutableDirectivePatterns(LLVMTypeConverter &converter, RewritePatternSet &patterns, Region &globalSymbolRegion, SymbolTable &symbolTable, const acc::ACCRuntimeCallConfig &config={})
Populate patterns that lower OpenACC executable directives (init, shutdown, wait, set) to LLVM runtim...
void configureACCExecutableDirectiveConversionLegality(ConversionTarget &target)
Configure conversion legality for OpenACC executable directives lowered to runtime calls.
void configureACCDataDirectiveConversionLegality(ConversionTarget &target)
Configure conversion legality for OpenACC data directives.
void populateACCHostDataPatterns(LLVMTypeConverter &converter, RewritePatternSet &patterns, Region &globalSymbolRegion, SymbolTable &symbolTable, const acc::ACCRuntimeCallConfig &config={})
Populate patterns that lower the OpenACC host_data construct to runtime calls, one per use_device cla...
void configureACCAtomicConversionLegality(ConversionTarget &target)
Configure conversion legality for OpenACC atomic operations.