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
34using PassConstructor = std::unique_ptr<mlir::Pass>();
35
36template <typename F, typename OP>
37void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
38 pm.addNestedPass<OP>(ctor());
39}
40
41template <typename F, typename OP, typename... OPS,
42 typename = std::enable_if_t<sizeof...(OPS) != 0>>
43void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
44 addNestedPassToOps<F, OP>(pm, ctor);
45 addNestedPassToOps<F, OPS...>(pm, ctor);
46}
47
49template <typename F>
50void addPassConditionally(mlir::PassManager &pm, llvm::cl::opt<bool> &disabled,
51 F ctor) {
52 if (!disabled)
53 pm.addPass(ctor());
54}
55
56template <typename OP, typename F>
57void addNestedPassConditionally(mlir::PassManager &pm,
58 llvm::cl::opt<bool> &disabled, F ctor) {
59 if (!disabled)
60 pm.addNestedPass<OP>(ctor());
61}
62
63template <typename F>
64void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor);
65
66template <typename F>
67void addNestedPassToAllTopLevelOperationsConditionally(
68 mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor);
69
79void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm);
80
81void addCfgConversionPass(mlir::PassManager &pm,
82 const MLIRToLLVMPassPipelineConfig &config);
83
84void addAVC(mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel);
85
86void addMemoryAllocationOpt(mlir::PassManager &pm);
87
88void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare);
89
90void addTargetRewritePass(mlir::PassManager &pm);
91
92mlir::LLVM::DIEmissionKind
93getEmissionKind(llvm::codegenoptions::DebugInfoKind kind);
94
95void addBoxedProcedurePass(mlir::PassManager &pm);
96
97void addExternalNameConversionPass(mlir::PassManager &pm,
98 bool appendUnderscore = true);
99
100void addCompilerGeneratedNamesConversionPass(mlir::PassManager &pm);
101
102void addDebugInfoPass(mlir::PassManager &pm,
103 llvm::codegenoptions::DebugInfoKind debugLevel,
104 llvm::OptimizationLevel optLevel,
105 llvm::StringRef inputFilename);
106
107void addFIRToLLVMPass(mlir::PassManager &pm,
108 const MLIRToLLVMPassPipelineConfig &config);
109
110void addLLVMDialectToLLVMPass(mlir::PassManager &pm, llvm::raw_ostream &output);
111
114
119void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
121
128 mlir::PassManager &pm, bool enableOpenMP,
129 llvm::OptimizationLevel optLevel = defaultOptLevel);
130
140void createOpenMPFIRPassPipeline(mlir::PassManager &pm, bool isTargetDevice);
141
142#if !defined(FLANG_EXCLUDE_CODEGEN)
143void createDebugPasses(mlir::PassManager &pm,
144 llvm::codegenoptions::DebugInfoKind debugLevel,
145 llvm::OptimizationLevel OptLevel,
146 llvm::StringRef inputFilename);
147
148void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
150 llvm::StringRef inputFilename = {});
151
157void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
159 llvm::StringRef inputFilename = {});
160#undef FLANG_EXCLUDE_CODEGEN
161#endif
162
163} // namespace fir
164
165#endif // FORTRAN_OPTIMIZER_PASSES_PIPELINES_H
Definition: AbstractConverter.h:31
void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config)
Use inliner extension point callback to register the default inliner pass.
Definition: Pipelines.cpp:144
void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, bool enableOpenMP, llvm::OptimizationLevel optLevel=defaultOptLevel)
Definition: Pipelines.cpp:223
void createOpenMPFIRPassPipeline(mlir::PassManager &pm, bool isTargetDevice)
Definition: Pipelines.cpp:273
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:50
void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm)
Definition: Pipelines.cpp:36
void createMLIRToLLVMPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &config, llvm::StringRef inputFilename={})
Definition: Pipelines.cpp:331
void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig &pc)
Definition: Pipelines.cpp:159
Configuriation for the MLIR to LLVM pass pipeline.
Definition: CrossToolHelpers.h:82