An objc_retain can serve as a may-use for a different pointer.

rdar://11931823.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160637 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2012-07-23 19:27:31 +00:00
parent ec5e97f5c8
commit c72d3be389
2 changed files with 28 additions and 1 deletions

View File

@ -2829,7 +2829,10 @@ ObjCARCOpt::VisitInstructionTopDown(Instruction *Inst,
}
S.IncrementNestCount();
return NestingDetected;
// A retain can be a potential use; procede to the generic checking
// code below.
break;
}
case IC_Release: {
Arg = GetObjCArg(Inst);

View File

@ -1871,6 +1871,30 @@ return: ; preds = %if.then, %entry
ret i8* %retval
}
; An objc_retain can serve as a may-use for a different pointer.
; rdar://11931823
; CHECK: define void @test66(
; CHECK: %tmp7 = tail call i8* @objc_retain(i8* %cond) nounwind
; CHECK: tail call void @objc_release(i8* %cond) nounwind
; CHECK: }
define void @test66(i8* %tmp5, i8* %bar, i1 %tobool, i1 %tobool1, i8* %call) {
entry:
br i1 %tobool, label %cond.true, label %cond.end
cond.true:
br label %cond.end
cond.end: ; preds = %cond.true, %entry
%cond = phi i8* [ %tmp5, %cond.true ], [ %call, %entry ]
%tmp7 = tail call i8* @objc_retain(i8* %cond) nounwind
tail call void @objc_release(i8* %call) nounwind
%tmp8 = select i1 %tobool1, i8* %cond, i8* %bar
%tmp9 = tail call i8* @objc_retain(i8* %tmp8) nounwind
tail call void @objc_release(i8* %cond) nounwind
ret void
}
declare void @bar(i32 ()*)
; A few real-world testcases.