[llvm] [SPIR-V] Propagate intrinsic param attributes to generated helper functions (PR #206061)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 26 08:00:51 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/206061.diff
2 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp (+4-1)
- (modified) llvm/test/CodeGen/SPIRV/passes/SPIRVPrepareFunctions.ll (+14)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
index 04cce9915e0da..52a7fae059b1c 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
@@ -145,7 +145,6 @@ static bool lowerIntrinsicToFunction(IntrinsicInst *Intrinsic,
Intrinsic->setCalledFunction(F);
return true;
}
- // TODO copy arguments attributes: nocapture writeonly.
FunctionCallee FC =
M->getOrInsertFunction(FuncName, Intrinsic->getFunctionType());
auto IntrinsicID = Intrinsic->getIntrinsicID();
@@ -154,6 +153,10 @@ static bool lowerIntrinsicToFunction(IntrinsicInst *Intrinsic,
F = dyn_cast<Function>(FC.getCallee());
assert(F && "Callee must be a function");
+ AttributeList Attrs = Intrinsic->getAttributes();
+ for (unsigned I = 0, E = Intrinsic->arg_size(); I != E; ++I)
+ F->addParamAttrs(I, AttrBuilder(F->getContext(), Attrs.getParamAttrs(I)));
+
switch (IntrinsicID) {
case Intrinsic::memset: {
auto *MSI = static_cast<MemSetInst *>(Intrinsic);
diff --git a/llvm/test/CodeGen/SPIRV/passes/SPIRVPrepareFunctions.ll b/llvm/test/CodeGen/SPIRV/passes/SPIRVPrepareFunctions.ll
index 2d022f5d9b17e..91ba08d682015 100644
--- a/llvm/test/CodeGen/SPIRV/passes/SPIRVPrepareFunctions.ll
+++ b/llvm/test/CodeGen/SPIRV/passes/SPIRVPrepareFunctions.ll
@@ -25,6 +25,14 @@ define i32 @fshr_i32(i32 %a, i32 %b, i32 %c) {
ret i32 %r
}
+; Parameter attributes of the original intrinsic are propagated
+; to the generated SPIR-V.
+define void @memset_attrs(ptr %p, i8 %v, i32 %n) {
+; CHECK-LABEL: define void @memset_attrs(
+ call void @llvm.memset.p0.i32(ptr nocapture writeonly %p, i8 %v, i32 %n, i1 false)
+ ret void
+}
+
; The bswap helper is materialized with the standard shift/mask/or unrolling.
; CHECK-LABEL: define i32 @spirv.llvm_bswap_i32(i32 %0)
; CHECK-DAG: shl i32 %0, 24
@@ -54,6 +62,12 @@ define i32 @fshr_i32(i32 %a, i32 %b, i32 %c) {
; CHECK: %[[#OR:]] = or i32 %[[#A]], %[[#B]]
; CHECK: ret i32 %[[#OR]]
+; The memset helper definition carries the destination attributes propagated
+; from the original @llvm.memset intrinsic.
+; CHECK-LABEL: define void @spirv.llvm_memset_p0_i32(
+; CHECK-SAME: ptr writeonly {{.*}}captures(none) %dest,
+
+declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1)
declare i32 @llvm.bswap.i32(i32)
declare i32 @llvm.fshl.i32(i32, i32, i32)
declare i32 @llvm.fshr.i32(i32, i32, i32)
``````````
</details>
https://github.com/llvm/llvm-project/pull/206061
More information about the llvm-commits
mailing list