mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-24 03:25:00 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312266 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3143eac5c5
commit
fec731bad8
@ -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();
|
||||
|
||||
|
@ -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 }
|
||||
|
Loading…
x
Reference in New Issue
Block a user