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 Visited; SmallVector 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 }