| ; RUN: opt -passes=objc-arc-expand -S < %s | FileCheck %s |
| |
| target datalayout = "e-p:64:64:64" |
| |
| declare ptr @llvm.objc.retain(ptr) |
| declare ptr @llvm.objc.autorelease(ptr) |
| declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr) |
| declare ptr @llvm.objc.autoreleaseReturnValue(ptr) |
| declare ptr @llvm.objc.retainAutorelease(ptr) |
| declare ptr @llvm.objc.retainAutoreleaseReturnValue(ptr) |
| declare ptr @llvm.objc.retainBlock(ptr) |
| |
| declare void @use_pointer(ptr) |
| |
| ; CHECK: define void @test_retain(ptr %x) [[NUW:#[0-9]+]] { |
| ; CHECK: call ptr @llvm.objc.retain(ptr %x) |
| ; CHECK: call void @use_pointer(ptr %x) |
| ; CHECK: } |
| define void @test_retain(ptr %x) nounwind { |
| entry: |
| %0 = call ptr @llvm.objc.retain(ptr %x) nounwind |
| call void @use_pointer(ptr %0) |
| ret void |
| } |
| |
| ; CHECK: define void @test_retainAutoreleasedReturnValue(ptr %x) [[NUW]] { |
| ; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x) |
| ; CHECK: call void @use_pointer(ptr %x) |
| ; CHECK: } |
| define void @test_retainAutoreleasedReturnValue(ptr %x) nounwind { |
| entry: |
| %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x) nounwind |
| call void @use_pointer(ptr %0) |
| ret void |
| } |
| |
| ; CHECK: define void @test_retainAutorelease(ptr %x) [[NUW]] { |
| ; CHECK: call ptr @llvm.objc.retainAutorelease(ptr %x) |
| ; CHECK: call void @use_pointer(ptr %x) |
| ; CHECK: } |
| define void @test_retainAutorelease(ptr %x) nounwind { |
| entry: |
| %0 = call ptr @llvm.objc.retainAutorelease(ptr %x) nounwind |
| call void @use_pointer(ptr %0) |
| ret void |
| } |
| |
| ; CHECK: define void @test_retainAutoreleaseReturnValue(ptr %x) [[NUW]] { |
| ; CHECK: call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %x) |
| ; CHECK: call void @use_pointer(ptr %x) |
| ; CHECK: } |
| define void @test_retainAutoreleaseReturnValue(ptr %x) nounwind { |
| entry: |
| %0 = call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %x) nounwind |
| call void @use_pointer(ptr %0) |
| ret void |
| } |
| |
| ; CHECK: define void @test_autorelease(ptr %x) [[NUW]] { |
| ; CHECK: call ptr @llvm.objc.autorelease(ptr %x) |
| ; CHECK: call void @use_pointer(ptr %x) |
| ; CHECK: } |
| define void @test_autorelease(ptr %x) nounwind { |
| entry: |
| %0 = call ptr @llvm.objc.autorelease(ptr %x) nounwind |
| call void @use_pointer(ptr %0) |
| ret void |
| } |
| |
| ; CHECK: define void @test_autoreleaseReturnValue(ptr %x) [[NUW]] { |
| ; CHECK: call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) |
| ; CHECK: call void @use_pointer(ptr %x) |
| ; CHECK: } |
| define void @test_autoreleaseReturnValue(ptr %x) nounwind { |
| entry: |
| %0 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind |
| call void @use_pointer(ptr %0) |
| ret void |
| } |
| |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| ; RetainBlock is not strictly forwarding. Do not touch it. ; |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| |
| ; CHECK: define void @test_retainBlock(ptr %x) [[NUW]] { |
| ; CHECK: call ptr @llvm.objc.retainBlock(ptr %x) |
| ; CHECK: call void @use_pointer(ptr %0) |
| ; CHECK: } |
| define void @test_retainBlock(ptr %x) nounwind { |
| entry: |
| %0 = call ptr @llvm.objc.retainBlock(ptr %x) nounwind |
| call void @use_pointer(ptr %0) |
| ret void |
| } |