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 ClementgetIdentityFunc() { 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 ClementgetNullaryFunc() { 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 Clementvoid 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 Clementbool 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 Schweitzvoid Fortran::lower::ComponentPath::resetPC() { pc = getIdentityFunc(); } 521bffc753SEric Schweitz setPC(bool isImplicit)53f9704f0cSValentin Clementvoid 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 SchweitzFortran::lower::ComponentPath::getExtendCoorRef() const { 60ed8fceaaSKazu Hirata return hasExtendCoorRef() ? *extendCoorRef : [](mlir::Value v) { return v; }; 61f9704f0cSValentin Clement } 62