FLANG
FIROps.h
1//===-- Optimizer/Dialect/FIROps.h - FIR operations -------------*- 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
9#ifndef FORTRAN_OPTIMIZER_DIALECT_FIROPS_H
10#define FORTRAN_OPTIMIZER_DIALECT_FIROPS_H
11
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
24namespace fir {
25
26class FirEndOp;
27class DoLoopOp;
28class RealAttr;
29
30void buildCmpCOp(mlir::OpBuilder &builder, mlir::OperationState &result,
31 mlir::arith::CmpFPredicate predicate, mlir::Value lhs,
32 mlir::Value rhs);
33unsigned getCaseArgumentOffset(llvm::ArrayRef<mlir::Attribute> cases,
34 unsigned dest);
35DoLoopOp getForInductionVarOwner(mlir::Value val);
36mlir::ParseResult isValidCaseAttr(mlir::Attribute attr);
37mlir::ParseResult parseCmpcOp(mlir::OpAsmParser &parser,
38 mlir::OperationState &result);
39mlir::ParseResult parseSelector(mlir::OpAsmParser &parser,
40 mlir::OperationState &result,
41 mlir::OpAsmParser::UnresolvedOperand &selector,
42 mlir::Type &type);
43bool useStrictVolatileVerification();
44
45static constexpr llvm::StringRef getNormalizedLowerBoundAttrName() {
46 return "normalized.lb";
47}
48
51 : public mlir::SideEffects::Resource::Base<DebuggingResource> {
52 mlir::StringRef getName() final { return "DebuggingResource"; }
53};
54
57 : public mlir::SideEffects::Resource::Base<VolatileMemoryResource> {
58 mlir::StringRef getName() final { return "VolatileMemoryResource"; }
59};
60
62using IntOrValue = llvm::PointerUnion<mlir::IntegerAttr, mlir::Value>;
63
64} // namespace fir
65
66#define GET_OP_CLASSES
67#include "flang/Optimizer/Dialect/FIROps.h.inc"
68
69namespace fir {
70class CoordinateIndicesAdaptor {
71public:
72 using value_type = IntOrValue;
73
74 CoordinateIndicesAdaptor(mlir::DenseI32ArrayAttr fieldIndices,
75 mlir::ValueRange values)
76 : fieldIndices(fieldIndices), values(values) {}
77
78 value_type operator[](size_t index) const {
79 assert(index < size() && "index out of bounds");
80 return *std::next(begin(), index);
81 }
82
83 size_t size() const {
84 return fieldIndices ? fieldIndices.size() : values.size();
85 }
86
87 bool empty() const {
88 return values.empty() && (!fieldIndices || fieldIndices.empty());
89 }
90
91 class iterator
92 : public llvm::iterator_facade_base<iterator, std::forward_iterator_tag,
93 value_type, std::ptrdiff_t,
94 value_type *, value_type> {
95 public:
96 iterator(const CoordinateIndicesAdaptor *base,
97 std::optional<llvm::ArrayRef<int32_t>::iterator> fieldIter,
98 llvm::detail::IterOfRange<const mlir::ValueRange> valuesIter)
99 : base(base), fieldIter(fieldIter), valuesIter(valuesIter) {}
100
101 value_type operator*() const {
102 if (fieldIter && **fieldIter != fir::CoordinateOp::kDynamicIndex) {
103 return mlir::IntegerAttr::get(base->fieldIndices.getElementType(),
104 **fieldIter);
105 }
106 return *valuesIter;
107 }
108
109 iterator &operator++() {
110 if (fieldIter) {
111 if (**fieldIter == fir::CoordinateOp::kDynamicIndex)
112 valuesIter++;
113 (*fieldIter)++;
114 } else {
115 valuesIter++;
116 }
117 return *this;
118 }
119
120 bool operator==(const iterator &rhs) const {
121 return base == rhs.base && fieldIter == rhs.fieldIter &&
122 valuesIter == rhs.valuesIter;
123 }
124
125 private:
126 const CoordinateIndicesAdaptor *base;
127 std::optional<llvm::ArrayRef<int32_t>::const_iterator> fieldIter;
128 llvm::detail::IterOfRange<const mlir::ValueRange> valuesIter;
129 };
130
131 iterator begin() const {
132 std::optional<llvm::ArrayRef<int32_t>::const_iterator> fieldIter;
133 if (fieldIndices)
134 fieldIter = fieldIndices.asArrayRef().begin();
135 return iterator(this, fieldIter, values.begin());
136 }
137
138 iterator end() const {
139 std::optional<llvm::ArrayRef<int32_t>::const_iterator> fieldIter;
140 if (fieldIndices)
141 fieldIter = fieldIndices.asArrayRef().end();
142 return iterator(this, fieldIter, values.end());
143 }
144
145private:
146 mlir::DenseI32ArrayAttr fieldIndices;
147 mlir::ValueRange values;
148};
149
154} // namespace fir
155
156#endif // FORTRAN_OPTIMIZER_DIALECT_FIROPS_H
Definition FIROps.h:70
Definition FIRAttr.h:140
Definition FIRType.h:89
Definition OpenACC.h:20
Definition AbstractConverter.h:34
Model operations which affect global debugging information.
Definition FIROps.h:51
Definition FIROps.h:150
Model operations which read from/write to volatile memory.
Definition FIROps.h:57