Index: mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td =================================================================== --- mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -1569,7 +1569,8 @@ OptionalAttr:$memory, DefaultValuedAttr:$visibility_, OptionalAttr:$arm_streaming, - OptionalAttr:$arm_locally_streaming + OptionalAttr:$arm_locally_streaming, + OptionalAttr:$arm_new_za ); let regions = (region AnyRegion:$body); Index: mlir/lib/Target/LLVMIR/ModuleImport.cpp =================================================================== --- mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -1559,10 +1559,10 @@ attrName = llvm::Attribute::getNameFromAttrKind(attr.getKindAsEnum()); auto keyAttr = StringAttr::get(context, attrName); - // Skip the aarch64_pstate_sm_ since the LLVMFuncOp has an - // explicit attribute. + // Skip attributes the LLVMFuncOp has an explicit attribute for. if (attrName == "aarch64_pstate_sm_enabled" || - attrName == "aarch64_pstate_sm_body") + attrName == "aarch64_pstate_sm_body" || + attrName == "aarch64_pstate_za_new") continue; if (attr.isStringAttribute()) { @@ -1602,6 +1602,9 @@ funcOp.setArmStreaming(true); else if (func->hasFnAttribute("aarch64_pstate_sm_body")) funcOp.setArmLocallyStreaming(true); + + if (func->hasFnAttribute("aarch64_pstate_za_new")) + funcOp.setArmNewZa(true); } DictionaryAttr Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp =================================================================== --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -896,6 +896,9 @@ else if (auto armLocallyStreaming = func.getArmLocallyStreaming()) llvmFunc->addFnAttr("aarch64_pstate_sm_body"); + if (auto armNewZA = func.getArmNewZa()) + llvmFunc->addFnAttr("aarch64_pstate_za_new"); + // First, create all blocks so we can jump to them. llvm::LLVMContext &llvmContext = llvmFunc->getContext(); for (auto &bb : func) { Index: mlir/test/Target/LLVMIR/Import/function-attributes.ll =================================================================== --- mlir/test/Target/LLVMIR/Import/function-attributes.ll +++ mlir/test/Target/LLVMIR/Import/function-attributes.ll @@ -209,3 +209,11 @@ define void @arm_locally_streaming_func() "aarch64_pstate_sm_body" { ret void } + +// ----- + +; CHECK-LABEL: @arm_private_za_func +; CHECK-SAME: attributes {arm_new_za} +define void @arm_private_za_func() "aarch64_pstate_za_new" { + ret void +} Index: mlir/test/Target/LLVMIR/llvmir.mlir =================================================================== --- mlir/test/Target/LLVMIR/llvmir.mlir +++ mlir/test/Target/LLVMIR/llvmir.mlir @@ -2243,3 +2243,17 @@ } // CHECK: attributes #[[ATTR]] = { "aarch64_pstate_sm_body" } + +// ----- + +// +// arm_new_za attribute. +// + +// CHECK-LABEL: @arm_private_za_func +// CHECK: #[[ATTR:[0-9]*]] +llvm.func @arm_private_za_func() attributes {arm_new_za} { + llvm.return +} + +// CHECK: attributes #[[ATTR]] = { "aarch64_pstate_za_new" }