]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Transforms/ObjCARC/invoke.ll
Vendor import of llvm trunk r135360:
[FreeBSD/FreeBSD.git] / test / Transforms / ObjCARC / invoke.ll
1 ; RUN: opt -S -objc-arc < %s | FileCheck %s
2
3 declare i8* @objc_retain(i8*)
4 declare void @objc_release(i8*)
5 declare i8* @objc_msgSend(i8*, i8*, ...)
6 declare void @use_pointer(i8*)
7 declare void @callee()
8
9 ; ARCOpt shouldn't try to move the releases to the block containing the invoke.
10
11 ; CHECK: define void @test0(
12 ; CHECK: invoke.cont:
13 ; CHECK:   call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0
14 ; CHECK:   ret void
15 ; CHECK: lpad:
16 ; CHECK:   call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0
17 ; CHECK:   ret void
18 define void @test0(i8* %zipFile) {
19 entry:
20   call i8* @objc_retain(i8* %zipFile) nounwind
21   call void @use_pointer(i8* %zipFile)
22   invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile) 
23           to label %invoke.cont unwind label %lpad
24
25 invoke.cont:                                      ; preds = %entry
26   call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0
27   ret void
28
29 lpad:                                             ; preds = %entry
30   call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0
31   ret void
32 }
33
34 ; ARCOpt should move the release before the callee calls.
35
36 ; CHECK: define void @test1(
37 ; CHECK: invoke.cont:
38 ; CHECK:   call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0
39 ; CHECK:   call void @callee()
40 ; CHECK:   br label %done
41 ; CHECK: lpad:
42 ; CHECK:   call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0
43 ; CHECK:   call void @callee()
44 ; CHECK:   br label %done
45 ; CHECK: done:
46 ; CHECK-NEXT: ret void
47 define void @test1(i8* %zipFile) {
48 entry:
49   call i8* @objc_retain(i8* %zipFile) nounwind
50   call void @use_pointer(i8* %zipFile)
51   invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile)
52           to label %invoke.cont unwind label %lpad
53
54 invoke.cont:                                      ; preds = %entry
55   call void @callee()
56   br label %done
57
58 lpad:                                             ; preds = %entry
59   call void @callee()
60   br label %done
61
62 done:
63   call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0
64   ret void
65 }
66
67 !0 = metadata !{}