[llvm] 6d35ec2 - ObjCARC: Fix regression from using ConstantData uselists (#139609)

via llvm-commits llvm-commits at lists.llvm.org
Tue May 13 01:52:52 PDT 2025


Author: Matt Arsenault
Date: 2025-05-13T10:52:49+02:00
New Revision: 6d35ec233525f278cbe06ff3cd49ea276825817f

URL: https://github.com/llvm/llvm-project/commit/6d35ec233525f278cbe06ff3cd49ea276825817f
DIFF: https://github.com/llvm/llvm-project/commit/6d35ec233525f278cbe06ff3cd49ea276825817f.diff

LOG: ObjCARC: Fix regression from using ConstantData uselists (#139609)

Fixes regression after 9383fb23e18bb983d0024fb956a0a724ef9eb03d

Added: 
    llvm/test/Transforms/ObjCARC/pr138961-regression.ll

Modified: 
    llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp

Removed: 
    


################################################################################
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