13#ifndef FORTRAN_SEMANTICS_OPENMP_UTILS_H
14#define FORTRAN_SEMANTICS_OPENMP_UTILS_H
16#include "flang/Common/indirection.h"
17#include "flang/Evaluate/type.h"
18#include "flang/Parser/char-block.h"
19#include "flang/Parser/message.h"
20#include "flang/Parser/openmp-utils.h"
21#include "flang/Parser/parse-tree.h"
22#include "flang/Parser/tools.h"
23#include "flang/Semantics/tools.h"
25#include "llvm/ADT/ArrayRef.h"
34namespace Fortran::semantics {
41using Fortran::parser::omp::BlockRange;
42using Fortran::parser::omp::ExecutionPartIterator;
43using Fortran::parser::omp::is_range_v;
44using Fortran::parser::omp::LoopNestIterator;
45using Fortran::parser::omp::LoopRange;
47template <
typename T,
typename U = std::remove_const_t<T>> U AsRvalue(T &t) {
51template <
typename T> T &&AsRvalue(T &&t) {
return std::move(t); }
53const Scope &GetScopingUnit(
const Scope &scope);
54const Scope &GetProgramUnit(
const Scope &scope);
63 operator bool()
const {
return stmt !=
nullptr; }
69std::string ThisVersion(
unsigned version);
70std::string TryVersion(
unsigned version);
77std::optional<parser::CharBlock> GetObjectSource(
82bool IsCommonBlock(
const Symbol &sym);
83bool IsExtendedListItem(
const Symbol &sym);
84bool IsVariableListItem(
const Symbol &sym);
85bool IsTypeParamInquiry(
const Symbol &sym);
86bool IsStructureComponent(
const Symbol &sym);
87bool IsPrivatizable(
const Symbol &sym);
88bool IsVarOrFunctionRef(
const MaybeExpr &expr);
92bool IsMapEnteringType(parser::OmpMapType::Value type);
93bool IsMapExitingType(parser::OmpMapType::Value type);
95MaybeExpr GetEvaluateExpr(
const parser::Expr &parserExpr);
96template <
typename T> MaybeExpr GetEvaluateExpr(
const T &inp) {
97 return GetEvaluateExpr(parser::UnwrapRef<parser::Expr>(inp));
100std::optional<evaluate::DynamicType> GetDynamicType(
103std::optional<bool> GetLogicalValue(
const SomeExpr &expr);
105std::optional<bool> IsContiguous(
108std::vector<SomeExpr> GetTopLevelDesignators(
const SomeExpr &expr);
109const SomeExpr *HasStorageOverlap(
119 Reason(Reason &&) =
default;
120 Reason(
const Reason &);
121 Reason &operator=(Reason &&) =
default;
122 Reason &operator=(
const Reason &);
126 template <
typename... Ts> Reason &Say(Ts &&...args) {
127 msgs.Say(std::forward<Ts>(args)...);
131 Reason &Append(
const Reason &other) {
135 operator bool()
const {
return !msgs.empty(); }
138 void CopyFrom(
const Reason &other);
143template <
typename T>
struct WithReason {
144 std::optional<T> value;
147 WithReason() =
default;
148 WithReason(std::optional<T> v,
const Reason &r =
Reason())
149 : value(v), reason(r) {}
150 operator bool()
const {
return value.has_value(); }
160bool IsLoopTransforming(llvm::omp::Directive dir);
165std::pair<WithReason<int64_t>,
bool> GetAffectedNestDepthWithReason(
175std::optional<int64_t> GetRequiredCount(
176 std::optional<int64_t> first, std::optional<int64_t> count);
177std::optional<int64_t> GetRequiredCount(
178 std::optional<std::pair<int64_t, int64_t>> range);
182 bool allowAllLoops =
false);
184 template <
typename R,
typename = std::enable_if_t<is_range_v<R>>>
185 LoopSequence(
const R &range,
unsigned version,
bool allowAllLoops =
false)
186 : version_(version), allowAllLoops_(allowAllLoops) {
187 entry_ = std::make_unique<Construct>(range,
nullptr);
188 createChildrenFromRange(entry_->location);
201 bool isNest()
const {
return length_.value == 1; }
203 const Depth &depth()
const {
return depth_; }
204 const std::vector<LoopSequence> &children()
const {
return children_; }
206 WithReason<bool> isWellFormedSequence()
const;
207 WithReason<bool> isWellFormedNest()
const;
210 using Construct = ExecutionPartIterator::Construct;
213 std::unique_ptr<Construct> entry,
unsigned version,
bool allowAllLoops);
215 template <
typename R,
typename = std::enable_if_t<is_range_v<R>>>
216 void createChildrenFromRange(
const R &range) {
217 createChildrenFromRange(range.begin(), range.end());
220 std::unique_ptr<Construct> createConstructEntry(
221 const parser::ExecutionPartConstruct &code);
223 void createChildrenFromRange(
224 ExecutionPartIterator::IteratorType begin,
225 ExecutionPartIterator::IteratorType end);
230 WithReason<int64_t> calculateLength()
const;
231 WithReason<int64_t> getNestedLength()
const;
232 Depth calculateDepths()
const;
233 Depth getNestedDepths()
const;
238 const parser::ExecutionPartConstruct *invalidIC_{
nullptr};
242 const parser::ExecutionPartConstruct *opaqueIC_{
nullptr};
248 WithReason<int64_t> length_;
255 std::unique_ptr<Construct> entry_;
256 std::vector<LoopSequence> children_;
Definition expression.h:878
Definition char-block.h:28
Definition semantics.h:67
Definition parse-tree.h:496
Definition parse-tree.h:1884
Definition parse-tree.h:1794
Definition parse-tree.h:1833
Definition parse-tree.h:554
Definition parse-tree.h:1682
Definition parse-tree.h:5036
Definition parse-tree.h:3513
Definition parse-tree.h:3538
Definition parse-tree.h:5412
Definition parse-tree.h:3644
Definition openmp-utils.h:192
A representation of a "because" message.
Definition openmp-utils.h:117
Definition openmp-utils.h:59
Definition openmp-utils.h:143