9#ifndef FORTRAN_OPTIMIZER_DIALECT_FIROPS_H
10#define FORTRAN_OPTIMIZER_DIALECT_FIROPS_H
12#include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h"
13#include "flang/Optimizer/Dialect/FIRAttr.h"
14#include "flang/Optimizer/Dialect/FIRType.h"
15#include "flang/Optimizer/Dialect/FirAliasTagOpInterface.h"
16#include "flang/Optimizer/Dialect/FortranVariableInterface.h"
17#include "flang/Optimizer/Dialect/SafeTempArrayCopyAttrInterface.h"
18#include "mlir/Dialect/Arith/IR/Arith.h"
19#include "mlir/Dialect/Func/IR/FuncOps.h"
20#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
21#include "mlir/Interfaces/LoopLikeInterface.h"
22#include "mlir/Interfaces/SideEffectInterfaces.h"
23#include "mlir/Interfaces/ViewLikeInterface.h"
31void buildCmpCOp(mlir::OpBuilder &builder, mlir::OperationState &result,
32 mlir::arith::CmpFPredicate predicate, mlir::Value lhs,
34unsigned getCaseArgumentOffset(llvm::ArrayRef<mlir::Attribute> cases,
36DoLoopOp getForInductionVarOwner(mlir::Value val);
37mlir::ParseResult isValidCaseAttr(mlir::Attribute attr);
38mlir::ParseResult parseCmpcOp(mlir::OpAsmParser &parser,
39 mlir::OperationState &result);
40mlir::ParseResult parseSelector(mlir::OpAsmParser &parser,
41 mlir::OperationState &result,
42 mlir::OpAsmParser::UnresolvedOperand &selector,
44bool useStrictVolatileVerification();
46static constexpr llvm::StringRef getNormalizedLowerBoundAttrName() {
47 return "normalized.lb";
52 :
public mlir::SideEffects::Resource::Base<DebuggingResource> {
53 mlir::StringRef getName()
const final {
return "DebuggingResource"; }
54 bool isAddressable()
const override {
return false; }
59 :
public mlir::SideEffects::Resource::Base<VolatileMemoryResource> {
60 mlir::StringRef getName()
const final {
return "VolatileMemoryResource"; }
61 bool isAddressable()
const override {
return false; }
65using IntOrValue = llvm::PointerUnion<mlir::IntegerAttr, mlir::Value>;
70#include "flang/Optimizer/Dialect/FIROps.h.inc"
73class CoordinateIndicesAdaptor {
75 using value_type = IntOrValue;
77 CoordinateIndicesAdaptor(mlir::DenseI32ArrayAttr fieldIndices,
78 mlir::ValueRange values)
79 : fieldIndices(fieldIndices), values(values) {}
81 value_type operator[](
size_t index)
const {
82 assert(index < size() &&
"index out of bounds");
83 return *std::next(begin(), index);
87 return fieldIndices ? fieldIndices.size() : values.size();
91 return values.empty() && (!fieldIndices || fieldIndices.empty());
95 :
public llvm::iterator_facade_base<iterator, std::forward_iterator_tag,
96 value_type, std::ptrdiff_t,
97 value_type *, value_type> {
99 iterator(
const CoordinateIndicesAdaptor *base,
101 llvm::detail::IterOfRange<const mlir::ValueRange> valuesIter)
102 : base(base), fieldIter(fieldIter), valuesIter(valuesIter) {}
104 value_type operator*()
const {
105 if (fieldIter && **fieldIter != fir::CoordinateOp::kDynamicIndex) {
106 return mlir::IntegerAttr::get(base->fieldIndices.getElementType(),
112 iterator &operator++() {
114 if (**fieldIter == fir::CoordinateOp::kDynamicIndex)
123 bool operator==(
const iterator &rhs)
const {
124 return base == rhs.base && fieldIter == rhs.fieldIter &&
125 valuesIter == rhs.valuesIter;
129 const CoordinateIndicesAdaptor *base;
130 std::optional<llvm::ArrayRef<int32_t>::const_iterator> fieldIter;
131 llvm::detail::IterOfRange<const mlir::ValueRange> valuesIter;
135 std::optional<llvm::ArrayRef<int32_t>::const_iterator> fieldIter;
137 fieldIter = fieldIndices.asArrayRef().begin();
138 return iterator(
this, fieldIter, values.begin());
141 iterator end()
const {
142 std::optional<llvm::ArrayRef<int32_t>::const_iterator> fieldIter;
144 fieldIter = fieldIndices.asArrayRef().end();
145 return iterator(
this, fieldIter, values.end());
149 mlir::DenseI32ArrayAttr fieldIndices;
150 mlir::ValueRange values;
Definition AbstractConverter.h:37
bool mayBeAbsentBox(mlir::Value val)
Definition FIROps.cpp:177
Model operations which affect global debugging information.
Definition FIROps.h:52
Model operations which read from/write to volatile memory.
Definition FIROps.h:59