[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>
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 72e6883..3dac57c 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -16,6 +16,7 @@
#include "flang/Lower/ConvertExpr.h"
#include "flang/Lower/ConvertType.h"
#include "flang/Lower/ConvertVariable.h"
+#include "flang/Lower/IterationSpace.h"
#include "flang/Lower/Mangler.h"
#include "flang/Lower/PFTBuilder.h"
#include "flang/Lower/Runtime.h"
@@ -517,7 +518,7 @@
if (assign.lhs.Rank() > 0) {
// Array assignment
// See Fortran 2018 10.2.1.3 p5, p6, and p7
- TODO(toLocation(), "Array assignment");
+ genArrayAssignment(assign, stmtCtx);
return;
}
@@ -835,6 +836,26 @@
TODO(toLocation(), "LockStmt lowering");
}
+ /// Generate an array assignment.
+ /// This is an assignment expression with rank > 0. The assignment may or may
+ /// not be in a WHERE and/or FORALL context.
+ void genArrayAssignment(const Fortran::evaluate::Assignment &assign,
+ Fortran::lower::StatementContext &stmtCtx) {
+ if (isWholeAllocatable(assign.lhs)) {
+ // Assignment to allocatables may require the lhs to be
+ // deallocated/reallocated. See Fortran 2018 10.2.1.3 p3
+ Fortran::lower::createAllocatableArrayAssignment(
+ *this, assign.lhs, assign.rhs, explicitIterSpace, implicitIterSpace,
+ localSymbols, stmtCtx);
+ return;
+ }
+
+ // No masks and the iteration space is implied by the array, so create a
+ // simple array assignment.
+ Fortran::lower::createSomeArrayAssignment(*this, assign.lhs, assign.rhs,
+ localSymbols, stmtCtx);
+ }
+
void genFIR(const Fortran::parser::WhereConstruct &c) {
TODO(toLocation(), "WhereConstruct lowering");
}
@@ -1047,6 +1068,8 @@
/// Tuple of host assoicated variables.
mlir::Value hostAssocTuple;
+ Fortran::lower::ImplicitIterSpace implicitIterSpace;
+ Fortran::lower::ExplicitIterSpace explicitIterSpace;
};
} // namespace