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
32namespace fir {
33
34class GlobalOp;
35
36using PassConstructor = std::unique_ptr<mlir::Pass>();
37
38template <typename F, typename OP>
39void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
40 pm.addNestedPass<OP>(ctor());
41}
42
43template <typename F, typename OP, typename... OPS,
44 typename = std::enable_if_t<sizeof...(OPS) != 0>>
45void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
46 addNestedPassToOps<F, OP>(pm, ctor);
47 addNestedPassToOps<F, OPS...>(pm, ctor);
48}
49
51template <typename F>
52void addPassConditionally(mlir::PassManager &pm, llvm::cl::opt<bool> &disabled,
53 F ctor) {
54 if (!disabled)
55 pm.addPass(ctor());
56}
57
58template <typename OP, typename F>
59void addNestedPassConditionally(mlir::PassManager &pm,
60 llvm::cl::opt<bool> &disabled, F ctor) {
61 if (!disabled)
62 pm.addNestedPass<OP>(ctor());
63}
64
65template <typename F>
66void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor) {
67 addNestedPassToOps<F, mlir::func::FuncOp, mlir::omp::DeclareMapperOp,
68 mlir::omp::DeclareReductionOp, mlir::omp::PrivateClauseOp,
69 fir::GlobalOp>(pm, ctor);
70}
71
72template <typename F>
73void addNestedPassToAllTopLevelOperationsConditionally(
74 mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor) {
75 if (!disabled)
76 addNestedPassToAllTopLevelOperations<F>(pm, ctor);
77}
78
79template <typename F>
80void addPassToGPUModuleOperations(mlir::PassManager &pm, F ctor) {
81 mlir::OpPassManager &nestPM = pm.nest<mlir::gpu::GPUModuleOp>();
82 nestPM.addNestedPass<mlir::func::FuncOp>(ctor());
83 nestPM.addNestedPass<mlir::gpu::GPUFuncOp>(ctor());
84}
85
95void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm);
96
97void addCfgConversionPass(mlir::PassManager &pm,
98 const MLIRToLLVMPassPipelineConfig &config);
99
100void addMemoryAllocationOpt(mlir::PassManager &pm);
101
102void addAllocationPlacement(mlir::PassManager &pm, bool stackArrays);
103
104void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare);
105
106void addTargetRewritePass(mlir::PassManager &pm);
107
108mlir::LLVM::DIEmissionKind
109getEmissionKind(llvm::codegenoptions::DebugInfoKind kind);
110
111void addBoxedProcedurePass(mlir::PassManager &pm,
112 bool enableSafeTrampoline = false);
113
114void addExternalNameConversionPass(mlir::PassManager &pm,
115 bool appendUnderscore = true);
116
117void addCompilerGeneratedNamesConversionPass(mlir::PassManager &pm);
118
119void addDebugInfoPass(mlir::PassManager &pm,
120 const MLIRToLLVMPassPipelineConfig &config,
121 llvm::StringRef inputFilename);
122
125getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config);
126
127void addFIRToLLVMPass(mlir::PassManager &pm,
128 const MLIRToLLVMPassPipelineConfig &config);
129
130void addLLVMDialectToLLVMPass(mlir::PassManager &pm, llvm::raw_ostream &output);
131
133void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config);
134
138
143void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
144 MLIRToLLVMPassPipelineConfig &pc);
145
147enum class EnableOpenMP { None, Simd, Full };
148
154void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
155 EnableOpenMP enableOpenMP,
156 const MLIRToLLVMPassPipelineConfig &config);
157
168
178void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
180
181#if !defined(FLANG_EXCLUDE_CODEGEN)
182void createDebugPasses(mlir::PassManager &pm,
183 const MLIRToLLVMPassPipelineConfig &config,
184 llvm::StringRef inputFilename);
185
186void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
188 llvm::StringRef inputFilename = {});
189
195void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
197 llvm::StringRef inputFilename = {});
198#undef FLANG_EXCLUDE_CODEGEN
199#endif
200
201} // namespace fir
202
203#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:163
void createOpenMPFIRPassPipeline(mlir::PassManager &pm, OpenMPFIRPassPipelineOpts opts)
Definition Pipelines.cpp:351
void registerFlangPipelinePasses()
Definition Pipelines.cpp:502
EnableOpenMP
Select which mode to enable OpenMP support in.
Definition Pipelines.h:147
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:52
void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm)
Definition Pipelines.cpp:32
void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, EnableOpenMP enableOpenMP, const MLIRToLLVMPassPipelineConfig &config)
Definition Pipelines.cpp:262
FIRToLLVMPassOptions getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config)
Create FIRToLLVMPassOptions from pipeline configuration.
Definition Pipelines.cpp:106
void createMLIRToLLVMPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &config, llvm::StringRef inputFilename={})
Definition Pipelines.cpp:471
void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc)
Definition Pipelines.cpp:178
Configuriation for the MLIR to LLVM pass pipeline.
Definition CrossToolHelpers.h:82
FIR to LLVM translation pass options.
Definition CodeGen.h:35
Definition Pipelines.h:158
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind doConcurrentMappingKind
Definition Pipelines.h:166
bool isTargetDevice
Definition Pipelines.h:161