The BasicBlock passed to FindPredecessorRetainWithSafePath should be the
parent block of Autorelease. This fixes a crash that occurs in
FindDependencies when StartInst is not in StartBB.
rdar://problem/
33866381
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312266
91177308-0d34-0410-b5e6-
96231b3b80d8
continue;
CallInst *Retain = FindPredecessorRetainWithSafePath(
- Arg, &BB, Autorelease, DependingInstructions, Visited, PA);
+ Arg, Autorelease->getParent(), Autorelease, DependingInstructions,
+ Visited, PA);
DependingInstructions.clear();
Visited.clear();
ret void
}
+; Check that ObjCARCOpt::OptimizeReturns removes the redundant calls even when
+; they are not in the same basic block. This code used to cause an assertion
+; failure.
+
+; CHECK-LABEL: define i8* @test26()
+; CHECK: call i8* @returner()
+; CHECK-NOT: call
+define i8* @test26() {
+bb0:
+ %v0 = call i8* @returner()
+ %v1 = tail call i8* @objc_retain(i8* %v0)
+ br label %bb1
+bb1:
+ %v2 = tail call i8* @objc_autoreleaseReturnValue(i8* %v1)
+ br label %bb2
+bb2:
+ ret i8* %v2
+}
+
!0 = !{}
; CHECK: attributes [[NUW]] = { nounwind }