xref: /llvm-project/flang/lib/Lower/ComponentPath.cpp (revision 77d8cfb3c50e3341d65af1f9e442004bbd77af9b)
1f9704f0cSValentin Clement //===-- ComponentPath.cpp -------------------------------------------------===//
2f9704f0cSValentin Clement //
3f9704f0cSValentin Clement // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f9704f0cSValentin Clement // See https://llvm.org/LICENSE.txt for license information.
5f9704f0cSValentin Clement // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f9704f0cSValentin Clement //
7f9704f0cSValentin Clement //===----------------------------------------------------------------------===//
8f9704f0cSValentin Clement 
9f9704f0cSValentin Clement #include "flang/Lower/ComponentPath.h"
10f9704f0cSValentin Clement 
11f9704f0cSValentin Clement static std::function<
12f9704f0cSValentin Clement     Fortran::lower::IterationSpace(const Fortran::lower::IterationSpace &)>
getIdentityFunc()13f9704f0cSValentin Clement getIdentityFunc() {
14f9704f0cSValentin Clement   return [](const Fortran::lower::IterationSpace &s) { return s; };
15f9704f0cSValentin Clement }
16f9704f0cSValentin Clement 
17f9704f0cSValentin Clement static std::function<
18f9704f0cSValentin Clement     Fortran::lower::IterationSpace(const Fortran::lower::IterationSpace &)>
getNullaryFunc()19f9704f0cSValentin Clement getNullaryFunc() {
20f9704f0cSValentin Clement   return [](const Fortran::lower::IterationSpace &s) {
21f9704f0cSValentin Clement     Fortran::lower::IterationSpace newIters(s);
22f9704f0cSValentin Clement     newIters.clearIndices();
23f9704f0cSValentin Clement     return newIters;
24f9704f0cSValentin Clement   };
25f9704f0cSValentin Clement }
26f9704f0cSValentin Clement 
clear()27f9704f0cSValentin Clement void Fortran::lower::ComponentPath::clear() {
28f9704f0cSValentin Clement   reversePath.clear();
29f9704f0cSValentin Clement   substring = nullptr;
30f9704f0cSValentin Clement   applied = false;
31f9704f0cSValentin Clement   prefixComponents.clear();
32f9704f0cSValentin Clement   trips.clear();
33f9704f0cSValentin Clement   suffixComponents.clear();
34f9704f0cSValentin Clement   pc = getIdentityFunc();
35f9704f0cSValentin Clement }
36f9704f0cSValentin Clement 
isRankedArrayAccess(const Fortran::evaluate::ArrayRef & x)37f9704f0cSValentin Clement bool Fortran::lower::isRankedArrayAccess(const Fortran::evaluate::ArrayRef &x) {
38f9704f0cSValentin Clement   for (const Fortran::evaluate::Subscript &sub : x.subscript()) {
39*77d8cfb3SAlexander Shaposhnikov     if (Fortran::common::visit(
40f9704f0cSValentin Clement             Fortran::common::visitors{
41f9704f0cSValentin Clement                 [&](const Fortran::evaluate::Triplet &) { return true; },
42f9704f0cSValentin Clement                 [&](const Fortran::evaluate::IndirectSubscriptIntegerExpr &e) {
43f9704f0cSValentin Clement                   return e.value().Rank() > 0;
44f9704f0cSValentin Clement                 }},
45f9704f0cSValentin Clement             sub.u))
46f9704f0cSValentin Clement       return true;
47f9704f0cSValentin Clement   }
48f9704f0cSValentin Clement   return false;
49f9704f0cSValentin Clement }
50f9704f0cSValentin Clement 
resetPC()511bffc753SEric Schweitz void Fortran::lower::ComponentPath::resetPC() { pc = getIdentityFunc(); }
521bffc753SEric Schweitz 
setPC(bool isImplicit)53f9704f0cSValentin Clement void Fortran::lower::ComponentPath::setPC(bool isImplicit) {
54f9704f0cSValentin Clement   pc = isImplicit ? getIdentityFunc() : getNullaryFunc();
551bffc753SEric Schweitz   resetExtendCoorRef();
561bffc753SEric Schweitz }
571bffc753SEric Schweitz 
581bffc753SEric Schweitz Fortran::lower::ComponentPath::ExtendRefFunc
getExtendCoorRef() const591bffc753SEric Schweitz Fortran::lower::ComponentPath::getExtendCoorRef() const {
60ed8fceaaSKazu Hirata   return hasExtendCoorRef() ? *extendCoorRef : [](mlir::Value v) { return v; };
61f9704f0cSValentin Clement }
62