[llvm] [ObjCARC] Add variations of intrinsics that do not touch reference counts (PR #94919)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 22 12:30:38 PDT 2024
https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/94919
>From bd69c38af88b832dddc1c100f6841bbf17e5ae33 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Sun, 9 Jun 2024 17:45:26 -0400
Subject: [PATCH 1/2] [ObjCARC] Add variations of intrinsics that do not touch
reference counts
---
llvm/lib/Analysis/ObjCARCInstKind.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/llvm/lib/Analysis/ObjCARCInstKind.cpp b/llvm/lib/Analysis/ObjCARCInstKind.cpp
index d177ee056a93a..370ed88bf57df 100644
--- a/llvm/lib/Analysis/ObjCARCInstKind.cpp
+++ b/llvm/lib/Analysis/ObjCARCInstKind.cpp
@@ -201,8 +201,13 @@ static bool isUseOnlyIntrinsic(unsigned ID) {
// TODO: Expand this into a covered switch. There is a lot more here.
switch (ID) {
case Intrinsic::memcpy:
+ case Intrinsic::memcpy_element_unordered_atomic:
+ case Intrinsic::memcpy_inline:
case Intrinsic::memmove:
+ case Intrinsic::memmove_element_unordered_atomic:
case Intrinsic::memset:
+ case Intrinsic::memset_element_unordered_atomic:
+ case Intrinsic::memset_inline:
return true;
default:
return false;
>From 5b7aad8e2b1980733d7ff998eb218eb1f49c6754 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Mon, 22 Jul 2024 15:29:24 -0400
Subject: [PATCH 2/2] Pre-commit tests (NFC)
---
llvm/test/Transforms/ObjCARC/nested.ll | 62 ++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/llvm/test/Transforms/ObjCARC/nested.ll b/llvm/test/Transforms/ObjCARC/nested.ll
index d03cbd5f54e71..8bcbf3f71196e 100644
--- a/llvm/test/Transforms/ObjCARC/nested.ll
+++ b/llvm/test/Transforms/ObjCARC/nested.ll
@@ -13,6 +13,7 @@ declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
declare ptr @llvm.objc.retain(ptr)
declare void @llvm.objc.enumerationMutation(ptr)
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0.i64(ptr nocapture, i8, i64, i1) nounwind
declare ptr @objc_msgSend(ptr, ptr, ...) nonlazybind
declare void @use(ptr)
declare void @llvm.objc.release(ptr)
@@ -86,6 +87,67 @@ forcoll.empty:
ret void
}
+; CHECK-LABEL: define void @test1(
+; CHECK: call ptr @llvm.objc.retain
+; CHECK-NOT: @llvm.objc.retain
+; CHECK: }
+define void @test1(ptr %a) nounwind {
+entry:
+ %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
+ %items.ptr = alloca [16 x ptr], align 8
+ %0 = call ptr @llvm.objc.retain(ptr %a) nounwind
+ call void @llvm.memset.inline.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+ %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+ %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+ %call = call i64 @objc_msgSend(ptr %1, ptr %tmp2, ptr %state.ptr, ptr %items.ptr, i64 16)
+ %iszero = icmp eq i64 %call, 0
+ br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
+
+forcoll.loopinit:
+ %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+ %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+ %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+ %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
+ br label %forcoll.loopbody.outer
+
+forcoll.loopbody.outer:
+ %forcoll.count.ph = phi i64 [ %call, %forcoll.loopinit ], [ %call6, %forcoll.refetch ]
+ %tmp7 = icmp ugt i64 %forcoll.count.ph, 1
+ %umax = select i1 %tmp7, i64 %forcoll.count.ph, i64 1
+ br label %forcoll.loopbody
+
+forcoll.loopbody:
+ %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.notmutated ]
+ %mutationsptr3 = load ptr, ptr %mutationsptr.ptr, align 8
+ %statemutations = load i64, ptr %mutationsptr3, align 8
+ %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
+ br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
+
+forcoll.mutated:
+ call void @llvm.objc.enumerationMutation(ptr %1)
+ br label %forcoll.notmutated
+
+forcoll.notmutated:
+ %stateitems = load ptr, ptr %stateitems.ptr, align 8
+ %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+ %3 = load ptr, ptr %currentitem.ptr, align 8
+ call void @use(ptr %3)
+ %4 = add i64 %forcoll.index, 1
+ %exitcond = icmp eq i64 %4, %umax
+ br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
+
+forcoll.refetch:
+ %tmp5 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+ %call6 = call i64 @objc_msgSend(ptr %1, ptr %tmp5, ptr %state.ptr, ptr %items.ptr, i64 16)
+ %5 = icmp eq i64 %call6, 0
+ br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
+
+forcoll.empty:
+ call void @llvm.objc.release(ptr %1) nounwind
+ call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
+ ret void
+}
+
; Delete a nested retain+release pair.
; CHECK-LABEL: define void @test2(
More information about the llvm-commits
mailing list