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 @@ -724,6 +724,18 @@ if (attr.getValue()) llvmArg.addAttr(llvm::Attribute::AttrKind::NoAlias); } + + if (auto attr = func.getArgAttrOfType(argIdx, "llvm.align")) { + // NB: Attribute already verified to be int, so check if we can indeed + // attach the attribute to this argument, based on its type. + auto argTy = mlirArg.getType().dyn_cast(); + if (!argTy.getUnderlyingType()->isPointerTy()) + return func.emitError( + "llvm.align attribute attached to LLVM non-pointer argument"); + llvmArg.addAttrs( + llvm::AttrBuilder().addAlignmentAttr(llvm::Align(attr.getInt()))); + } + valueMapping[mlirArg] = &llvmArg; argIdx++; } diff --git a/mlir/test/Target/llvmir.mlir b/mlir/test/Target/llvmir.mlir --- a/mlir/test/Target/llvmir.mlir +++ b/mlir/test/Target/llvmir.mlir @@ -927,6 +927,11 @@ llvm.return } +// CHECK-LABEL: define void @llvm_align(float* align 4 {{%*.}}) +llvm.func @llvm_align(%arg0: !llvm<"float*"> {llvm.align = 4}) { + llvm.return +} + // CHECK-LABEL: @llvm_varargs(...) llvm.func @llvm_varargs(...)