9#ifndef FORTRAN_OPTIMIZER_DIALECT_FIROPSSUPPORT_H
10#define FORTRAN_OPTIMIZER_DIALECT_FIROPSSUPPORT_H
12#include "flang/Optimizer/Dialect/FIROps.h"
13#include "mlir/Dialect/Func/IR/FuncOps.h"
14#include "mlir/IR/BuiltinOps.h"
15#include "llvm/ADT/APInt.h"
28 mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
30 for (mlir::Type t : type) {
32 effects.emplace_back(mlir::MemoryEffects::Read::get(),
33 fir::VolatileMemoryResource::get());
34 effects.emplace_back(mlir::MemoryEffects::Write::get(),
35 fir::VolatileMemoryResource::get());
43 return mlir::isa<fir::CallOp>(op) || mlir::isa<fir::DispatchOp>(op) ||
44 mlir::isa<mlir::func::CallOp>(op) ||
45 mlir::isa<mlir::func::CallIndirectOp>(op);
54 return op &&
isaCall(op) && !op->getAttr(
"pure");
63 return op &&
isaCall(op) && op->getAttr(
"pure");
71mlir::func::FuncOp
createFuncOp(mlir::Location loc, mlir::ModuleOp module,
72 llvm::StringRef name, mlir::FunctionType type,
74 const mlir::SymbolTable *symbolTable =
nullptr);
78fir::GlobalOp
createGlobalOp(mlir::Location loc, mlir::ModuleOp module,
79 llvm::StringRef name, mlir::Type type,
80 llvm::ArrayRef<mlir::NamedAttribute> attrs = {},
81 const mlir::SymbolTable *symbolTable =
nullptr);
90static constexpr llvm::StringRef getTargetAttrName() {
return "fir.target"; }
93static constexpr llvm::StringRef getAsynchronousAttrName() {
94 return "fir.asynchronous";
98static constexpr llvm::StringRef getVolatileAttrName() {
99 return "fir.volatile";
108static constexpr llvm::StringRef getReadOnlyAttrName() {
109 return "fir.read_only";
116static constexpr llvm::StringRef getFortranAttrsAttrName() {
117 return "fir.fortran_attrs";
122static constexpr llvm::StringRef getCharacterProcedureDummyAttrName() {
123 return "fir.char_proc";
127static constexpr llvm::StringRef getSymbolAttrName() {
128 return "fir.bindc_name";
132static constexpr llvm::StringRef getHostAssocAttrName() {
133 return "fir.host_assoc";
137static constexpr llvm::StringRef getHostSymbolAttrName() {
138 return "fir.host_symbol";
145static constexpr llvm::StringRef getDefiningSubmoduleAttrName() {
146 return "fir.defining_submodule";
151static constexpr llvm::StringRef getInternalFuncNameAttrName() {
152 return "fir.internal_name";
157static constexpr llvm::StringRef getHasLifetimeMarkerAttrName() {
158 return "fir.has_lifetime";
162static constexpr llvm::StringRef getAccessGroupsAttrName() {
163 return "access_groups";
170static constexpr llvm::StringRef getUniqNameAttrName() {
return "uniq_name"; }
183 return func->hasAttr(fir::getHostSymbolAttrName());
217static constexpr llvm::StringRef getAdaptToByRefAttrName() {
218 return "adapt.valuebyref";
221static constexpr llvm::StringRef getFuncPureAttrName() {
222 return "fir.func_pure";
225static constexpr llvm::StringRef getFuncElementalAttrName() {
226 return "fir.func_elemental";
229static constexpr llvm::StringRef getFuncRecursiveAttrName() {
230 return "fir.func_recursive";
233static constexpr llvm::StringRef getFortranProcedureFlagsAttrName() {
234 return "fir.proc_attrs";
242template <
typename Builder>
243inline mlir::NamedAttribute getAdaptToByRefAttr(Builder &builder) {
244 return {mlir::StringAttr::get(builder.getContext(),
245 fir::getAdaptToByRefAttrName()),
246 builder.getUnitAttr()};
249bool isDummyArgument(mlir::Value v);
258inline std::optional<FortranDummyIntent>
260 if (!callee || argIdx >= callee.getNumArguments())
262 auto attrs = callee.getArgAttrOfType<FortranVariableFlagsAttr>(
263 argIdx, getFortranAttrsAttrName());
266 switch (attrs.getFlags()) {
267 case FortranVariableFlagsEnum::intent_in:
268 return FortranDummyIntent::In;
269 case FortranVariableFlagsEnum::intent_out:
270 return FortranDummyIntent::Out;
271 case FortranVariableFlagsEnum::intent_inout:
272 return FortranDummyIntent::InOut;
278template <fir::FortranProcedureFlagsEnum Flag>
279inline bool hasProcedureAttr(fir::FortranProcedureFlagsEnumAttr flags) {
280 return flags && bitEnumContainsAny(flags.getValue(), Flag);
283template <fir::FortranProcedureFlagsEnum Flag>
284inline bool hasProcedureAttr(mlir::Operation *op) {
285 if (
auto firCallOp = mlir::dyn_cast<fir::CallOp>(op))
286 return hasProcedureAttr<Flag>(firCallOp.getProcedureAttrsAttr());
287 if (
auto firCallOp = mlir::dyn_cast<fir::DispatchOp>(op))
288 return hasProcedureAttr<Flag>(firCallOp.getProcedureAttrsAttr());
289 return hasProcedureAttr<Flag>(
290 op->getAttrOfType<fir::FortranProcedureFlagsEnumAttr>(
291 getFortranProcedureFlagsAttrName()));
294inline bool hasBindcAttr(mlir::Operation *op) {
295 return hasProcedureAttr<fir::FortranProcedureFlagsEnum::bind_c>(op);
301 const mlir::DataLayout &dl,
302 const fir::KindMapping &kindMap);
313 bool mayHaveNonDefaultLowerBounds =
true,
314 bool checkWhole =
true);
Definition AbstractConverter.h:37
constexpr llvm::StringRef getCorankAttrName()
Attribute to mark coarray Fortran entities with the CORANK attribute.
Definition FIROpsSupport.h:173
bool isContiguousEmbox(fir::EmboxOp embox, bool checkWhole=true)
Definition FIROps.cpp:2857
bool anyFuncArgsHaveAttr(mlir::func::FuncOp func, llvm::StringRef attr)
Definition FIROps.cpp:6162
bool isa_volatile_type(mlir::Type t)
Definition FIRType.cpp:768
constexpr llvm::StringRef getContiguousAttrName()
Attribute to mark Fortran entities with the CONTIGUOUS attribute.
Definition FIROpsSupport.h:84
bool reboxPreservesContinuity(fir::ReboxOp rebox, bool mayHaveNonDefaultLowerBounds=true, bool checkWhole=true)
Definition FIROps.cpp:6234
fir::GlobalOp createGlobalOp(mlir::Location loc, mlir::ModuleOp module, llvm::StringRef name, mlir::Type type, llvm::ArrayRef< mlir::NamedAttribute > attrs={}, const mlir::SymbolTable *symbolTable=nullptr)
Definition FIROps.cpp:6026
bool hasHostAssociationArgument(mlir::func::FuncOp func)
Definition FIROps.cpp:6046
std::optional< int64_t > getAllocaByteSize(fir::AllocaOp alloca, const mlir::DataLayout &dl, const fir::KindMapping &kindMap)
Definition FIROps.cpp:6251
bool isInternalProcedure(mlir::func::FuncOp func)
Definition FIROpsSupport.h:182
std::optional< llvm::APInt > getIntIfConstant(mlir::Value value)
Unwrap an integer constant from an mlir::Value as an APInt.
Definition FIROps.cpp:6169
constexpr llvm::StringRef getOptionalAttrName()
Attribute to mark Fortran entities with the OPTIONAL attribute.
Definition FIROpsSupport.h:87
bool pureCall(mlir::Operation *op)
Definition FIROpsSupport.h:60
void addVolatileMemoryEffects(mlir::TypeRange type, llvm::SmallVectorImpl< mlir::SideEffects::EffectInstance< mlir::MemoryEffects::Effect > > &effects)
Definition FIROpsSupport.h:25
bool isInOffloadRegion(mlir::Operation *op)
Definition FIROps.cpp:7053
bool valueHasFirAttribute(mlir::Value value, llvm::StringRef attributeName)
Definition FIROps.cpp:6155
bool valueMayHaveFirAttributes(mlir::Value value, llvm::ArrayRef< llvm::StringRef > attributeNames)
Definition FIROps.cpp:6148
bool impureCall(mlir::Operation *op)
Definition FIROpsSupport.h:51
bool isaCall(mlir::Operation *op)
Return true iff the Operation is a call.
Definition FIROpsSupport.h:42
FortranDummyIntent
Intent of function argument argIdx.
Definition FIROpsSupport.h:252
std::optional< FortranDummyIntent > getFortranDummyIntent(mlir::func::FuncOp callee, unsigned argIdx)
Definition FIROpsSupport.h:259
mlir::func::FuncOp createFuncOp(mlir::Location loc, mlir::ModuleOp module, llvm::StringRef name, mlir::FunctionType type, llvm::ArrayRef< mlir::NamedAttribute > attrs={}, const mlir::SymbolTable *symbolTable=nullptr)
Definition FIROps.cpp:6004