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/Transforms/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/OpenMP/Transforms/Passes.h"
38#include "mlir/Dialect/SCF/IR/SCF.h"
39#include "mlir/Dialect/SCF/Transforms/Passes.h"
40#include "mlir/InitAllDialects.h"
41#include "mlir/Transforms/Passes.h"
42
43namespace fir::support {
44
45#define FLANG_NONCODEGEN_DIALECT_LIST \
46 mlir::affine::AffineDialect, FIROpsDialect, hlfir::hlfirDialect, \
47 mlir::acc::OpenACCDialect, mlir::omp::OpenMPDialect, \
48 mlir::scf::SCFDialect, mlir::arith::ArithDialect, \
49 mlir::cf::ControlFlowDialect, mlir::func::FuncDialect, \
50 mlir::vector::VectorDialect, mlir::math::MathDialect, \
51 mlir::complex::ComplexDialect, mlir::DLTIDialect, cuf::CUFDialect, \
52 mlir::NVVM::NVVMDialect, mlir::gpu::GPUDialect, \
53 mlir::index::IndexDialect, mif::MIFDialect
54
55#define FLANG_CODEGEN_DIALECT_LIST FIRCodeGenDialect, mlir::LLVM::LLVMDialect
56
57// The definitive list of dialects used by flang.
58#define FLANG_DIALECT_LIST \
59 FLANG_NONCODEGEN_DIALECT_LIST, FLANG_CODEGEN_DIALECT_LIST
60
61inline void registerNonCodegenDialects(mlir::DialectRegistry &registry) {
62 registry.insert<FLANG_NONCODEGEN_DIALECT_LIST>();
63 mlir::func::registerInlinerExtension(registry);
64 mlir::LLVM::registerInlinerInterface(registry);
65}
66
68inline void registerDialects(mlir::DialectRegistry &registry) {
69 registerNonCodegenDialects(registry);
70 registry.insert<FLANG_CODEGEN_DIALECT_LIST>();
71}
72
73// Register FIR Extensions
74inline void addFIRExtensions(mlir::DialectRegistry &registry,
75 bool addFIRInlinerInterface = true) {
76 if (addFIRInlinerInterface)
77 addFIRInlinerExtension(registry);
78 addFIRToLLVMIRExtension(registry);
80 fir::acc::registerOpenACCExtensions(registry);
81 fir::omp::registerOpenMPExtensions(registry);
82}
83
84inline void loadNonCodegenDialects(mlir::MLIRContext &context) {
85 mlir::DialectRegistry registry;
86 registerNonCodegenDialects(registry);
87 context.appendDialectRegistry(registry);
88
89 context.loadDialect<FLANG_NONCODEGEN_DIALECT_LIST>();
90}
91
95inline void loadDialects(mlir::MLIRContext &context) {
96 mlir::DialectRegistry registry;
97 registerDialects(registry);
98 context.appendDialectRegistry(registry);
99
100 context.loadDialect<FLANG_DIALECT_LIST>();
101}
102
105inline void registerMLIRPassesForFortranTools() {
106 mlir::acc::registerOpenACCPasses();
107 mlir::omp::registerOpenMPPasses();
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();
122
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();
130
131 mlir::registerMem2RegPass();
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)