llvm-project/flang/lib/Lower/ComponentPath.cpp
Valentin Clement f9704f0cfb
[flang] Simple array assignment lowering
This patch handles lowering of simple array assignment.

```
a(:) = 10
```

or

```
a(1) = 1
```

This patch is part of the upstreaming effort from fir-dev branch.

Reviewed By: PeteSteinfeld, schweitz

Differential Revision: https://reviews.llvm.org/D120501

Co-authored-by: Jean Perier <jperier@nvidia.com>
Co-authored-by: V Donaldson <vdonaldson@nvidia.com>
Co-authored-by: Eric Schweitz <eschweitz@nvidia.com>
2022-02-24 21:23:30 +01:00

54 lines
1.7 KiB
C++

//===-- 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::setPC(bool isImplicit) {
pc = isImplicit ? getIdentityFunc() : getNullaryFunc();
}