[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