13#ifndef FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
14#define FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
16#include "flang/Frontend/CodeGenOptions.h"
17#include "flang/Support/LangOptions.h"
21#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
22#include "mlir/IR/BuiltinOps.h"
23#include "mlir/Pass/PassRegistry.h"
24#include "llvm/ADT/SmallVector.h"
25#include "llvm/Frontend/Debug/Options.h"
26#include "llvm/Passes/OptimizationLevel.h"
31 void registerFIROptEarlyEPCallbacks(
32 const std::function<
void(mlir::PassManager &, llvm::OptimizationLevel)>
34 FIROptEarlyEPCallbacks.push_back(C);
37 void registerFIRInlinerCallback(
38 const std::function<
void(mlir::PassManager &, llvm::OptimizationLevel)>
40 FIRInlinerCallback.push_back(C);
43 void registerFIROptLastEPCallbacks(
44 const std::function<
void(mlir::PassManager &, llvm::OptimizationLevel)>
46 FIROptLastEPCallbacks.push_back(C);
49 void invokeFIROptEarlyEPCallbacks(
50 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) {
51 for (
auto &C : FIROptEarlyEPCallbacks)
55 void invokeFIRInlinerCallback(
56 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) {
57 for (
auto &C : FIRInlinerCallback)
61 void invokeFIROptLastEPCallbacks(
62 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) {
63 for (
auto &C : FIROptLastEPCallbacks)
69 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
70 FIROptEarlyEPCallbacks;
73 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
77 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
78 FIROptLastEPCallbacks;
83 explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level) {
86 explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level,
107 if (opts.InstrumentFunctions) {
122 llvm::codegenoptions::NoDebugInfo;
124 llvm::FramePointerKind::None;
148 Fortran::frontend::CodeGenOptions::ComplexRangeKind::
155struct OffloadModuleOpts {
156 OffloadModuleOpts() {}
157 OffloadModuleOpts(uint32_t OpenMPTargetDebug,
bool OpenMPTeamSubscription,
158 bool OpenMPThreadSubscription,
bool OpenMPNoThreadState,
159 bool OpenMPNoNestedParallelism,
bool OpenMPIsTargetDevice,
160 bool OpenMPIsGPU,
bool OpenMPForceUSM, uint32_t OpenMPVersion,
161 std::string OMPHostIRFile = {},
162 const std::vector<llvm::Triple> &OMPTargetTriples = {},
163 bool NoGPULib =
false)
164 : OpenMPTargetDebug(OpenMPTargetDebug),
165 OpenMPTeamSubscription(OpenMPTeamSubscription),
166 OpenMPThreadSubscription(OpenMPThreadSubscription),
167 OpenMPNoThreadState(OpenMPNoThreadState),
168 OpenMPNoNestedParallelism(OpenMPNoNestedParallelism),
169 OpenMPIsTargetDevice(OpenMPIsTargetDevice), OpenMPIsGPU(OpenMPIsGPU),
170 OpenMPForceUSM(OpenMPForceUSM), OpenMPVersion(OpenMPVersion),
171 OMPHostIRFile(OMPHostIRFile),
172 OMPTargetTriples(OMPTargetTriples.begin(), OMPTargetTriples.end()),
173 NoGPULib(NoGPULib) {}
176 : OpenMPTargetDebug(Opts.OpenMPTargetDebug),
177 OpenMPTeamSubscription(Opts.OpenMPTeamSubscription),
178 OpenMPThreadSubscription(Opts.OpenMPThreadSubscription),
179 OpenMPNoThreadState(Opts.OpenMPNoThreadState),
180 OpenMPNoNestedParallelism(Opts.OpenMPNoNestedParallelism),
181 OpenMPIsTargetDevice(Opts.OpenMPIsTargetDevice),
182 OpenMPIsGPU(Opts.OpenMPIsGPU), OpenMPForceUSM(Opts.OpenMPForceUSM),
183 OpenMPVersion(Opts.OpenMPVersion), OMPHostIRFile(Opts.
OMPHostIRFile),
186 uint32_t OpenMPTargetDebug = 0;
187 bool OpenMPTeamSubscription =
false;
188 bool OpenMPThreadSubscription =
false;
189 bool OpenMPNoThreadState =
false;
190 bool OpenMPNoNestedParallelism =
false;
191 bool OpenMPIsTargetDevice =
false;
192 bool OpenMPIsGPU =
false;
193 bool OpenMPForceUSM =
false;
194 uint32_t OpenMPVersion = 31;
195 std::string OMPHostIRFile = {};
196 std::vector<llvm::Triple> OMPTargetTriples = {};
197 bool NoGPULib =
false;
202[[maybe_unused]]
static void setOffloadModuleInterfaceAttributes(
205 if (
auto offloadMod = llvm::dyn_cast<mlir::omp::OffloadModuleInterface>(
206 module.getOperation())) {
207 offloadMod.setIsTargetDevice(Opts.OpenMPIsTargetDevice);
208 offloadMod.setIsGPU(Opts.OpenMPIsGPU);
209 if (Opts.OpenMPForceUSM) {
210 offloadMod.setRequires(mlir::omp::ClauseRequires::unified_shared_memory);
212 if (Opts.OpenMPIsTargetDevice) {
213 offloadMod.setFlags(Opts.OpenMPTargetDebug, Opts.OpenMPTeamSubscription,
214 Opts.OpenMPThreadSubscription, Opts.OpenMPNoThreadState,
215 Opts.OpenMPNoNestedParallelism, Opts.OpenMPVersion, Opts.NoGPULib);
217 if (!Opts.OMPHostIRFile.empty())
218 offloadMod.setHostIRFilePath(Opts.OMPHostIRFile);
220 auto strTriples = llvm::to_vector(llvm::map_range(Opts.OMPTargetTriples,
221 [](llvm::Triple triple) { return triple.normalize(); }));
222 offloadMod.setTargetTriples(strTriples);
226[[maybe_unused]]
static void setOpenMPVersionAttribute(
227 mlir::ModuleOp module, int64_t version) {
228 module.getOperation()->setAttr(
229 mlir::StringAttr::get(module.getContext(), llvm::Twine{"omp.version"}),
230 mlir::omp::VersionAttr::get(module.getContext(), version));
233[[maybe_unused]]
static int64_t getOpenMPVersionAttribute(
234 mlir::ModuleOp module, int64_t fallback = -1) {
235 if (mlir::Attribute verAttr = module->getAttr(
"omp.version"))
236 return llvm::cast<mlir::omp::VersionAttr>(verAttr).getVersion();
Definition CrossToolHelpers.h:29
Definition LangOptions.h:58
std::vector< llvm::Triple > OMPTargetTriples
List of triples passed in using -fopenmp-targets.
Definition LangOptions.h:76
std::string OMPHostIRFile
signed integer overflow handling
Definition LangOptions.h:73
Definition MathOptionsBase.h:22
Definition CodeGenOptions.h:50
std::string PreferVectorWidth
The prefered vector width, if requested by -mprefer-vector-width.
Definition CodeGenOptions.h:57
std::string SplitDwarfFile
Definition CodeGenOptions.h:178
std::string Reciprocals
List of reciprocal estimate sub-options.
Definition CodeGenOptions.h:60
ComplexRangeKind
Controls the various implementations for complex division.
Definition CodeGenOptions.h:208
std::string DwarfDebugFlags
Definition CodeGenOptions.h:79
llvm::codegenoptions::DebugInfoKind DebugInfo
Debug info generation.
Definition CrossToolHelpers.h:121
bool NoSignedZerosFPMath
Set no-signed-zeros-fp-math attribute for functions.
Definition CrossToolHelpers.h:130
std::string DwarfDebugFlags
Debug flags to append to DWARF producer.
Definition CrossToolHelpers.h:152
bool LoopVersioning
Run the version loop pass.
Definition CrossToolHelpers.h:119
unsigned VScaleMin
SVE vector range minimum.
Definition CrossToolHelpers.h:125
std::string Reciprocals
Definition CrossToolHelpers.h:133
llvm::FramePointerKind FramePointerKind
Add frame pointer to functions.
Definition CrossToolHelpers.h:123
bool NoNaNsFPMath
Set no-nans-fp-math attribute for functions.
Definition CrossToolHelpers.h:128
std::string SplitDwarfFile
File name for the split debug info.
Definition CrossToolHelpers.h:151
bool Underscoring
add underscores to function names.
Definition CrossToolHelpers.h:118
std::string PreferVectorWidth
Definition CrossToolHelpers.h:135
bool ApproxFuncFPMath
Set afn flag for instructions.
Definition CrossToolHelpers.h:129
unsigned VScaleMax
SVE vector range maximum.
Definition CrossToolHelpers.h:126
bool NoInfsFPMath
Set ninf flag for instructions.
Definition CrossToolHelpers.h:127
llvm::OptimizationLevel OptLevel
optimisation level
Definition CrossToolHelpers.h:116
bool EnableOpenMPSimd
Enable OpenMP simd-only mode.
Definition CrossToolHelpers.h:139
bool NSWOnLoopVarInc
Add nsw flag to loop variable increments.
Definition CrossToolHelpers.h:137
bool AliasAnalysis
Add TBAA tags to generated LLVMIR.
Definition CrossToolHelpers.h:120
Fortran::frontend::CodeGenOptions::ComplexRangeKind ComplexRange
Method for calculating complex number division.
Definition CrossToolHelpers.h:147
bool SkipConvertComplexPow
Do not run complex pow conversion.
Definition CrossToolHelpers.h:140
bool UnsafeFPMath
Set all fast-math flags for instructions.
Definition CrossToolHelpers.h:132
std::string InstrumentFunctionEntry
Definition CrossToolHelpers.h:141
bool StackArrays
convert memory allocations to alloca.
Definition CrossToolHelpers.h:117
int32_t DwarfVersion
Version of DWARF debug info to generate.
Definition CrossToolHelpers.h:150
bool EnableOpenMP
Enable OpenMP lowering.
Definition CrossToolHelpers.h:138
std::string InstrumentFunctionExit
Definition CrossToolHelpers.h:144
Definition CrossToolHelpers.h:155