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/Dialect/OpenMP/Transforms/Passes.h"
26#include "mlir/Pass/PassManager.h"
27#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
28#include "mlir/Transforms/Passes.h"
29#include "llvm/Frontend/Debug/Options.h"
30#include "llvm/Passes/OptimizationLevel.h"
31#include "llvm/Support/CommandLine.h"
32
33namespace fir {
34
35using PassConstructor = std::unique_ptr<mlir::Pass>();
36
37template <typename F, typename OP>
38void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
39 pm.addNestedPass<OP>(ctor());
40}
41
42template <typename F, typename OP, typename... OPS,
43 typename = std::enable_if_t<sizeof...(OPS) != 0>>
44void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
45 addNestedPassToOps<F, OP>(pm, ctor);
46 addNestedPassToOps<F, OPS...>(pm, ctor);
47}
48
50template <typename F>
51void addPassConditionally(mlir::PassManager &pm, llvm::cl::opt<bool> &disabled,
52 F ctor) {
53 if (!disabled)
54 pm.addPass(ctor());
55}
56
57template <typename OP, typename F>
58void addNestedPassConditionally(mlir::PassManager &pm,
59 llvm::cl::opt<bool> &disabled, F ctor) {
60 if (!disabled)
61 pm.addNestedPass<OP>(ctor());
62}
63
64template <typename F>
65void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor);
66
67template <typename F>
68void addNestedPassToAllTopLevelOperationsConditionally(
69 mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor);
70
80void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm);
81
82void addCfgConversionPass(mlir::PassManager &pm,
83 const MLIRToLLVMPassPipelineConfig &config);
84
85void addAVC(mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel);
86
87void addMemoryAllocationOpt(mlir::PassManager &pm);
88
89void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare);
90
91void addTargetRewritePass(mlir::PassManager &pm);
92
93mlir::LLVM::DIEmissionKind
94getEmissionKind(llvm::codegenoptions::DebugInfoKind kind);
95
96void addBoxedProcedurePass(mlir::PassManager &pm,
97 bool enableSafeTrampoline = false);
98
99void addExternalNameConversionPass(mlir::PassManager &pm,
100 bool appendUnderscore = true);
101
102void addCompilerGeneratedNamesConversionPass(mlir::PassManager &pm);
103
104void addDebugInfoPass(mlir::PassManager &pm,
105 const MLIRToLLVMPassPipelineConfig &config,
106 llvm::StringRef inputFilename);
107
110getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config);
111
112void addFIRToLLVMPass(mlir::PassManager &pm,
113 const MLIRToLLVMPassPipelineConfig &config);
114
115void addLLVMDialectToLLVMPass(mlir::PassManager &pm, llvm::raw_ostream &output);
116
118void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config);
119
124void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
125 MLIRToLLVMPassPipelineConfig &pc);
126
128enum class EnableOpenMP { None, Simd, Full };
129
135void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
136 EnableOpenMP enableOpenMP,
137 const MLIRToLLVMPassPipelineConfig &config);
138
149
159void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
161
162#if !defined(FLANG_EXCLUDE_CODEGEN)
163void createDebugPasses(mlir::PassManager &pm,
164 const MLIRToLLVMPassPipelineConfig &config,
165 llvm::StringRef inputFilename);
166
167void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
169 llvm::StringRef inputFilename = {});
170
176void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
178 llvm::StringRef inputFilename = {});
179#undef FLANG_EXCLUDE_CODEGEN
180#endif
181
182} // namespace fir
183
184#endif // FORTRAN_OPTIMIZER_PASSES_PIPELINES_H
flangomp::DoConcurrentMappingKind DoConcurrentMappingKind
Definition CodeGenOptions.h:161
Definition AbstractConverter.h:37
void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config)
Use inliner extension point callback to register the default inliner pass.
Definition Pipelines.cpp:169
void createOpenMPFIRPassPipeline(mlir::PassManager &pm, OpenMPFIRPassPipelineOpts opts)
Definition Pipelines.cpp:343
EnableOpenMP
Select which mode to enable OpenMP support in.
Definition Pipelines.h:128
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:51
void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm)
Definition Pipelines.cpp:42
void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, EnableOpenMP enableOpenMP, const MLIRToLLVMPassPipelineConfig &config)
Definition Pipelines.cpp:265
FIRToLLVMPassOptions getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config)
Create FIRToLLVMPassOptions from pipeline configuration.
Definition Pipelines.cpp:112
void createMLIRToLLVMPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &config, llvm::StringRef inputFilename={})
Definition Pipelines.cpp:439
void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc)
Definition Pipelines.cpp:184
Configuriation for the MLIR to LLVM pass pipeline.
Definition CrossToolHelpers.h:83
FIR to LLVM translation pass options.
Definition CodeGen.h:34
Definition Pipelines.h:139
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind doConcurrentMappingKind
Definition Pipelines.h:147
bool isTargetDevice
Definition Pipelines.h:142