Lines Matching +full:- +full:release

1 ; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s
3 target datalayout = "e-p:64:64:64"
6 declare void @llvm.objc.release(ptr)
11 ; CHECK-LABEL: define void @test0(
13 ; CHECK-NEXT: tail call void @llvm.objc.storeStrong(ptr @x, ptr %p) [[NUW:#[0-9]+]]
14 ; CHECK-NEXT: ret void
15 ; CHECK-NEXT: }
21 tail call void @llvm.objc.release(ptr %tmp) nounwind
27 ; CHECK-LABEL: define void @test1(ptr %p) {
28 ; CHECK-NEXT: entry:
29 ; CHECK-NEXT: %0 = tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
30 ; CHECK-NEXT: %tmp = load volatile ptr, ptr @x, align 8
31 ; CHECK-NEXT: store ptr %0, ptr @x, align 8
32 ; CHECK-NEXT: tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
33 ; CHECK-NEXT: ret void
34 ; CHECK-NEXT: }
40 tail call void @llvm.objc.release(ptr %tmp) nounwind
46 ; CHECK-LABEL: define void @test2(ptr %p) {
47 ; CHECK-NEXT: entry:
48 ; CHECK-NEXT: %0 = tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
49 ; CHECK-NEXT: %tmp = load ptr, ptr @x, align 8
50 ; CHECK-NEXT: store volatile ptr %0, ptr @x, align 8
51 ; CHECK-NEXT: tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
52 ; CHECK-NEXT: ret void
53 ; CHECK-NEXT: }
59 tail call void @llvm.objc.release(ptr %tmp) nounwind
64 ; and the release.
66 ; CHECK-LABEL: define void @test3(ptr %newValue) {
67 ; CHECK-NEXT: entry:
68 ; CHECK-NEXT: %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) [[NUW]]
69 ; CHECK-NEXT: %x1 = load ptr, ptr @x, align 8
70 ; CHECK-NEXT: store ptr %x0, ptr @x, align 8
71 ; CHECK-NEXT: tail call void @use_pointer(ptr %x1), !clang.arc.no_objc_arc_exceptions !0
72 ; CHECK-NEXT: tail call void @llvm.objc.release(ptr %x1) [[NUW]], !clang.imprecise_release !0
73 ; CHECK-NEXT: ret void
74 ; CHECK-NEXT: }
81 tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
87 ; CHECK-LABEL: define i1 @test4(ptr %newValue, ptr %foo) {
88 ; CHECK-NEXT: entry:
89 ; CHECK-NEXT: %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) [[NUW]]
90 ; CHECK-NEXT: %x1 = load ptr, ptr @x, align 8
91 ; CHECK-NEXT: store ptr %x0, ptr @x, align 8
92 ; CHECK-NEXT: %t = icmp eq ptr %x1, %foo
93 ; CHECK-NEXT: tail call void @llvm.objc.release(ptr %x1) [[NUW]], !clang.imprecise_release !0
94 ; CHECK-NEXT: ret i1 %t
95 ; CHECK-NEXT: }
102 tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
108 ; CHECK-LABEL: define i1 @test5(ptr %newValue, ptr %foo) {
118 tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
122 ; Like test5, but the release is before the store.
124 ; CHECK-LABEL: define i1 @test6(ptr %newValue, ptr %foo) {
132 tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
140 ; CHECK-LABEL: define void @test7(
141 ; CHECK-NEXT: entry:
142 ; CHECK-NEXT: %0 = tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
143 ; CHECK-NEXT: %tmp = load ptr, ptr @x, align 8
144 ; CHECK-NEXT: tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
145 ; CHECK-NEXT: ret void
146 ; CHECK-NEXT: }
151 tail call void @llvm.objc.release(ptr %tmp) nounwind
157 ; CHECK-LABEL: define void @test8(
158 ; CHECK-NEXT: entry:
159 ; CHECK-NEXT: %tmp = load ptr, ptr @x, align 8
160 ; CHECK-NEXT: store ptr %p, ptr @x, align 8
161 ; CHECK-NEXT: tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
162 ; CHECK-NEXT: ret void
163 ; CHECK-NEXT: }
168 tail call void @llvm.objc.release(ptr %tmp) nounwind
172 ; Make sure that we properly handle release that *may* release our new
175 ; makes sure that we properly handled a release of an unrelated
178 ; CHECK-LABEL: define i1 @test9(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
179 ; CHECK-NOT: llvm.objc.storeStrong
183 tail call void @llvm.objc.release(ptr %unrelated_ptr) nounwind, !clang.imprecise_release !0
185 tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
193 ; CHECK-LABEL: define i1 @test10(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
194 ; CHECK-NOT: llvm.objc.storeStrong
200 tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
208 ; CHECK-LABEL: define i1 @test11(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
215 tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
222 ; CHECK-LABEL: define void @test12(
224 ; CHECK-NEXT: %p16 = bitcast ptr @x to ptr
225 ; CHECK-NEXT: %tmp16 = load ptr, ptr %p16, align 8
226 ; CHECK-NEXT: %tmp8 = bitcast ptr %tmp16 to ptr
227 ; CHECK-NEXT: %p32 = bitcast ptr @x to ptr
228 ; CHECK-NEXT: %v32 = bitcast ptr %p to ptr
229 ; CHECK-NEXT: tail call void @llvm.objc.storeStrong(ptr %p16, ptr %p)
230 ; CHECK-NEXT: ret void
231 ; CHECK-NEXT: }
241 tail call void @llvm.objc.release(ptr %tmp8) nounwind
246 ; CHECK-LABEL: define ptr @test13(
248 ; CHECK-NEXT: ret ptr %[[NEW]]
252 call void @llvm.objc.release(ptr %old)
258 ; Cannot form a storeStrong call because it's unsafe to move the release call to
261 ; CHECK-LABEL: define void @test14(
266 ; CHECK: call void @llvm.objc.release(ptr %[[V2]])
273 call void @llvm.objc.release(ptr %v0)