diff --git a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp --- a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp +++ b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp @@ -1521,7 +1521,7 @@ Optional allocationAlignment = getAllocationAlignment(allocOp); // Whether to use std lib function aligned_alloc that supports alignment. - bool useAlignedAlloc = allocationAlignment.hasValue(); + bool useAlignedAlloc = allocationAlignment && *allocationAlignment != 0; // Insert the malloc/aligned_alloc declaration if it is not already present. auto allocFuncName = useAlignedAlloc ? "aligned_alloc" : "malloc"; diff --git a/mlir/test/Conversion/StandardToLLVM/convert-dynamic-memref-ops.mlir b/mlir/test/Conversion/StandardToLLVM/convert-dynamic-memref-ops.mlir --- a/mlir/test/Conversion/StandardToLLVM/convert-dynamic-memref-ops.mlir +++ b/mlir/test/Conversion/StandardToLLVM/convert-dynamic-memref-ops.mlir @@ -182,6 +182,13 @@ // ALIGNED-ALLOC: %[[c128:.*]] = llvm.mlir.constant(128 : i64) : !llvm.i64 // ALIGNED-ALLOC: llvm.call @aligned_alloc(%[[c128]] %6 = alloc(%N) : memref> + // When alignment is 0, revert to malloc behavior + // ALIGNED-ALLOC: %[[c64:.*]] = llvm.mlir.constant(64 : index) : !llvm.i64 + // ALIGNED-ALLOC: llvm.mul %[[c64]] + // ALIGNED-ALLOC: llvm.add + // ALIGNED-ALLOC-NEXT: %[[ZERO_ALIGNED:.*]] = llvm.sub + // ALIGNED-ALLOC-NEXT: llvm.call @malloc(%[[ZERO_ALIGNED]]) + %7 = alloc() {alignment = 0} : memref<64xf32> return %0 : memref<32x18xf32> }