From df2b4a1cd79fbcd9e4feecfeb96bf21270a17683 Mon Sep 17 00:00:00 2001 From: Finlay Marno Date: Mon, 15 Jul 2024 17:02:07 +0100 Subject: [PATCH 1/2] Add attributes no_unwind and will_return to the llvmir dialect And testing --- mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td | 2 ++ mlir/lib/Target/LLVMIR/ModuleImport.cpp | 6 +++++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 4 ++++ mlir/test/Dialect/LLVMIR/func.mlir | 13 +++++++++++ .../LLVMIR/Import/function-attributes.ll | 12 ++++++++++ mlir/test/Target/LLVMIR/llvmir.mlir | 22 +++++++++++++++++++ 6 files changed, 59 insertions(+) diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td index f0dec69a5032a..06656c791c594 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -1461,6 +1461,8 @@ def LLVM_LLVMFuncOp : LLVM_Op<"func", [ OptionalAttr:$fp_contract, OptionalAttr:$no_inline, OptionalAttr:$always_inline, + OptionalAttr:$no_unwind, + OptionalAttr:$will_return, OptionalAttr:$optimize_none ); diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp index 5bc3dd680d02d..16007592175f7 100644 --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -1686,11 +1686,13 @@ static constexpr std::array kExplicitAttributes{ StringLiteral("no-nans-fp-math"), StringLiteral("no-signed-zeros-fp-math"), StringLiteral("noinline"), + StringLiteral("nounwind"), StringLiteral("optnone"), StringLiteral("target-features"), StringLiteral("tune-cpu"), StringLiteral("unsafe-fp-math"), StringLiteral("vscale_range"), + StringLiteral("willreturn"), }; static void processPassthroughAttrs(llvm::Function *func, LLVMFuncOp funcOp) { @@ -1763,6 +1765,10 @@ void ModuleImport::processFunctionAttributes(llvm::Function *func, funcOp.setOptimizeNone(true); if (func->hasFnAttribute(llvm::Attribute::Convergent)) funcOp.setConvergent(true); + if (func->hasFnAttribute(llvm::Attribute::NoUnwind)) + funcOp.setNoUnwind(true); + if (func->hasFnAttribute(llvm::Attribute::WillReturn)) + funcOp.setWillReturn(true); if (func->hasFnAttribute("aarch64_pstate_sm_enabled")) funcOp.setArmStreaming(true); diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index ef226dd3a77d5..2ace2b3f3e946 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1441,6 +1441,10 @@ static void convertFunctionAttributes(LLVMFuncOp func, llvmFunc->addFnAttr(llvm::Attribute::OptimizeNone); if (func.getConvergentAttr()) llvmFunc->addFnAttr(llvm::Attribute::Convergent); + if (func.getNoUnwind()) + llvmFunc->addFnAttr(llvm::Attribute::NoUnwind); + if (func.getWillReturn()) + llvmFunc->addFnAttr(llvm::Attribute::WillReturn); convertFunctionMemoryAttributes(func, llvmFunc); } diff --git a/mlir/test/Dialect/LLVMIR/func.mlir b/mlir/test/Dialect/LLVMIR/func.mlir index e0810a23697f8..0e29a548de72f 100644 --- a/mlir/test/Dialect/LLVMIR/func.mlir +++ b/mlir/test/Dialect/LLVMIR/func.mlir @@ -312,6 +312,19 @@ module { llvm.return } + llvm.func @nounwind_function() attributes {no_unwind} { + // CHECK: @nounwind_function + // CHECK-SAME: attributes {no_unwind} + llvm.return + } + + llvm.func @willreturn_function() attributes {will_return} { + // CHECK: @willreturn_function + // CHECK-SAME: attributes {will_return} + llvm.return + } + + } // ----- diff --git a/mlir/test/Target/LLVMIR/Import/function-attributes.ll b/mlir/test/Target/LLVMIR/Import/function-attributes.ll index 9ca6f62fd0e2d..6c38979a0a719 100644 --- a/mlir/test/Target/LLVMIR/Import/function-attributes.ll +++ b/mlir/test/Target/LLVMIR/Import/function-attributes.ll @@ -385,3 +385,15 @@ declare void @optnone_attribute() noinline optnone ; CHECK-LABEL: @convergent_attribute ; CHECK-SAME: attributes {convergent} declare void @convergent_attribute() convergent + +// ----- + +; CHECK-LABEL: @nounwind_attribute +; CHECK-SAME: attributes {no_unwind} +declare void @nounwind_attribute() nounwind + +// ----- + +; CHECK-LABEL: @willreturn_attribute +; CHECK-SAME: attributes {will_return} +declare void @willreturn_attribute() willreturn diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir index 29fdb55c1b301..132a8eb668eba 100644 --- a/mlir/test/Target/LLVMIR/llvmir.mlir +++ b/mlir/test/Target/LLVMIR/llvmir.mlir @@ -2452,3 +2452,25 @@ llvm.func @convergent() attributes { convergent } { // CHECK: #[[ATTRS]] // CHECK-SAME: convergent + +// ----- + +// CHECK-LABEL: @nounwind +// CHECK-SAME: #[[ATTRS:[0-9]+]] +llvm.func @nounwind() attributes { no_unwind } { + llvm.return +} + +// CHECK: #[[ATTRS]] +// CHECK-SAME: nounwind + +// ----- + +// CHECK-LABEL: @willreturn +// CHECK-SAME: #[[ATTRS:[0-9]+]] +llvm.func @willreturn() attributes { will_return } { + llvm.return +} + +// CHECK: #[[ATTRS]] +// CHECK-SAME: willreturn From 308abf91d7c355962872032fefd99eca371978c2 Mon Sep 17 00:00:00 2001 From: Finlay Marno Date: Tue, 16 Jul 2024 09:06:15 +0100 Subject: [PATCH 2/2] amend! Add attributes no_unwind and will_return to the llvmir dialect Add attributes no_unwind and will_return to the llvmir dialect And testing Co-authored-by: Victor Perez --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 2ace2b3f3e946..fc3fb0b5334c1 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1441,9 +1441,9 @@ static void convertFunctionAttributes(LLVMFuncOp func, llvmFunc->addFnAttr(llvm::Attribute::OptimizeNone); if (func.getConvergentAttr()) llvmFunc->addFnAttr(llvm::Attribute::Convergent); - if (func.getNoUnwind()) + if (func.getNoUnwindAttr()) llvmFunc->addFnAttr(llvm::Attribute::NoUnwind); - if (func.getWillReturn()) + if (func.getWillReturnAttr()) llvmFunc->addFnAttr(llvm::Attribute::WillReturn); convertFunctionMemoryAttributes(func, llvmFunc); }