1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -objc-arc < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare void @use_pointer(i8*) 4*9880d681SAndroid Build Coastguard Workerdeclare i8* @returner() 5*9880d681SAndroid Build Coastguard Workerdeclare i8* @objc_retain(i8*) 6*9880d681SAndroid Build Coastguard Workerdeclare i8* @objc_autoreleaseReturnValue(i8*) 7*9880d681SAndroid Build Coastguard Workerdeclare i8* @objc_retainAutoreleasedReturnValue(i8*) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Clean up residue left behind after inlining. 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test0( 12*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 15*9880d681SAndroid Build Coastguard Workerdefine void @test0(i8* %call.i) { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker %0 = tail call i8* @objc_retain(i8* %call.i) nounwind 18*9880d681SAndroid Build Coastguard Worker %1 = tail call i8* @objc_autoreleaseReturnValue(i8* %0) nounwind 19*9880d681SAndroid Build Coastguard Worker ret void 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; Same as test0, but with slightly different use arrangements. 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test1( 25*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 28*9880d681SAndroid Build Coastguard Workerdefine void @test1(i8* %call.i) { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker %0 = tail call i8* @objc_retain(i8* %call.i) nounwind 31*9880d681SAndroid Build Coastguard Worker %1 = tail call i8* @objc_autoreleaseReturnValue(i8* %call.i) nounwind 32*9880d681SAndroid Build Coastguard Worker ret void 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; Delete a retainRV+autoreleaseRV even if the pointer is used. 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test24( 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @use_pointer(i8* %p) 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 42*9880d681SAndroid Build Coastguard Workerdefine void @test24(i8* %p) { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker call i8* @objc_autoreleaseReturnValue(i8* %p) nounwind 45*9880d681SAndroid Build Coastguard Worker call i8* @objc_retainAutoreleasedReturnValue(i8* %p) nounwind 46*9880d681SAndroid Build Coastguard Worker call void @use_pointer(i8* %p) 47*9880d681SAndroid Build Coastguard Worker ret void 48*9880d681SAndroid Build Coastguard Worker} 49