aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Lower/ComponentPath.cpp
blob: d20ea231531026bcbf9b19aba56182fcce94ed0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//===-- ComponentPath.cpp -------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "flang/Lower/ComponentPath.h"

static std::function<
    Fortran::lower::IterationSpace(const Fortran::lower::IterationSpace &)>
getIdentityFunc() {
  return [](const Fortran::lower::IterationSpace &s) { return s; };
}

static std::function<
    Fortran::lower::IterationSpace(const Fortran::lower::IterationSpace &)>
getNullaryFunc() {
  return [](const Fortran::lower::IterationSpace &s) {
    Fortran::lower::IterationSpace newIters(s);
    newIters.clearIndices();
    return newIters;
  };
}

void Fortran::lower::ComponentPath::clear() {
  reversePath.clear();
  substring = nullptr;
  applied = false;
  prefixComponents.clear();
  trips.clear();
  suffixComponents.clear();
  pc = getIdentityFunc();
}

bool Fortran::lower::isRankedArrayAccess(const Fortran::evaluate::ArrayRef &x) {
  for (const Fortran::evaluate::Subscript &sub : x.subscript()) {
    if (std::visit(
            Fortran::common::visitors{
                [&](const Fortran::evaluate::Triplet &) { return true; },
                [&](const Fortran::evaluate::IndirectSubscriptIntegerExpr &e) {
                  return e.value().Rank() > 0;
                }},
            sub.u))
      return true;
  }
  return false;
}

void Fortran::lower::ComponentPath::resetPC() { pc = getIdentityFunc(); }

void Fortran::lower::ComponentPath::setPC(bool isImplicit) {
  pc = isImplicit ? getIdentityFunc() : getNullaryFunc();
  resetExtendCoorRef();
}

Fortran::lower::ComponentPath::ExtendRefFunc
Fortran::lower::ComponentPath::getExtendCoorRef() const {
  return hasExtendCoorRef() ? *extendCoorRef : [](mlir::Value v) { return v; };
}