[Mlir-commits] [flang] [mlir] [Flang][OpenMP] Support iterator modifier in map and motion clauses (PR #197757)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Oct 14 10:50:17 PDT 2026
================
@@ -1283,6 +1283,189 @@ mlir::Value genIteratorCoordinate(Fortran::lower::AbstractConverter &converter,
/*typeparams=*/mlir::ValueRange{});
}
+// Lower the stable base entity for an iterator map/motion locator.
+//
+// MapInfoOp stores this base in var_ptr and represents the iterator-selected
+// elements or sections with map bounds. For component array locators such as
+// v%a(i) or v%a(i:i+1), return v%a so each iteration maps offsets from the
+// same base.
+static std::optional<hlfir::Entity>
+getIteratorMapEntity(Fortran::lower::AbstractConverter &converter,
+ fir::FirOpBuilder &builder,
+ Fortran::semantics::SemanticsContext &semaCtx,
+ Fortran::lower::StatementContext &stmtCtx,
+ const omp::Object &object, mlir::Location loc) {
+ const semantics::Symbol *sym = object.sym();
+ assert(sym && "expected symbol for iterator object");
+
+ if (!sym->owner().IsDerivedType()) {
+ // Keep the same base address as ordinary map lowering for non-component
+ // objects.
+ fir::factory::AddrAndBoundsInfo info =
+ Fortran::lower::getDataOperandBaseAddr(converter, builder, *sym, loc,
+ /*unwrapFirBox=*/false);
+ return hlfir::Entity{info.addr};
+ }
+
+ const std::optional<ExprTy> &ref = object.ref();
+ if (!ref)
+ return std::nullopt;
+
+ auto arrayRef = Fortran::lower::detail::getRef<evaluate::ArrayRef>(*ref);
+ if (!arrayRef)
+ return std::nullopt;
+
+ evaluate::ExpressionAnalyzer ea{semaCtx};
+ std::optional<ExprTy> arrayBase;
+ const evaluate::NamedEntity &base = arrayRef->base();
+ // Component array references carry the array base separately from the
+ // subscript list. Lower that base, e.g. v%a in v%a(i), and leave the
+ // subscript-dependent part to map bounds.
+ if (const semantics::SymbolRef *symRef = base.UnwrapSymbolRef())
----------------
chichunchen wrote:
Non-component locators do use `getDataOperandBaseAddr`. It takes a symbol, though, and for v%a(i) the symbol a doesn't identify the containing object v. So the component base v%a is designated and lowered directly, and the subscripts are left to the iterator-local bounds. There's a comment in getIteratorMapEntity explaining this.
https://github.com/llvm/llvm-project/pull/197757
More information about the Mlir-commits
mailing list