[flang-commits] [flang] [flang][acc] Implement MappableType interfaces for fir.box and fir.array (PR #122495)
via flang-commits
flang-commits at lists.llvm.org
Mon Jan 13 02:53:23 PST 2025
================
@@ -0,0 +1,221 @@
+//===-- FIROpenACCTypeInterfaces.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
+//
+//===----------------------------------------------------------------------===//
+//
+// Implementation of external dialect interfaces for FIR.
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Optimizer/OpenACC/FIROpenACCTypeInterfaces.h"
+#include "flang/Lower/DirectivesCommon.h"
+#include "flang/Optimizer/Builder/BoxValue.h"
+#include "flang/Optimizer/Builder/FIRBuilder.h"
+#include "flang/Optimizer/Builder/HLFIRTools.h"
+#include "flang/Optimizer/Dialect/FIROps.h"
+#include "flang/Optimizer/Dialect/FIROpsSupport.h"
+#include "flang/Optimizer/Dialect/FIRType.h"
+#include "flang/Optimizer/Dialect/Support/FIRContext.h"
+#include "flang/Optimizer/Dialect/Support/KindMapping.h"
+#include "mlir/Dialect/Arith/IR/Arith.h"
+#include "mlir/Dialect/OpenACC/OpenACC.h"
+#include "mlir/Support/LLVM.h"
+
+namespace fir::acc {
+
+static mlir::TypedValue<mlir::acc::PointerLikeType>
+getPtrFromVar(mlir::Value var) {
+ if (auto ptr =
+ mlir::dyn_cast<mlir::TypedValue<mlir::acc::PointerLikeType>>(var))
+ return ptr;
+
+ if (auto load = mlir::dyn_cast_if_present<fir::LoadOp>(var.getDefiningOp())) {
+ // All FIR reference types implement the PointerLikeType interface.
+ return mlir::cast<mlir::TypedValue<mlir::acc::PointerLikeType>>(
+ load.getMemref());
+ }
+
+ return {};
+}
+
+template <>
+mlir::TypedValue<mlir::acc::PointerLikeType>
+OpenACCMappableModel<fir::SequenceType>::getVarPtr(mlir::Type type,
+ mlir::Value var) const {
+ return getPtrFromVar(var);
+}
+
+template <>
+mlir::TypedValue<mlir::acc::PointerLikeType>
+OpenACCMappableModel<fir::BaseBoxType>::getVarPtr(mlir::Type type,
+ mlir::Value var) const {
+ return getPtrFromVar(var);
+}
+
+template <>
+std::optional<llvm::TypeSize>
+OpenACCMappableModel<fir::SequenceType>::getSizeInBytes(
+ mlir::Type type, mlir::Value var, mlir::ValueRange accBounds,
+ const mlir::DataLayout &dataLayout) const {
+ // TODO: Bounds operation affect the total size - add support to take them
+ // into account.
+ if (!accBounds.empty())
+ return {};
+
+ // Dynamic extents or unknown ranks generally do not have compile-time
+ // computable dimensions.
+ auto seqType = mlir::cast<fir::SequenceType>(type);
+ if (seqType.hasDynamicExtents() || seqType.hasUnknownShape())
+ return {};
+
+ // Without a defining op, cannot look up appropriate kindMapping for the
+ // current context.
+ if (!var.getDefiningOp())
----------------
jeanPerier wrote:
You could try to get the owning operation in the other case `getParentRegion()->getParentOp()` in that case to get the kindmapping.
https://github.com/llvm/llvm-project/pull/122495
More information about the flang-commits
mailing list