diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -1648,7 +1648,8 @@ OptionalAttr:$arm_streaming, OptionalAttr:$arm_locally_streaming, OptionalAttr:$section, - OptionalAttr:$unnamed_addr + OptionalAttr:$unnamed_addr, + OptionalAttr:$alignment ); let regions = (region AnyRegion:$body); diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -1749,6 +1749,9 @@ if (func->hasComdat()) funcOp.setComdatAttr(comdatMapping.lookup(func->getComdat())); + if (llvm::MaybeAlign maybeAlign = func->getAlign()) + funcOp.setAlignment(maybeAlign->value()); + // Handle Function attributes. processFunctionAttributes(func, funcOp); diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1044,6 +1044,9 @@ if (auto unnamedAddr = function.getUnnamedAddr()) llvmFunc->setUnnamedAddr(convertUnnamedAddrToLLVM(*unnamedAddr)); + + if (auto alignment = function.getAlignment()) + llvmFunc->setAlignment(llvm::MaybeAlign(*alignment)); } return success(); diff --git a/mlir/test/Dialect/LLVMIR/func.mlir b/mlir/test/Dialect/LLVMIR/func.mlir --- a/mlir/test/Dialect/LLVMIR/func.mlir +++ b/mlir/test/Dialect/LLVMIR/func.mlir @@ -207,7 +207,13 @@ // CHECK-LABEL: local_unnamed_addr @local_unnamed_addr_func llvm.func local_unnamed_addr @local_unnamed_addr_func() { - llvm.return + llvm.return + } + + // CHECK-LABEL: @align_func + // CHECK-SAME: attributes {alignment = 2 : i64} + llvm.func @align_func() attributes {alignment = 2 : i64} { + llvm.return } // CHECK: llvm.comdat @__llvm_comdat diff --git a/mlir/test/Target/LLVMIR/Import/function-attributes.ll b/mlir/test/Target/LLVMIR/Import/function-attributes.ll --- a/mlir/test/Target/LLVMIR/Import/function-attributes.ll +++ b/mlir/test/Target/LLVMIR/Import/function-attributes.ll @@ -229,3 +229,17 @@ ; CHECK-LABEL: unnamed_addr @unnamed_addr_func declare void @unnamed_addr_func() unnamed_addr + +// ----- + +; CHECK-LABEL: @align_func +; CHECK-SAME: attributes {alignment = 2 : i64} +define void @align_func() align 2 { + ret void +} + +// ----- + +; CHECK-LABEL: @align_decl +; CHECK-SAME: attributes {alignment = 64 : i64} +declare void @align_decl() align 64 diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir --- a/mlir/test/Target/LLVMIR/llvmir.mlir +++ b/mlir/test/Target/LLVMIR/llvmir.mlir @@ -1656,6 +1656,20 @@ // ----- +// CHECK-LABEL: @align_func +// CHECK-SAME: align 2 +llvm.func @align_func() attributes {alignment = 2 : i64} { + llvm.return +} + +// ----- + +// CHECK-LABEL: @align_decl +// CHECK-SAME: align 64 +llvm.func @align_decl() attributes {alignment = 64 : i64} + +// ----- + // CHECK-LABEL: @callFreezeOp llvm.func @callFreezeOp(%x : i32) { // CHECK: freeze i32 %{{[0-9]+}}