[flang-commits] [flang] [Flang][Fir] Set default alignment to 64 on inlineAllocation for arrays (PR #208781)
Slava Zakharin via flang-commits
flang-commits at lists.llvm.org
Fri Jul 10 10:47:30 PDT 2026
================
@@ -1373,6 +1437,68 @@ struct AllocMemOpConversion : public fir::FIROpConversion<fir::AllocMemOp> {
mlir::IntegerType::get(rewriter.getContext(), mallocTyWidth);
if (mallocTyWidth != ity.getIntOrFloatBitWidth())
size = integerCast(loc, rewriter, mallocTy, size);
+
+ std::optional<uint64_t> alignment = heap.getAlignment();
+ if (alignment && *alignment > 16) {
+ auto mod = heap->getParentOfType<mlir::ModuleOp>();
+ llvm::Triple triple = mod ? fir::getTargetTriple(mod) : llvm::Triple{};
+ bool isGpu = heap->getParentOfType<mlir::gpu::GPUModuleOp>() != nullptr ||
+ triple.isNVPTX() || triple.isAMDGPU() || triple.isSPIRV();
+
+ if (!isGpu && !triple.isOSWindows()) {
+ mlir::Value alignVal = fir::genConstantIndex(
+ loc, mallocTy, rewriter, static_cast<std::int64_t>(*alignment));
+
+ if (triple.isOSDarwin()) {
+ // aligned_alloc requires macOS 10.15+, so use posix_memalign instead
+ mlir::Type ptrTy = ::getLlvmPtrType(heap.getContext());
+ mlir::Value memptr;
+ {
+ mlir::OpBuilder::InsertionGuard guard(rewriter);
+ mlir::Operation *parentOp =
+ rewriter.getInsertionBlock()->getParentOp();
+ mlir::Region *parentRegion =
+ rewriter.getInsertionBlock()->getParent();
+ mlir::Block *insertBlock =
+ getBlockForAllocaInsert(parentOp, parentRegion);
+ rewriter.setInsertionPointToStart(insertBlock);
+ mlir::Value one = fir::genConstantIndex(loc, mallocTy, rewriter, 1);
+ memptr =
+ mlir::LLVM::AllocaOp::create(rewriter, loc, ptrTy, ptrTy, one);
+ }
+ mlir::Value nullPtr =
+ mlir::LLVM::ZeroOp::create(rewriter, loc, ptrTy);
+ mlir::LLVM::StoreOp::create(rewriter, loc, nullPtr, memptr);
+ heap->setAttr("callee", getPosixMemalign(heap, rewriter, mallocTy));
+ mlir::LLVM::CallOp::create(
+ rewriter, loc,
+ mlir::TypeRange{
+ mlir::IntegerType::get(rewriter.getContext(), 32)},
+ mlir::ValueRange{memptr, alignVal, size},
+ addLLVMOpBundleAttrs(rewriter, heap->getAttrs(), 3));
+ mlir::Value newPtr =
+ mlir::LLVM::LoadOp::create(rewriter, loc, ptrTy, memptr);
+ rewriter.replaceOp(heap, newPtr);
+ return mlir::success();
+ }
+
+ mlir::Value alignMinusOne = fir::genConstantIndex(
+ loc, mallocTy, rewriter, static_cast<std::int64_t>(*alignment - 1));
+ mlir::Value sizePlus = mlir::LLVM::AddOp::create(
+ rewriter, loc, mallocTy, size, alignMinusOne);
+ mlir::Value div = mlir::LLVM::UDivOp::create(rewriter, loc, mallocTy,
+ sizePlus, alignVal);
+ mlir::Value roundedSize =
+ mlir::LLVM::MulOp::create(rewriter, loc, mallocTy, div, alignVal);
----------------
vzakhari wrote:
Can you generate `(size + alignMinusOne) & ~alignMinusOne` instead?
https://github.com/llvm/llvm-project/pull/208781
More information about the flang-commits
mailing list