[llvm] [IR] Use default attributes for unordered memcpy/memset (PR #218409)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 06:29:38 PDT 2026
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/218409
All the default attributes (willreturn, nosync, nofree, nocallback) apply to these, so make them DefaultAttrsIntrinsics.
This was raised in https://github.com/llvm/llvm-project/pull/204795#issuecomment-4937647710.
>From dfe277a5eef399b7dfadbde14cb61616920bb298 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Mon, 24 Aug 2026 15:23:15 +0200
Subject: [PATCH] [IR] Use default attributes for unordered memcpy/memset
All the default attributes (willreturn, nosync, nofree, nocallback)
apply to these, so make them DefaultAttrsIntrinsics.
---
llvm/include/llvm/IR/Intrinsics.td | 28 +++++++++-----------
llvm/test/Analysis/BasicAA/cs-cs.ll | 40 ++++++++++++++---------------
2 files changed, 32 insertions(+), 36 deletions(-)
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 12211799e358c..f6fdf97d7f283 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -2565,28 +2565,24 @@ def int_xray_typedevent : Intrinsic<[], [llvm_i64_ty, llvm_ptr_ty, llvm_i64_ty],
// @llvm.memcpy.element.unordered.atomic.*(dest, src, length, elementsize)
def int_memcpy_element_unordered_atomic
- : Intrinsic<[],
- [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty, llvm_i32_ty],
- [IntrArgMemOnly, IntrWillReturn, IntrNoSync,
- NoCapture<ArgIndex<0>>, NoCapture<ArgIndex<1>>,
- WriteOnly<ArgIndex<0>>, ReadOnly<ArgIndex<1>>,
- ImmArg<ArgIndex<3>>]>;
+ : DefaultAttrsIntrinsic<
+ [], [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty, llvm_i32_ty],
+ [IntrArgMemOnly, NoCapture<ArgIndex<0>>, NoCapture<ArgIndex<1>>,
+ WriteOnly<ArgIndex<0>>, ReadOnly<ArgIndex<1>>, ImmArg<ArgIndex<3>>]>;
// @llvm.memmove.element.unordered.atomic.*(dest, src, length, elementsize)
def int_memmove_element_unordered_atomic
- : Intrinsic<[],
- [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty, llvm_i32_ty],
- [IntrArgMemOnly, IntrWillReturn, IntrNoSync,
- NoCapture<ArgIndex<0>>, NoCapture<ArgIndex<1>>,
- WriteOnly<ArgIndex<0>>, ReadOnly<ArgIndex<1>>,
- ImmArg<ArgIndex<3>>]>;
+ : DefaultAttrsIntrinsic<
+ [], [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty, llvm_i32_ty],
+ [IntrArgMemOnly, NoCapture<ArgIndex<0>>, NoCapture<ArgIndex<1>>,
+ WriteOnly<ArgIndex<0>>, ReadOnly<ArgIndex<1>>, ImmArg<ArgIndex<3>>]>;
// @llvm.memset.element.unordered.atomic.*(dest, value, length, elementsize)
def int_memset_element_unordered_atomic
- : Intrinsic<[], [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty, llvm_i32_ty],
- [IntrWriteMem, IntrArgMemOnly, IntrWillReturn, IntrNoSync,
- NoCapture<ArgIndex<0>>, WriteOnly<ArgIndex<0>>,
- ImmArg<ArgIndex<3>>]>;
+ : DefaultAttrsIntrinsic<
+ [], [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty, llvm_i32_ty],
+ [IntrWriteMem, IntrArgMemOnly, NoCapture<ArgIndex<0>>,
+ WriteOnly<ArgIndex<0>>, ImmArg<ArgIndex<3>>]>;
//===------------------------ Reduction Intrinsics ------------------------===//
//
diff --git a/llvm/test/Analysis/BasicAA/cs-cs.ll b/llvm/test/Analysis/BasicAA/cs-cs.ll
index 5eee9ec8705e1..f6e4e2ef1c27e 100644
--- a/llvm/test/Analysis/BasicAA/cs-cs.ll
+++ b/llvm/test/Analysis/BasicAA/cs-cs.ll
@@ -406,26 +406,26 @@ entry:
call void @an_argmemonly_func(ptr %q) #9 [ "unknown"() ]
ret void
-; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(ptr %p) #9 [ "unknown"() ]
-; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(ptr %p) #9 [ "unknown"() ]
-; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #10 [ "unknown"() ]
-; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #10 [ "unknown"() ]
-; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ]
-; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ]
-; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ]
-; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ]
-; CHECK: Just Ref: call void @a_readonly_func(ptr %p) #9 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #10 [ "unknown"() ]
-; CHECK: Just Ref: call void @a_readonly_func(ptr %p) #9 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ]
-; CHECK: Just Ref: call void @a_readonly_func(ptr %p) #9 [ "unknown"() ] <-> call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ]
-; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #10 [ "unknown"() ] <-> call void @a_readonly_func(ptr %p) #9 [ "unknown"() ]
-; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #10 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ]
-; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #10 [ "unknown"() ] <-> call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ]
-; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ] <-> call void @a_readonly_func(ptr %p) #9 [ "unknown"() ]
-; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #10 [ "unknown"() ]
-; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ] <-> call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ]
-; CHECK: Both ModRef: call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ] <-> call void @a_readonly_func(ptr %p) #9 [ "unknown"() ]
-; CHECK: NoModRef: call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #10 [ "unknown"() ]
-; CHECK: Both ModRef: call void @an_argmemonly_func(ptr %q) #12 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #11 [ "unknown"() ]
+; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ]
+; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ]
+; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ]
+; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Just Ref: call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ]
+; CHECK: Just Ref: call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Just Ref: call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ] <-> call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ] <-> call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ] <-> call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ] <-> call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ] <-> call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ] <-> call void @a_readonly_func(ptr %p) #{{.*}} [ "unknown"() ]
+; CHECK: NoModRef: call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #{{.*}} [ "unknown"() ]
+; CHECK: Both ModRef: call void @an_argmemonly_func(ptr %q) #{{.*}} [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(ptr %q) #{{.*}} [ "unknown"() ]
}
attributes #0 = { argmemonly nounwind }
More information about the llvm-commits
mailing list