FLANG
InitFIR.h
1//===-- Optimizer/Support/InitFIR.h -----------------------------*- 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//
9// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
14#define FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
15
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/Dialect/MIF/MIFDialect.h"
20#include "flang/Optimizer/HLFIR/HLFIRDialect.h"
21#include "flang/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.h"
22#include "flang/Optimizer/OpenMP/Support/RegisterOpenMPExtensions.h"
23#include "mlir/Conversion/Passes.h"
24#include "mlir/Dialect/Affine/IR/AffineOps.h"
25#include "mlir/Dialect/Affine/Passes.h"
26#include "mlir/Dialect/Complex/IR/Complex.h"
27#include "mlir/Dialect/ControlFlow/IR/ControlFlow.h"
28#include "mlir/Dialect/DLTI/DLTI.h"
29#include "mlir/Dialect/Func/Extensions/InlinerExtension.h"
30#include "mlir/Dialect/Func/IR/FuncOps.h"
31#include "mlir/Dialect/Index/IR/IndexDialect.h"
32#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
33#include "mlir/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.h"
34#include "mlir/Dialect/Math/IR/Math.h"
35#include "mlir/Dialect/OpenACC/OpenACC.h"
36#include "mlir/Dialect/OpenACC/Transforms/Passes.h"
37#include "mlir/Dialect/SCF/IR/SCF.h"
38#include "mlir/Dialect/SCF/Transforms/Passes.h"
39#include "mlir/InitAllDialects.h"
40#include "mlir/Pass/Pass.h"
41#include "mlir/Pass/PassRegistry.h"
42#include "mlir/Transforms/LocationSnapshot.h"
43#include "mlir/Transforms/Passes.h"
44
45namespace fir::support {
46
47#define FLANG_NONCODEGEN_DIALECT_LIST \
48 mlir::affine::AffineDialect, FIROpsDialect, hlfir::hlfirDialect, \
49 mlir::acc::OpenACCDialect, mlir::omp::OpenMPDialect, \
50 mlir::scf::SCFDialect, mlir::arith::ArithDialect, \
51 mlir::cf::ControlFlowDialect, mlir::func::FuncDialect, \
52 mlir::vector::VectorDialect, mlir::math::MathDialect, \
53 mlir::complex::ComplexDialect, mlir::DLTIDialect, cuf::CUFDialect, \
54 mlir::NVVM::NVVMDialect, mlir::gpu::GPUDialect, \
55 mlir::index::IndexDialect, mif::MIFDialect
56
57#define FLANG_CODEGEN_DIALECT_LIST FIRCodeGenDialect, mlir::LLVM::LLVMDialect
58
59// The definitive list of dialects used by flang.
60#define FLANG_DIALECT_LIST \
61 FLANG_NONCODEGEN_DIALECT_LIST, FLANG_CODEGEN_DIALECT_LIST
62
63inline void registerNonCodegenDialects(mlir::DialectRegistry &registry) {
64 registry.insert<FLANG_NONCODEGEN_DIALECT_LIST>();
65 mlir::func::registerInlinerExtension(registry);
66 mlir::LLVM::registerInlinerInterface(registry);
67}
68
70inline void registerDialects(mlir::DialectRegistry &registry) {
71 registerNonCodegenDialects(registry);
72 registry.insert<FLANG_CODEGEN_DIALECT_LIST>();
73}
74
75// Register FIR Extensions
76inline void addFIRExtensions(mlir::DialectRegistry &registry,
77 bool addFIRInlinerInterface = true) {
78 if (addFIRInlinerInterface)
79 addFIRInlinerExtension(registry);
80 addFIRToLLVMIRExtension(registry);
82 fir::acc::registerOpenACCExtensions(registry);
83 fir::omp::registerOpenMPExtensions(registry);
84}
85
86inline void loadNonCodegenDialects(mlir::MLIRContext &context) {
87 mlir::DialectRegistry registry;
88 registerNonCodegenDialects(registry);
89 context.appendDialectRegistry(registry);
90
91 context.loadDialect<FLANG_NONCODEGEN_DIALECT_LIST>();
92}
93
97inline void loadDialects(mlir::MLIRContext &context) {
98 mlir::DialectRegistry registry;
99 registerDialects(registry);
100 context.appendDialectRegistry(registry);
101
102 context.loadDialect<FLANG_DIALECT_LIST>();
103}
104
107inline void registerMLIRPassesForFortranTools() {
108 mlir::acc::registerOpenACCPasses();
109 mlir::registerCanonicalizerPass();
110 mlir::registerCSEPass();
111 mlir::affine::registerAffineLoopFusionPass();
112 mlir::registerLoopInvariantCodeMotionPass();
113 mlir::affine::registerLoopCoalescingPass();
114 mlir::registerStripDebugInfoPass();
115 mlir::registerPrintOpStatsPass();
116 mlir::registerInlinerPass();
117 mlir::registerSCCPPass();
118 mlir::registerSCFPasses();
119 mlir::affine::registerAffineScalarReplacementPass();
120 mlir::registerSymbolDCEPass();
121 mlir::registerLocationSnapshotPass();
122 mlir::affine::registerAffinePipelineDataTransferPass();
123
124 mlir::affine::registerAffineVectorizePass();
125 mlir::affine::registerAffineLoopUnrollPass();
126 mlir::affine::registerAffineLoopUnrollAndJamPass();
127 mlir::affine::registerSimplifyAffineStructuresPass();
128 mlir::affine::registerAffineLoopInvariantCodeMotionPass();
129 mlir::affine::registerAffineLoopTilingPass();
130 mlir::affine::registerAffineDataCopyGenerationPass();
131
132 mlir::registerLowerAffinePass();
133}
134
136void registerLLVMTranslation(mlir::MLIRContext &context);
137
138} // namespace fir::support
139
140#endif // FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
void registerCUFDialectTranslation(mlir::DialectRegistry &registry)