FLANG
Pipelines.h
1//===-- Pipelines.h -- FIR pass pipelines -----------------------*- 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
11
12#ifndef FORTRAN_OPTIMIZER_PASSES_PIPELINES_H
13#define FORTRAN_OPTIMIZER_PASSES_PIPELINES_H
14
15#include "flang/Optimizer/CodeGen/CodeGen.h"
16#include "flang/Optimizer/HLFIR/Passes.h"
17#include "flang/Optimizer/OpenMP/Passes.h"
18#include "flang/Optimizer/Passes/CommandLineOpts.h"
19#include "flang/Optimizer/Transforms/Passes.h"
20#include "flang/Tools/CrossToolHelpers.h"
21#include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h"
22#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
23#include "mlir/Dialect/GPU/IR/GPUDialect.h"
24#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
25#include "mlir/Pass/PassManager.h"
26#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
27#include "mlir/Transforms/Passes.h"
28#include "llvm/Frontend/Debug/Options.h"
29#include "llvm/Passes/OptimizationLevel.h"
30#include "llvm/Support/CommandLine.h"
31#include <functional>
32
33namespace fir {
34
35class GlobalOp;
36
37using PassConstructor = std::unique_ptr<mlir::Pass>();
38
39template <typename F, typename OP>
40void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
41 pm.addNestedPass<OP>(ctor());
42}
43
44template <typename F, typename OP, typename... OPS,
45 typename = std::enable_if_t<sizeof...(OPS) != 0>>
46void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
47 addNestedPassToOps<F, OP>(pm, ctor);
48 addNestedPassToOps<F, OPS...>(pm, ctor);
49}
50
52template <typename F>
53void addPassConditionally(mlir::PassManager &pm, llvm::cl::opt<bool> &disabled,
54 F ctor) {
55 if (!disabled)
56 pm.addPass(ctor());
57}
58
59template <typename OP, typename F>
60void addNestedPassConditionally(mlir::PassManager &pm,
61 llvm::cl::opt<bool> &disabled, F ctor) {
62 if (!disabled)
63 pm.addNestedPass<OP>(ctor());
64}
65
66template <typename F>
67void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor) {
68 addNestedPassToOps<F, mlir::func::FuncOp, mlir::omp::DeclareMapperOp,
69 mlir::omp::DeclareReductionOp, mlir::omp::PrivateClauseOp,
70 fir::GlobalOp>(pm, ctor);
71}
72
73template <typename F>
74void addNestedPassToAllTopLevelOperationsConditionally(
75 mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor) {
76 if (!disabled)
77 addNestedPassToAllTopLevelOperations<F>(pm, ctor);
78}
79
80template <typename F>
81void addPassToGPUModuleOperations(mlir::PassManager &pm, F ctor) {
82 mlir::OpPassManager &nestPM = pm.nest<mlir::gpu::GPUModuleOp>();
83 nestPM.addNestedPass<mlir::func::FuncOp>(ctor());
84 nestPM.addNestedPass<mlir::gpu::GPUFuncOp>(ctor());
85}
86
96void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm);
97
98void addCfgConversionPass(mlir::PassManager &pm,
99 const MLIRToLLVMPassPipelineConfig &config);
100
101void addMemoryAllocationOpt(mlir::PassManager &pm);
102
103void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare);
104
105void addTargetRewritePass(mlir::PassManager &pm);
106
107mlir::LLVM::DIEmissionKind
108getEmissionKind(llvm::codegenoptions::DebugInfoKind kind);
109
110void addBoxedProcedurePass(mlir::PassManager &pm,
111 bool enableSafeTrampoline = false);
112
113void addExternalNameConversionPass(mlir::PassManager &pm,
114 bool appendUnderscore = true);
115
116void addCompilerGeneratedNamesConversionPass(mlir::PassManager &pm);
117
118void addDebugInfoPass(mlir::PassManager &pm,
119 const MLIRToLLVMPassPipelineConfig &config,
120 llvm::StringRef inputFilename);
121
124getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config);
125
126void addFIRToLLVMPass(mlir::PassManager &pm,
127 const MLIRToLLVMPassPipelineConfig &config);
128
129void addLLVMDialectToLLVMPass(mlir::PassManager &pm, llvm::raw_ostream &output);
130
132void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config);
133
137 std::function<void(MLIRToLLVMPassPipelineConfig &)>;
138
144
148
152
156 mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc);
157
161 mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc);
162
167void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
169
171enum class EnableOpenMP { None, Simd, Full };
172
178void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
179 EnableOpenMP enableOpenMP,
180 const MLIRToLLVMPassPipelineConfig &config);
181
195
205void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
207
208#if !defined(FLANG_EXCLUDE_CODEGEN)
209void createDebugPasses(mlir::PassManager &pm,
210 const MLIRToLLVMPassPipelineConfig &config,
211 llvm::StringRef inputFilename);
212
213void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
215 llvm::StringRef inputFilename = {});
216
222void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
224 llvm::StringRef inputFilename = {});
225#undef FLANG_EXCLUDE_CODEGEN
226#endif
227
228} // namespace fir
229
230#endif // FORTRAN_OPTIMIZER_PASSES_PIPELINES_H
flangomp::DoConcurrentMappingKind DoConcurrentMappingKind
Definition CodeGenOptions.h:160
Definition AbstractConverter.h:37
void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config)
Use inliner extension point callback to register the default inliner pass.
Definition Pipelines.cpp:155
void createOpenMPFIRPassPipeline(mlir::PassManager &pm, OpenMPFIRPassPipelineOpts opts)
Definition Pipelines.cpp:388
void registerPassPipelineConfigCallback(PassPipelineConfigCallback callback)
Definition Pipelines.cpp:172
void registerFlangPipelinePasses()
Definition Pipelines.cpp:552
void createDefaultFIRPreCFGOptimizerPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc)
Definition Pipelines.cpp:181
EnableOpenMP
Select which mode to enable OpenMP support in.
Definition Pipelines.h:171
void addPassConditionally(mlir::PassManager &pm, llvm::cl::opt< bool > &disabled, F ctor)
Generic for adding a pass to the pass manager if it is not disabled.
Definition Pipelines.h:53
void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm)
Definition Pipelines.cpp:29
void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, EnableOpenMP enableOpenMP, const MLIRToLLVMPassPipelineConfig &config)
Definition Pipelines.cpp:293
std::function< void(MLIRToLLVMPassPipelineConfig &)> PassPipelineConfigCallback
Definition Pipelines.h:136
void createDefaultFIRPostCFGOptimizerPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc)
Definition Pipelines.cpp:254
void invokePassPipelineConfigCallbacks(MLIRToLLVMPassPipelineConfig &config)
Definition Pipelines.cpp:176
FIRToLLVMPassOptions getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config)
Create FIRToLLVMPassOptions from pipeline configuration.
Definition Pipelines.cpp:98
void createMLIRToLLVMPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &config, llvm::StringRef inputFilename={})
Definition Pipelines.cpp:519
void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc)
Definition Pipelines.cpp:279
Configuriation for the MLIR to LLVM pass pipeline.
Definition CrossToolHelpers.h:114
FIR to LLVM translation pass options.
Definition CodeGen.h:40
Definition Pipelines.h:182
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind doConcurrentMappingKind
Definition Pipelines.h:193
bool isTargetDevice
Definition Pipelines.h:188
bool isSimdOnly
Whether only OpenMP simd constructs are being honored.
Definition Pipelines.h:184