1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

[ObjCARC] Pass the correct BasicBlock to fix assertion failure.

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

llvm-svn: 312266
This commit is contained in:
Akira Hatanaka 2017-08-31 18:27:47 +00:00
parent 42c442cdf3
commit 149ba0c692
2 changed files with 21 additions and 1 deletions

View File

@ -2027,7 +2027,8 @@ void ObjCARCOpt::OptimizeReturns(Function &F) {
continue;
CallInst *Retain = FindPredecessorRetainWithSafePath(
Arg, &BB, Autorelease, DependingInstructions, Visited, PA);
Arg, Autorelease->getParent(), Autorelease, DependingInstructions,
Visited, PA);
DependingInstructions.clear();
Visited.clear();

View File

@ -314,6 +314,25 @@ define void @test25() {
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 }