[Mlir-commits] [mlir] [mlir][LLVM] Add !invariant.load metadata support to llvm.load (PR #76754)
Krzysztof Drewniak
llvmlistbot at llvm.org
Tue Jan 2 13:10:53 PST 2024
https://github.com/krzysz00 created https://github.com/llvm/llvm-project/pull/76754
Add support for !invariant.load metadata (by way of a unit attribute) to the MLIR representation of llvm.load.
>From 562c2bc5b7f99e332db14c687996bc1d6462efbd Mon Sep 17 00:00:00 2001
From: Krzysztof Drewniak <Krzysztof.Drewniak at amd.com>
Date: Thu, 14 Sep 2023 21:09:35 +0000
Subject: [PATCH] [mlir][LLVM] Add !invariant.load metadata support to
llvm.load
Add support for !invariant.load metadata (by way of a unit attribute)
to the MLIR representation of llvm.load.
---
mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td | 6 ++++++
mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td | 5 ++++-
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 6 +++---
mlir/test/Target/LLVMIR/Import/instructions.ll | 13 +++++++++++++
mlir/test/Target/LLVMIR/llvmir.mlir | 11 +++++++++++
5 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td
index b6aa73dad22970..f9e47ac542a62b 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td
@@ -225,6 +225,12 @@ class LLVM_MemOpPatterns {
inst->setMetadata(llvm::LLVMContext::MD_nontemporal, metadata);
}
}];
+ code setInvariantLoadMetedataCode = [{
+ if ($invariantLoad) {
+ llvm::MDNode *metadata = llvm::MDNode::get(inst->getContext(), std::nullopt);
+ inst->setMetadata(llvm::LLVMContext::MD_invariant_load, metadata);
+ }
+ }];
code setAccessGroupsMetadataCode = [{
moduleTranslation.setAccessGroupsMetadata(op, inst);
}];
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 9e65898154bd65..8db46f0a3cf3a7 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -330,6 +330,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
OptionalAttr<I64Attr>:$alignment,
UnitAttr:$volatile_,
UnitAttr:$nontemporal,
+ UnitAttr:$invariantLoad,
DefaultValuedAttr<
AtomicOrdering, "AtomicOrdering::not_atomic">:$ordering,
OptionalAttr<StrAttr>:$syncscope);
@@ -373,6 +374,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
# setSyncScopeCode
# setAlignmentCode
# setNonTemporalMetadataCode
+ # setInvariantLoadMetedataCode
# setAccessGroupsMetadataCode
# setAliasAnalysisMetadataCode;
string mlirBuilder = [{
@@ -381,13 +383,14 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
$res = $_builder.create<LLVM::LoadOp>($_location, $_resultType, $addr,
alignment, loadInst->isVolatile(),
loadInst->hasMetadata(llvm::LLVMContext::MD_nontemporal),
+ loadInst->hasMetadata(llvm::LLVMContext::MD_invariant_load),
convertAtomicOrderingFromLLVM(loadInst->getOrdering()),
getLLVMSyncScope(loadInst));
}];
let builders = [
OpBuilder<(ins "Type":$type, "Value":$addr,
CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
- CArg<"bool", "false">:$isNonTemporal,
+ CArg<"bool", "false">:$isNonTemporal, CArg<"bool", "false">:$isInvariantLoad,
CArg<"AtomicOrdering", "AtomicOrdering::not_atomic">:$ordering,
CArg<"StringRef", "StringRef()">:$syncscope)>
];
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 64388a9a01812a..6c5f59d2c27f18 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -822,11 +822,11 @@ LogicalResult LoadOp::verify() {
void LoadOp::build(OpBuilder &builder, OperationState &state, Type type,
Value addr, unsigned alignment, bool isVolatile,
- bool isNonTemporal, AtomicOrdering ordering,
- StringRef syncscope) {
+ bool isNonTemporal, bool isInvariantLoad,
+ AtomicOrdering ordering, StringRef syncscope) {
build(builder, state, type, addr,
alignment ? builder.getI64IntegerAttr(alignment) : nullptr, isVolatile,
- isNonTemporal, ordering,
+ isNonTemporal, isInvariantLoad, ordering,
syncscope.empty() ? nullptr : builder.getStringAttr(syncscope),
/*access_groups=*/nullptr,
/*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr,
diff --git a/mlir/test/Target/LLVMIR/Import/instructions.ll b/mlir/test/Target/LLVMIR/Import/instructions.ll
index 036efad0d099ae..4e9d4961bc9627 100644
--- a/mlir/test/Target/LLVMIR/Import/instructions.ll
+++ b/mlir/test/Target/LLVMIR/Import/instructions.ll
@@ -370,6 +370,19 @@ define void @load_store(ptr %ptr) {
; // -----
+; CHECK-LABEL: @invariant_load
+; CHECK-SAME: %[[PTR:[a-zA-Z0-9]+]]
+define float @invariant_load(ptr %ptr) {
+ ; CHECK: %[[V:[0-9]+]] = llvm.load %[[PTR]] {alignment = 4 : i64, invariantLoad} : !llvm.ptr -> f32
+ %1 = load float, ptr %ptr, align 4, !invariant.load !0
+ ; CHECK: llvm.return %[[V]]
+ ret float %1
+}
+
+!0 = !{i32 1}
+
+; // -----
+
; CHECK-LABEL: @atomic_load_store
; CHECK-SAME: %[[PTR:[a-zA-Z0-9]+]]
define void @atomic_load_store(ptr %ptr) {
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 13e61b6ce10b2a..9fd5f1efafd1a9 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -1911,6 +1911,17 @@ llvm.func @nontemporal_store_and_load() {
// -----
+// Check that invariantLoad attribute is exported as metadata node.
+llvm.func @nontemporal_store_and_load(%ptr : !llvm.ptr) -> i32 {
+ // CHECK: !invariant.load ![[NODE:[0-9]+]]
+ %1 = llvm.load %ptr {invariantLoad} : !llvm.ptr -> i32
+ llvm.return %1 : i32
+}
+
+// CHECK: ![[NODE]] = !{}
+
+// -----
+
llvm.func @atomic_store_and_load(%ptr : !llvm.ptr) {
// CHECK: load atomic
// CHECK-SAME: acquire, align 4
More information about the Mlir-commits
mailing list