//===-- RegisterOpenACCExtensions.cpp -------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // Registration for OpenACC extensions as applied to FIR dialect. // //===----------------------------------------------------------------------===// #include "flang/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.h" #include "flang/Optimizer/Dialect/CUF/CUFDialect.h" #include "flang/Optimizer/Dialect/CUF/CUFOps.h" #include "flang/Optimizer/Dialect/FIRDialect.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIRType.h" #include "flang/Optimizer/HLFIR/HLFIRDialect.h" #include "flang/Optimizer/HLFIR/HLFIROps.h" #include "flang/Optimizer/OpenACC/Support/FIROpenACCOpsInterfaces.h" #include "flang/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.h" namespace fir::acc { void registerOpenACCExtensions(mlir::DialectRegistry ®istry) { registry.addExtension(+[](mlir::MLIRContext *ctx, fir::FIROpsDialect *dialect) { fir::BoxType::attachInterface>(*ctx); fir::ClassType::attachInterface>( *ctx); fir::ReferenceType::attachInterface< OpenACCMappableModel>(*ctx); fir::PointerType::attachInterface>( *ctx); fir::HeapType::attachInterface>(*ctx); fir::ReferenceType::attachInterface< OpenACCPointerLikeModel>(*ctx); fir::PointerType::attachInterface< OpenACCPointerLikeModel>(*ctx); fir::HeapType::attachInterface>( *ctx); fir::LLVMPointerType::attachInterface< OpenACCPointerLikeModel>(*ctx); fir::LogicalType::attachInterface(*ctx); fir::ArrayCoorOp::attachInterface< PartialEntityAccessModel>(*ctx); fir::CoordinateOp::attachInterface< PartialEntityAccessModel>(*ctx); fir::DeclareOp::attachInterface>( *ctx); fir::AddrOfOp::attachInterface(*ctx); fir::GlobalOp::attachInterface(*ctx); fir::AllocaOp::attachInterface>( *ctx); fir::EmboxOp::attachInterface>( *ctx); fir::ReboxOp::attachInterface>( *ctx); fir::TypeDescOp::attachInterface< IndirectGlobalAccessModel>(*ctx); // Attach OutlineRematerializationOpInterface to FIR operations that // produce synthetic types (shapes, field indices) which cannot be passed // as arguments to outlined regions and must be rematerialized inside. fir::ShapeOp::attachInterface>( *ctx); fir::ShapeShiftOp::attachInterface< OutlineRematerializationModel>(*ctx); fir::ShiftOp::attachInterface>( *ctx); fir::FieldIndexOp::attachInterface< OutlineRematerializationModel>(*ctx); }); // Register HLFIR operation interfaces registry.addExtension( +[](mlir::MLIRContext *ctx, hlfir::hlfirDialect *dialect) { hlfir::DesignateOp::attachInterface< PartialEntityAccessModel>(*ctx); hlfir::DeclareOp::attachInterface< PartialEntityAccessModel>(*ctx); }); // Register CUF operation interfaces registry.addExtension(+[](mlir::MLIRContext *ctx, cuf::CUFDialect *dialect) { cuf::KernelOp::attachInterface>(*ctx); }); // Attach FIR dialect interfaces to OpenACC operations. registry.addExtension(+[](mlir::MLIRContext *ctx, mlir::acc::OpenACCDialect *dialect) { mlir::acc::LoopOp::attachInterface>( *ctx); }); registerAttrsExtensions(registry); } } // namespace fir::acc