[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / ObjCARC / expand.ll
blob07b412fa37be0c27e4df53be7b838597fa146d93
1 ; RUN: opt -objc-arc-expand -S < %s | FileCheck %s
2 ; RUN: opt -passes=objc-arc-expand -S < %s | FileCheck %s
4 target datalayout = "e-p:64:64:64"
6 declare i8* @llvm.objc.retain(i8*)
7 declare i8* @llvm.objc.autorelease(i8*)
8 declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
9 declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
10 declare i8* @llvm.objc.retainAutorelease(i8*)
11 declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*)
12 declare i8* @llvm.objc.retainBlock(i8*)
14 declare void @use_pointer(i8*)
16 ; CHECK: define void @test_retain(i8* %x) [[NUW:#[0-9]+]] {
17 ; CHECK: call i8* @llvm.objc.retain(i8* %x)
18 ; CHECK: call void @use_pointer(i8* %x)
19 ; CHECK: }
20 define void @test_retain(i8* %x) nounwind {
21 entry:
22   %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
23   call void @use_pointer(i8* %0)
24   ret void
27 ; CHECK: define void @test_retainAutoreleasedReturnValue(i8* %x) [[NUW]] {
28 ; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x)
29 ; CHECK: call void @use_pointer(i8* %x)
30 ; CHECK: }
31 define void @test_retainAutoreleasedReturnValue(i8* %x) nounwind {
32 entry:
33   %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x) nounwind
34   call void @use_pointer(i8* %0)
35   ret void
38 ; CHECK: define void @test_retainAutorelease(i8* %x) [[NUW]] {
39 ; CHECK: call i8* @llvm.objc.retainAutorelease(i8* %x)
40 ; CHECK: call void @use_pointer(i8* %x)
41 ; CHECK: }
42 define void @test_retainAutorelease(i8* %x) nounwind {
43 entry:
44   %0 = call i8* @llvm.objc.retainAutorelease(i8* %x) nounwind
45   call void @use_pointer(i8* %0)
46   ret void
49 ; CHECK: define void @test_retainAutoreleaseReturnValue(i8* %x) [[NUW]] {
50 ; CHECK: call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x)
51 ; CHECK: call void @use_pointer(i8* %x)
52 ; CHECK: }
53 define void @test_retainAutoreleaseReturnValue(i8* %x) nounwind {
54 entry:
55   %0 = call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x) nounwind
56   call void @use_pointer(i8* %0)
57   ret void
60 ; CHECK: define void @test_autorelease(i8* %x) [[NUW]] {
61 ; CHECK: call i8* @llvm.objc.autorelease(i8* %x)
62 ; CHECK: call void @use_pointer(i8* %x)
63 ; CHECK: }
64 define void @test_autorelease(i8* %x) nounwind {
65 entry:
66   %0 = call i8* @llvm.objc.autorelease(i8* %x) nounwind
67   call void @use_pointer(i8* %0)
68   ret void
71 ; CHECK: define void @test_autoreleaseReturnValue(i8* %x) [[NUW]] {
72 ; CHECK: call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
73 ; CHECK: call void @use_pointer(i8* %x)
74 ; CHECK: }
75 define void @test_autoreleaseReturnValue(i8* %x) nounwind {
76 entry:
77   %0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
78   call void @use_pointer(i8* %0)
79   ret void
82 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
83 ; RetainBlock is not strictly forwarding. Do not touch it. ;
84 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
86 ; CHECK: define void @test_retainBlock(i8* %x) [[NUW]] {
87 ; CHECK: call i8* @llvm.objc.retainBlock(i8* %x)
88 ; CHECK: call void @use_pointer(i8* %0)
89 ; CHECK: }
90 define void @test_retainBlock(i8* %x) nounwind {
91 entry:
92   %0 = call i8* @llvm.objc.retainBlock(i8* %x) nounwind
93   call void @use_pointer(i8* %0)
94   ret void