13#ifndef FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
14#define FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
16#include "flang/Optimizer/Dialect/CUF/CUFDialect.h"
17#include "flang/Optimizer/Dialect/CUF/CUFToLLVMIRTranslation.h"
18#include "flang/Optimizer/Dialect/FIRDialect.h"
19#include "flang/Optimizer/HLFIR/HLFIRDialect.h"
20#include "flang/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.h"
21#include "flang/Optimizer/OpenMP/Support/RegisterOpenMPExtensions.h"
22#include "mlir/Conversion/Passes.h"
23#include "mlir/Dialect/Affine/IR/AffineOps.h"
24#include "mlir/Dialect/Affine/Passes.h"
25#include "mlir/Dialect/Complex/IR/Complex.h"
26#include "mlir/Dialect/ControlFlow/IR/ControlFlow.h"
27#include "mlir/Dialect/DLTI/DLTI.h"
28#include "mlir/Dialect/Func/Extensions/InlinerExtension.h"
29#include "mlir/Dialect/Func/IR/FuncOps.h"
30#include "mlir/Dialect/Index/IR/IndexDialect.h"
31#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
32#include "mlir/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.h"
33#include "mlir/Dialect/Math/IR/Math.h"
34#include "mlir/Dialect/OpenACC/OpenACC.h"
35#include "mlir/Dialect/OpenACC/Transforms/Passes.h"
36#include "mlir/Dialect/SCF/IR/SCF.h"
37#include "mlir/Dialect/SCF/Transforms/Passes.h"
38#include "mlir/InitAllDialects.h"
39#include "mlir/Pass/Pass.h"
40#include "mlir/Pass/PassRegistry.h"
41#include "mlir/Transforms/LocationSnapshot.h"
42#include "mlir/Transforms/Passes.h"
44namespace fir::support {
46#define FLANG_NONCODEGEN_DIALECT_LIST \
47 mlir::affine::AffineDialect, FIROpsDialect, hlfir::hlfirDialect, \
48 mlir::acc::OpenACCDialect, mlir::omp::OpenMPDialect, \
49 mlir::scf::SCFDialect, mlir::arith::ArithDialect, \
50 mlir::cf::ControlFlowDialect, mlir::func::FuncDialect, \
51 mlir::vector::VectorDialect, mlir::math::MathDialect, \
52 mlir::complex::ComplexDialect, mlir::DLTIDialect, cuf::CUFDialect, \
53 mlir::NVVM::NVVMDialect, mlir::gpu::GPUDialect, \
54 mlir::index::IndexDialect
56#define FLANG_CODEGEN_DIALECT_LIST FIRCodeGenDialect, mlir::LLVM::LLVMDialect
59#define FLANG_DIALECT_LIST \
60 FLANG_NONCODEGEN_DIALECT_LIST, FLANG_CODEGEN_DIALECT_LIST
62inline void registerNonCodegenDialects(mlir::DialectRegistry ®istry) {
63 registry.insert<FLANG_NONCODEGEN_DIALECT_LIST>();
64 mlir::func::registerInlinerExtension(registry);
65 mlir::LLVM::registerInlinerInterface(registry);
69inline void registerDialects(mlir::DialectRegistry ®istry) {
70 registerNonCodegenDialects(registry);
71 registry.insert<FLANG_CODEGEN_DIALECT_LIST>();
75inline void addFIRExtensions(mlir::DialectRegistry ®istry,
76 bool addFIRInlinerInterface =
true) {
77 if (addFIRInlinerInterface)
78 addFIRInlinerExtension(registry);
79 addFIRToLLVMIRExtension(registry);
81 fir::acc::registerOpenACCExtensions(registry);
82 fir::omp::registerOpenMPExtensions(registry);
85inline void loadNonCodegenDialects(mlir::MLIRContext &context) {
86 mlir::DialectRegistry registry;
87 registerNonCodegenDialects(registry);
88 context.appendDialectRegistry(registry);
90 context.loadDialect<FLANG_NONCODEGEN_DIALECT_LIST>();
96inline void loadDialects(mlir::MLIRContext &context) {
97 mlir::DialectRegistry registry;
98 registerDialects(registry);
99 context.appendDialectRegistry(registry);
101 context.loadDialect<FLANG_DIALECT_LIST>();
106inline void registerMLIRPassesForFortranTools() {
107 mlir::acc::registerOpenACCPasses();
108 mlir::registerCanonicalizerPass();
109 mlir::registerCSEPass();
110 mlir::affine::registerAffineLoopFusionPass();
111 mlir::registerLoopInvariantCodeMotionPass();
112 mlir::affine::registerLoopCoalescingPass();
113 mlir::registerStripDebugInfoPass();
114 mlir::registerPrintOpStatsPass();
115 mlir::registerInlinerPass();
116 mlir::registerSCCPPass();
117 mlir::registerSCFPasses();
118 mlir::affine::registerAffineScalarReplacementPass();
119 mlir::registerSymbolDCEPass();
120 mlir::registerLocationSnapshotPass();
121 mlir::affine::registerAffinePipelineDataTransferPass();
123 mlir::affine::registerAffineVectorizePass();
124 mlir::affine::registerAffineLoopUnrollPass();
125 mlir::affine::registerAffineLoopUnrollAndJamPass();
126 mlir::affine::registerSimplifyAffineStructuresPass();
127 mlir::affine::registerAffineLoopInvariantCodeMotionPass();
128 mlir::affine::registerAffineLoopTilingPass();
129 mlir::affine::registerAffineDataCopyGenerationPass();
131 mlir::registerLowerAffinePass();
135void registerLLVMTranslation(mlir::MLIRContext &context);
void registerCUFDialectTranslation(mlir::DialectRegistry ®istry)