13#ifndef FORTRAN_LOWER_SUPPORT_UTILS_H
14#define FORTRAN_LOWER_SUPPORT_UTILS_H
16#include "flang/Common/indirection.h"
17#include "flang/Parser/char-block.h"
18#include "flang/Semantics/tools.h"
19#include "mlir/Dialect/Arith/IR/Arith.h"
20#include "mlir/Dialect/Func/IR/FuncOps.h"
21#include "mlir/IR/BuiltinAttributes.h"
22#include "llvm/ADT/SmallSet.h"
23#include "llvm/ADT/StringRef.h"
31using SomeExpr = Fortran::evaluate::Expr<Fortran::evaluate::SomeType>;
32using ExplicitSpaceArrayBases =
33 std::variant<
const semantics::Symbol *,
const evaluate::Component *,
34 const evaluate::ArrayRef *>;
50 return {cb.begin(), cb.size()};
55const A &removeIndirection(
const A &a) {
65static Fortran::lower::SomeExpr toEvExpr(
const A &x) {
66 return Fortran::evaluate::AsGenericExpr(Fortran::common::Clone(x));
69template <Fortran::common::TypeCategory FROM>
70static Fortran::lower::SomeExpr ignoreEvConvert(
74 return toEvExpr(x.left());
77static Fortran::lower::SomeExpr ignoreEvConvert(
const A &x) {
84inline Fortran::lower::SomeExpr
86 Fortran::common::TypeCategory::Integer, 8>> &x) {
87 return Fortran::common::visit(
88 [](
const auto &v) {
return ignoreEvConvert(v); }, x.u);
94A flatZip(
const A &container1,
const A &container2) {
95 assert(container1.size() == container2.size());
97 for (
auto [e1, e2] : llvm::zip(container1, container2)) {
98 result.emplace_back(e1);
99 result.emplace_back(e2);
105unsigned getHashValue(
const Fortran::lower::SomeExpr *x);
106unsigned getHashValue(
const Fortran::lower::ExplicitSpaceArrayBases &x);
107unsigned getHashValue(
const Fortran::evaluate::Component *x);
109bool isEqual(
const Fortran::lower::SomeExpr *x,
110 const Fortran::lower::SomeExpr *y);
111bool isEqual(
const Fortran::lower::ExplicitSpaceArrayBases &x,
112 const Fortran::lower::ExplicitSpaceArrayBases &y);
113bool isEqual(
const Fortran::evaluate::Component *x,
114 const Fortran::evaluate::Component *y);
116template <
typename OpType,
typename OperandsStructType>
118 lower::AbstractConverter &converter, fir::FirOpBuilder &firOpBuilder,
119 lower::SymMap &symTable,
120 llvm::SetVector<const semantics::Symbol *> &allPrivatizedSymbols,
121 llvm::SmallPtrSet<const semantics::Symbol *, 16> &mightHaveReadHostSym,
122 const semantics::Symbol *symToPrivatize, OperandsStructType *clauseOps,
123 std::optional<llvm::omp::Directive> dir = std::nullopt);
130struct DenseMapInfo<const
Fortran::lower::SomeExpr *> {
131 static inline const Fortran::lower::SomeExpr *getEmptyKey() {
132 return reinterpret_cast<Fortran::lower::SomeExpr *
>(~0);
134 static inline const Fortran::lower::SomeExpr *getTombstoneKey() {
135 return reinterpret_cast<Fortran::lower::SomeExpr *
>(~0 - 1);
137 static unsigned getHashValue(
const Fortran::lower::SomeExpr *v) {
138 return Fortran::lower::getHashValue(v);
140 static bool isEqual(
const Fortran::lower::SomeExpr *lhs,
141 const Fortran::lower::SomeExpr *rhs) {
142 return Fortran::lower::isEqual(lhs, rhs);
156 return Fortran::lower::getHashValue(v);
160 return Fortran::lower::isEqual(lhs, rhs);
Definition indirection.h:31
Definition variable.h:205
Definition AbstractConverter.h:87
Definition SymbolMap.h:182
Definition char-block.h:28
Definition FIRBuilder.h:55
Definition ParserActions.h:24
Definition bit-population-count.h:20
Definition AbstractConverter.h:37
Definition expression.h:211