[Mlir-commits] [mlir] [MLIR] Add attributes no_unwind and will_return to the LLVMIR dialect (PR #98921)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Jul 15 09:04:53 PDT 2024
https://github.com/FMarno created https://github.com/llvm/llvm-project/pull/98921
And testing.
These are being added to be used in the GPU to LLVM SPV pass.
>From 5efd45370b9c535376c65fd26343dc0c8f47c364 Mon Sep 17 00:00:00 2001
From: Finlay Marno <finlay.marno at codeplay.com>
Date: Mon, 15 Jul 2024 17:02:07 +0100
Subject: [PATCH] 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 65dfcf93d7029..f50b2188933e3 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -1460,6 +1460,8 @@ def LLVM_LLVMFuncOp : LLVM_Op<"func", [
OptionalAttr<StrAttr>:$fp_contract,
OptionalAttr<UnitAttr>:$no_inline,
OptionalAttr<UnitAttr>:$always_inline,
+ OptionalAttr<UnitAttr>:$no_unwind,
+ OptionalAttr<UnitAttr>:$will_return,
OptionalAttr<UnitAttr>:$optimize_none
);
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index 9915576bbc458..942ca16e836a7 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -1686,10 +1686,12 @@ 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("unsafe-fp-math"),
StringLiteral("vscale_range"),
+ StringLiteral("willreturn"),
};
static void processPassthroughAttrs(llvm::Function *func, LLVMFuncOp funcOp) {
@@ -1762,6 +1764,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 c96ed939e4bf2..87d65065d494e 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -1438,6 +1438,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
More information about the Mlir-commits
mailing list