[flang-commits] [flang] [mlir] [mlir][acc][flang] Add type sizing utilities (PR #208074)

Razvan Lupusoru via flang-commits flang-commits at lists.llvm.org
Tue Jul 7 12:52:06 PDT 2026


================
@@ -0,0 +1,94 @@
+//===- OpenACCUtilsType.cpp - OpenACC Type Utilities ----------------------===//
+//
+// 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 "mlir/Dialect/OpenACC/OpenACCUtilsType.h"
+#include "mlir/Dialect/LLVMIR/LLVMTypes.h"
+#include "mlir/Dialect/MemRef/IR/MemRef.h"
+#include "mlir/Dialect/OpenACC/Analysis/OpenACCSupport.h"
+#include "mlir/Dialect/OpenACC/OpenACCUtilsCG.h"
+#include "mlir/IR/BuiltinOps.h"
+#include "mlir/IR/BuiltinTypes.h"
+#include "mlir/Interfaces/DataLayoutInterfaces.h"
+
+namespace mlir {
+namespace acc {
+
+static std::optional<TypeSizeAndAlignment>
+getTypeSizeAndAlignmentHelper(Type ty, ModuleOp module, const DataLayout &dl,
+                              OpenACCSupport *support) {
+  if (support)
+    return support->getTypeSizeAndAlignment(ty, module);
+  return getTypeSizeAndAlignment(ty, module, dl);
+}
+
+std::optional<TypeSizeAndAlignment>
+getTypeSizeAndAlignment(Type ty, ModuleOp module, const DataLayout &dl,
+                        OpenACCSupport *support) {
+  if (ty.isIntOrIndexOrFloat() ||
+      isa<ComplexType, VectorType, DataLayoutTypeInterface>(ty)) {
+    return TypeSizeAndAlignment{
+        dl.getTypeSize(ty),
+        llvm::TypeSize::getFixed(dl.getTypeABIAlignment(ty))};
+  }
+
+  // Product of element size and static dimensions; no inter-element padding or
+  // array alignment rules are applied. This is acceptable as per API
+  // documentation.
+  if (auto memrefTy = dyn_cast<MemRefType>(ty)) {
+    if (!memrefTy.hasStaticShape())
+      return std::nullopt;
+    auto elemSizeAndAlignment = getTypeSizeAndAlignmentHelper(
+        memrefTy.getElementType(), module, dl, support);
+    if (!elemSizeAndAlignment)
+      return std::nullopt;
+    int64_t totalSize = elemSizeAndAlignment->first.getFixedValue();
+    int64_t alignment = elemSizeAndAlignment->second.getFixedValue();
+    for (int64_t dim : memrefTy.getShape())
+      totalSize *= dim;
+    return TypeSizeAndAlignment{llvm::TypeSize::getFixed(totalSize),
+                                llvm::TypeSize::getFixed(alignment)};
+  }
+
+  // Sum of member sizes with no padding between members or tuple alignment
+  // rules applied. This is acceptable as per API documentation.
+  if (auto tupleTy = dyn_cast<TupleType>(ty)) {
+    if (tupleTy.size() == 0)
+      return std::nullopt;
+    auto sizeAndAlignment =
+        getTypeSizeAndAlignmentHelper(tupleTy.getType(0), module, dl, support);
+    if (!sizeAndAlignment)
+      return std::nullopt;
+    llvm::TypeSize size = sizeAndAlignment->first;
+    for (unsigned i = 1, e = tupleTy.size(); i < e; ++i) {
+      auto next = getTypeSizeAndAlignmentHelper(tupleTy.getType(i), module, dl,
+                                                support);
+      if (!next)
+        return std::nullopt;
+      size += next->first;
+    }
+    return TypeSizeAndAlignment{size, sizeAndAlignment->second};
+  }
+
+  if (isa<FunctionType>(ty)) {
+    return getTypeSizeAndAlignmentHelper(
+        LLVM::LLVMPointerType::get(ty.getContext()), module, dl, support);
+  }
----------------
razvanlupusoru wrote:

Done. Thank you :)

https://github.com/llvm/llvm-project/pull/208074


More information about the flang-commits mailing list