[Mlir-commits] [mlir] [MLIR] Add support for frame pointers in MLIR (PR #74312)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Dec 4 04:25:37 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: Radu Salavat (Radu2k)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/74312.diff
8 Files Affected:
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td (+9)
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td (+19-1)
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td (+3-1)
- (modified) mlir/lib/Target/LLVMIR/ModuleImport.cpp (+11)
- (modified) mlir/lib/Target/LLVMIR/ModuleTranslation.cpp (+6)
- (modified) mlir/test/Dialect/LLVMIR/func.mlir (+6)
- (added) mlir/test/Target/LLVMIR/Import/frame-pointer.ll (+9)
- (added) mlir/test/Target/LLVMIR/frame-pointer.mlir (+8)
``````````diff
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 9e35bf1ba9777..8182e245c0f78 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -47,6 +47,15 @@ def LinkageAttr : LLVM_Attr<"Linkage", "linkage"> {
let assemblyFormat = "`<` $linkage `>`";
}
+//===----------------------------------------------------------------------===//
+// FramePointerKindAttr
+//===----------------------------------------------------------------------===//
+
+def FramePointerKindAttr : LLVM_Attr<"FramePointerKind", "framePointerKind"> {
+ let parameters = (ins "framePointerKind::FramePointerKind":$framePointerKind);
+ let assemblyFormat = "`<` $framePointerKind `>`";
+}
+
//===----------------------------------------------------------------------===//
// Loop Attributes
//===----------------------------------------------------------------------===//
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
index f05230526c21f..3b5984498cf83 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
@@ -587,7 +587,6 @@ def Linkage : DialectAttr<
"::mlir::LLVM::LinkageAttr::get($_builder.getContext(), $0)";
}
-
//===----------------------------------------------------------------------===//
// Comdat
//===----------------------------------------------------------------------===//
@@ -664,4 +663,23 @@ def ModRefInfoEnum : LLVM_EnumAttr<
let cppNamespace = "::mlir::LLVM";
}
+//===----------------------------------------------------------------------===//
+// FramePointerKind
+//===----------------------------------------------------------------------===//
+
+def FramePointerKindNone
+ : LLVM_EnumAttrCase<"None", "none", "None", 0>;
+def FramePointerKindNonLeaf
+ : LLVM_EnumAttrCase<"NonLeaf", "non-leaf", "NonLeaf", 1>;
+def FramePointerKindAll
+ : LLVM_EnumAttrCase<"All", "all", "All", 2>;
+
+def FramePointerKindEnum : LLVM_EnumAttr<
+ "FramePointerKind",
+ "::llvm::FramePointerKind",
+ "LLVM FramePointerKind",
+ [FramePointerKindNone, FramePointerKindNonLeaf, FramePointerKindAll]> {
+ let cppNamespace = "::mlir::LLVM::framePointerKind";
+}
+
#endif // LLVMIR_ENUMS
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 88f4f81735372..94f2f802fcf22 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -1391,7 +1391,9 @@ def LLVM_LLVMFuncOp : LLVM_Op<"func", [
OptionalAttr<StrAttr>:$section,
OptionalAttr<UnnamedAddr>:$unnamed_addr,
OptionalAttr<I64Attr>:$alignment,
- OptionalAttr<LLVM_VScaleRangeAttr>:$vscale_range
+ OptionalAttr<LLVM_VScaleRangeAttr>:$vscale_range,
+ //DefaultValuedAttr<FramePointerKindAttr, "mlir::LLVM::FramePointerKind::None">:$frame_pointer
+ OptionalAttr<FramePointerKindAttr>:$frame_pointer
);
let regions = (region AnyRegion:$body);
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index 9cdc1f45d38fa..d43ddc008a8f3 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -1614,6 +1614,7 @@ static constexpr std::array ExplicitAttributes{
StringLiteral("aarch64_pstate_sm_body"),
StringLiteral("aarch64_pstate_za_new"),
StringLiteral("vscale_range"),
+ StringLiteral("frame_pointer"),
};
static void processPassthroughAttrs(llvm::Function *func, LLVMFuncOp funcOp) {
@@ -1694,6 +1695,16 @@ void ModuleImport::processFunctionAttributes(llvm::Function *func,
context, IntegerAttr::get(intTy, attr.getVScaleRangeMin()),
IntegerAttr::get(intTy, attr.getVScaleRangeMax().value_or(0))));
}
+
+ // Process frame-pointer attribute.
+ if (func->hasFnAttribute("frame-pointer")) {
+ StringRef stringRefFramePointerKind =
+ func->getFnAttribute("frame-pointer").getValueAsString();
+ funcOp.setFramePointerAttr(LLVM::FramePointerKindAttr::get(
+ funcOp.getContext(), LLVM::framePointerKind::symbolizeFramePointerKind(
+ stringRefFramePointerKind)
+ .value()));
+ }
}
DictionaryAttr
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 322843e656276..992b61b1af15a 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -947,6 +947,12 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) {
getLLVMContext(), attr->getMinRange().getInt(),
attr->getMaxRange().getInt()));
+ // Add function attribute frame-pointer, if found.
+ if (FramePointerKindAttr attr = func.getFramePointerAttr())
+ llvmFunc->addFnAttr("frame-pointer",
+ LLVM::framePointerKind::stringifyFramePointerKind(
+ (attr.getFramePointerKind())));
+
// First, create all blocks so we can jump to them.
llvm::LLVMContext &llvmContext = llvmFunc->getContext();
for (auto &bb : func) {
diff --git a/mlir/test/Dialect/LLVMIR/func.mlir b/mlir/test/Dialect/LLVMIR/func.mlir
index 63e20b1d8fc31..d09df07676122 100644
--- a/mlir/test/Dialect/LLVMIR/func.mlir
+++ b/mlir/test/Dialect/LLVMIR/func.mlir
@@ -249,6 +249,12 @@ module {
// CHECK-SAME: vscale_range(1, 2)
llvm.return
}
+
+ // CHECK-LABEL: @frame_pointer_roundtrip()
+ // CHECK-SAME: attributes {frame_pointer = #llvm.framePointerKind<"non-leaf">}
+ llvm.func @frame_pointer_roundtrip() attributes {frame_pointer = #llvm.framePointerKind<"non-leaf">} {
+ llvm.return
+ }
}
// -----
diff --git a/mlir/test/Target/LLVMIR/Import/frame-pointer.ll b/mlir/test/Target/LLVMIR/Import/frame-pointer.ll
new file mode 100644
index 0000000000000..c6836106672fc
--- /dev/null
+++ b/mlir/test/Target/LLVMIR/Import/frame-pointer.ll
@@ -0,0 +1,9 @@
+; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
+
+; CHECK-LABEL: llvm.func @frame_pointer_func
+; CHECK-SAME: attributes {frame_pointer = #llvm.framePointerKind<"non-leaf">
+
+define void @frame_pointer_func() "frame-pointer"="non-leaf" {
+
+ ret void
+}
diff --git a/mlir/test/Target/LLVMIR/frame-pointer.mlir b/mlir/test/Target/LLVMIR/frame-pointer.mlir
new file mode 100644
index 0000000000000..5224e97a40805
--- /dev/null
+++ b/mlir/test/Target/LLVMIR/frame-pointer.mlir
@@ -0,0 +1,8 @@
+// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s
+
+// CHECK-LABEL: define void @frame_pointer_func()
+// CHECK-SAME: #[[ATTRS:[0-9]+]]
+llvm.func @frame_pointer_func() attributes {frame_pointer = #llvm.framePointerKind<"non-leaf">} {
+ llvm.return
+}
+// CHECK: attributes #[[ATTRS]] = { "frame-pointer"="non-leaf" }
``````````
</details>
https://github.com/llvm/llvm-project/pull/74312
More information about the Mlir-commits
mailing list