1; RUN: opt -objc-arc-expand -S < %s | FileCheck %s 2 3target datalayout = "e-p:64:64:64" 4 5declare i8* @llvm.objc.retain(i8*) 6declare i8* @llvm.objc.autorelease(i8*) 7declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) 8declare i8* @llvm.objc.autoreleaseReturnValue(i8*) 9declare i8* @llvm.objc.retainAutorelease(i8*) 10declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*) 11declare i8* @llvm.objc.retainBlock(i8*) 12 13declare void @use_pointer(i8*) 14 15; CHECK: define void @test_retain(i8* %x) [[NUW:#[0-9]+]] { 16; CHECK: call i8* @llvm.objc.retain(i8* %x) 17; CHECK: call void @use_pointer(i8* %x) 18; CHECK: } 19define void @test_retain(i8* %x) nounwind { 20entry: 21 %0 = call i8* @llvm.objc.retain(i8* %x) nounwind 22 call void @use_pointer(i8* %0) 23 ret void 24} 25 26; CHECK: define void @test_retainAutoreleasedReturnValue(i8* %x) [[NUW]] { 27; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x) 28; CHECK: call void @use_pointer(i8* %x) 29; CHECK: } 30define void @test_retainAutoreleasedReturnValue(i8* %x) nounwind { 31entry: 32 %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x) nounwind 33 call void @use_pointer(i8* %0) 34 ret void 35} 36 37; CHECK: define void @test_retainAutorelease(i8* %x) [[NUW]] { 38; CHECK: call i8* @llvm.objc.retainAutorelease(i8* %x) 39; CHECK: call void @use_pointer(i8* %x) 40; CHECK: } 41define void @test_retainAutorelease(i8* %x) nounwind { 42entry: 43 %0 = call i8* @llvm.objc.retainAutorelease(i8* %x) nounwind 44 call void @use_pointer(i8* %0) 45 ret void 46} 47 48; CHECK: define void @test_retainAutoreleaseReturnValue(i8* %x) [[NUW]] { 49; CHECK: call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x) 50; CHECK: call void @use_pointer(i8* %x) 51; CHECK: } 52define void @test_retainAutoreleaseReturnValue(i8* %x) nounwind { 53entry: 54 %0 = call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x) nounwind 55 call void @use_pointer(i8* %0) 56 ret void 57} 58 59; CHECK: define void @test_autorelease(i8* %x) [[NUW]] { 60; CHECK: call i8* @llvm.objc.autorelease(i8* %x) 61; CHECK: call void @use_pointer(i8* %x) 62; CHECK: } 63define void @test_autorelease(i8* %x) nounwind { 64entry: 65 %0 = call i8* @llvm.objc.autorelease(i8* %x) nounwind 66 call void @use_pointer(i8* %0) 67 ret void 68} 69 70; CHECK: define void @test_autoreleaseReturnValue(i8* %x) [[NUW]] { 71; CHECK: call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) 72; CHECK: call void @use_pointer(i8* %x) 73; CHECK: } 74define void @test_autoreleaseReturnValue(i8* %x) nounwind { 75entry: 76 %0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind 77 call void @use_pointer(i8* %0) 78 ret void 79} 80 81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 82; RetainBlock is not strictly forwarding. Do not touch it. ; 83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 84 85; CHECK: define void @test_retainBlock(i8* %x) [[NUW]] { 86; CHECK: call i8* @llvm.objc.retainBlock(i8* %x) 87; CHECK: call void @use_pointer(i8* %0) 88; CHECK: } 89define void @test_retainBlock(i8* %x) nounwind { 90entry: 91 %0 = call i8* @llvm.objc.retainBlock(i8* %x) nounwind 92 call void @use_pointer(i8* %0) 93 ret void 94} 95