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/RegisterOpenACCExtensions.h"
21#include "mlir/Conversion/Passes.h"
22#include "mlir/Dialect/Affine/Passes.h"
23#include "mlir/Dialect/Complex/IR/Complex.h"
24#include "mlir/Dialect/Func/Extensions/InlinerExtension.h"
25#include "mlir/Dialect/OpenACC/Transforms/Passes.h"
26#include "mlir/InitAllDialects.h"
27#include "mlir/Pass/Pass.h"
28#include "mlir/Pass/PassRegistry.h"
29#include "mlir/Transforms/LocationSnapshot.h"
30#include "mlir/Transforms/Passes.h"
32namespace fir::support {
34#define FLANG_NONCODEGEN_DIALECT_LIST \
35 mlir::affine::AffineDialect, FIROpsDialect, hlfir::hlfirDialect, \
36 mlir::acc::OpenACCDialect, mlir::omp::OpenMPDialect, \
37 mlir::scf::SCFDialect, mlir::arith::ArithDialect, \
38 mlir::cf::ControlFlowDialect, mlir::func::FuncDialect, \
39 mlir::vector::VectorDialect, mlir::math::MathDialect, \
40 mlir::complex::ComplexDialect, mlir::DLTIDialect, cuf::CUFDialect
42#define FLANG_CODEGEN_DIALECT_LIST FIRCodeGenDialect, mlir::LLVM::LLVMDialect
45#define FLANG_DIALECT_LIST \
46 FLANG_NONCODEGEN_DIALECT_LIST, FLANG_CODEGEN_DIALECT_LIST
48inline void registerNonCodegenDialects(mlir::DialectRegistry ®istry) {
49 registry.insert<FLANG_NONCODEGEN_DIALECT_LIST>();
50 mlir::func::registerInlinerExtension(registry);
51 mlir::LLVM::registerInlinerInterface(registry);
55inline void registerDialects(mlir::DialectRegistry ®istry) {
56 registerNonCodegenDialects(registry);
57 registry.insert<FLANG_CODEGEN_DIALECT_LIST>();
61inline void addFIRExtensions(mlir::DialectRegistry ®istry,
62 bool addFIRInlinerInterface =
true) {
63 if (addFIRInlinerInterface)
64 addFIRInlinerExtension(registry);
65 addFIRToLLVMIRExtension(registry);
67 fir::acc::registerOpenACCExtensions(registry);
70inline void loadNonCodegenDialects(mlir::MLIRContext &context) {
71 mlir::DialectRegistry registry;
72 registerNonCodegenDialects(registry);
73 context.appendDialectRegistry(registry);
75 context.loadDialect<FLANG_NONCODEGEN_DIALECT_LIST>();
81inline void loadDialects(mlir::MLIRContext &context) {
82 mlir::DialectRegistry registry;
83 registerDialects(registry);
84 context.appendDialectRegistry(registry);
86 context.loadDialect<FLANG_DIALECT_LIST>();
91inline void registerMLIRPassesForFortranTools() {
92 mlir::acc::registerOpenACCPasses();
93 mlir::registerCanonicalizerPass();
94 mlir::registerCSEPass();
95 mlir::affine::registerAffineLoopFusionPass();
96 mlir::registerLoopInvariantCodeMotionPass();
97 mlir::affine::registerLoopCoalescingPass();
98 mlir::registerStripDebugInfoPass();
99 mlir::registerPrintOpStatsPass();
100 mlir::registerInlinerPass();
101 mlir::registerSCCPPass();
102 mlir::affine::registerAffineScalarReplacementPass();
103 mlir::registerSymbolDCEPass();
104 mlir::registerLocationSnapshotPass();
105 mlir::affine::registerAffinePipelineDataTransferPass();
107 mlir::affine::registerAffineVectorizePass();
108 mlir::affine::registerAffineLoopUnrollPass();
109 mlir::affine::registerAffineLoopUnrollAndJamPass();
110 mlir::affine::registerSimplifyAffineStructuresPass();
111 mlir::affine::registerAffineLoopInvariantCodeMotionPass();
112 mlir::affine::registerAffineLoopTilingPass();
113 mlir::affine::registerAffineDataCopyGenerationPass();
115 mlir::registerConvertAffineToStandardPass();
119void registerLLVMTranslation(mlir::MLIRContext &context);
void registerCUFDialectTranslation(mlir::DialectRegistry ®istry)