[llvm] ObjCARC: Fix regression from using ConstantData uselists (PR #139609)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon May 12 12:41:47 PDT 2025
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/139609
Fixes regression after 9383fb23e18bb983d0024fb956a0a724ef9eb03d
>From e926b1fb56684e761c9309986fc20130e7dba4a1 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 12 May 2025 21:28:20 +0200
Subject: [PATCH] ObjCARC: Fix regression from using ConstantData uselists
Fixes regression after 9383fb23e18bb983d0024fb956a0a724ef9eb03d
---
.../Transforms/ObjCARC/ProvenanceAnalysis.cpp | 3 ++
.../Transforms/ObjCARC/pr138961-regression.ll | 42 +++++++++++++++++++
2 files changed, 45 insertions(+)
create mode 100644 llvm/test/Transforms/ObjCARC/pr138961-regression.ll
diff --git a/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp b/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp
index 155c9493e838f..e491e5dcbefbb 100644
--- a/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp
+++ b/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp
@@ -78,6 +78,9 @@ bool ProvenanceAnalysis::relatedPHI(const PHINode *A,
/// Test if the value of P, or any value covered by its provenance, is ever
/// stored within the function (not counting callees).
static bool IsStoredObjCPointer(const Value *P) {
+ if (!P->hasUseList())
+ return true; // Assume the worst for a constant pointer.
+
SmallPtrSet<const Value *, 8> Visited;
SmallVector<const Value *, 8> Worklist;
Worklist.push_back(P);
diff --git a/llvm/test/Transforms/ObjCARC/pr138961-regression.ll b/llvm/test/Transforms/ObjCARC/pr138961-regression.ll
new file mode 100644
index 0000000000000..c9a2275e22d74
--- /dev/null
+++ b/llvm/test/Transforms/ObjCARC/pr138961-regression.ll
@@ -0,0 +1,42 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -S -passes=objc-arc < %s | FileCheck %s
+
+target triple = "x86_64-apple-macosx11.0.0"
+
+declare ptr @llvm.objc.retain(ptr returned) #0
+declare void @llvm.objc.release(ptr) #0
+
+declare ptr @foo(ptr)
+
+define i1 @_ZN8GrMtlGpu20readOrTransferPixelsEP9GrSurface7SkIRect11GrColorTypePU19objcproto9MTLBuffer11objc_objectmmm(ptr %this) #1 {
+; CHECK-LABEL: define i1 @_ZN8GrMtlGpu20readOrTransferPixelsEP9GrSurface7SkIRect11GrColorTypePU19objcproto9MTLBuffer11objc_objectmmm(
+; CHECK-SAME: ptr [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[RETAIN:%.*]] = tail call ptr @llvm.objc.retain(ptr [[THIS]]) #[[ATTR0:[0-9]+]]
+; CHECK-NEXT: br i1 false, label %[[CLEANUP66:.*]], label %[[IF_END30:.*]]
+; CHECK: [[IF_END30]]:
+; CHECK-NEXT: [[LD_PTR:%.*]] = load ptr, ptr [[THIS]], align 8
+; CHECK-NEXT: call void @foo(ptr [[LD_PTR]])
+; CHECK-NEXT: br label %[[CLEANUP66]]
+; CHECK: [[CLEANUP66]]:
+; CHECK-NEXT: [[MTLTEXTURE_1103:%.*]] = phi ptr [ null, %[[ENTRY]] ], [ [[THIS]], %[[IF_END30]] ]
+; CHECK-NEXT: tail call void @llvm.objc.release(ptr [[MTLTEXTURE_1103]]) #[[ATTR0]]
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %retain = tail call ptr @llvm.objc.retain(ptr %this)
+ br i1 false, label %cleanup66, label %if.end30
+
+if.end30: ; preds = %entry
+ %ld.ptr = load ptr, ptr %this, align 8
+ call void @foo(ptr %ld.ptr)
+ br label %cleanup66
+
+cleanup66: ; preds = %if.end30, %entry
+ %mtlTexture.1103 = phi ptr [ null, %entry ], [ %this, %if.end30 ]
+ tail call void @llvm.objc.release(ptr %mtlTexture.1103)
+ ret i1 false
+}
+
+attributes #0 = { nounwind }
+attributes #1 = { null_pointer_is_valid }
More information about the llvm-commits
mailing list