1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -objc-arc < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; rdar://10210274 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker%0 = type opaque 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare i8* @objc_retain(i8*) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare void @objc_release(i8*) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdeclare i8* @objc_autoreleaseReturnValue(i8*) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; Don't delete the autorelease. 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define %0* @test0( 15*9880d681SAndroid Build Coastguard Worker; CHECK: @objc_retain 16*9880d681SAndroid Build Coastguard Worker; CHECK: .lr.ph: 17*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @objc_r 18*9880d681SAndroid Build Coastguard Worker; CHECK: @objc_autoreleaseReturnValue 19*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @objc_ 20*9880d681SAndroid Build Coastguard Worker; CHECK: } 21*9880d681SAndroid Build Coastguard Workerdefine %0* @test0(%0* %buffer) nounwind { 22*9880d681SAndroid Build Coastguard Worker %1 = bitcast %0* %buffer to i8* 23*9880d681SAndroid Build Coastguard Worker %2 = tail call i8* @objc_retain(i8* %1) nounwind 24*9880d681SAndroid Build Coastguard Worker br i1 undef, label %.lr.ph, label %._crit_edge 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker.lr.ph: ; preds = %.lr.ph, %0 27*9880d681SAndroid Build Coastguard Worker br i1 false, label %.lr.ph, label %._crit_edge 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker._crit_edge: ; preds = %.lr.ph, %0 30*9880d681SAndroid Build Coastguard Worker %3 = tail call i8* @objc_retain(i8* %1) nounwind 31*9880d681SAndroid Build Coastguard Worker tail call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 32*9880d681SAndroid Build Coastguard Worker %4 = tail call i8* @objc_autoreleaseReturnValue(i8* %1) nounwind 33*9880d681SAndroid Build Coastguard Worker ret %0* %buffer 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Do delete the autorelease, even with the retain in a different block. 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define %0* @test1( 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @objc 40*9880d681SAndroid Build Coastguard Worker; CHECK: } 41*9880d681SAndroid Build Coastguard Workerdefine %0* @test1() nounwind { 42*9880d681SAndroid Build Coastguard Worker %buffer = call %0* @foo() 43*9880d681SAndroid Build Coastguard Worker %1 = bitcast %0* %buffer to i8* 44*9880d681SAndroid Build Coastguard Worker %2 = tail call i8* @objc_retain(i8* %1) nounwind 45*9880d681SAndroid Build Coastguard Worker br i1 undef, label %.lr.ph, label %._crit_edge 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker.lr.ph: ; preds = %.lr.ph, %0 48*9880d681SAndroid Build Coastguard Worker br i1 false, label %.lr.ph, label %._crit_edge 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker._crit_edge: ; preds = %.lr.ph, %0 51*9880d681SAndroid Build Coastguard Worker %3 = tail call i8* @objc_retain(i8* %1) nounwind 52*9880d681SAndroid Build Coastguard Worker tail call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 53*9880d681SAndroid Build Coastguard Worker %4 = tail call i8* @objc_autoreleaseReturnValue(i8* %1) nounwind 54*9880d681SAndroid Build Coastguard Worker ret %0* %buffer 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdeclare %0* @foo() 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker!0 = !{} 60