8
8
; RUN: llvm-dis < %S/upgrade-arc-runtime-calls.bc | FileCheck -check-prefixes=ARC %s
9
9
; RUN: llvm-dis < %S/upgrade-mrr-runtime-calls.bc | FileCheck -check-prefixes=MRR %s
10
10
11
- define void @testRuntimeCalls (i8* %a , i8** %b , i8** %c , i32* %d , i32** %e ) personality i32 (...)* @__gxx_personality_v0 {
12
- entry:
13
- %v0 = tail call i8* @objc_autorelease (i8* %a ) #0
14
- tail call void @objc_autoreleasePoolPop (i8* %a ) #0
15
- %v1 = tail call i8* @objc_autoreleasePoolPush () #0
16
- %v2 = tail call i8* @objc_autoreleaseReturnValue (i8* %a ) #0
17
- tail call void @objc_copyWeak (i8** %b , i8** %c ) #0
18
- tail call void @objc_destroyWeak (i8** %b ) #0
19
- %v3 = tail call i32* @objc_initWeak (i32** %e , i32* %d ) #0
20
- %v4 = tail call i8* @objc_loadWeak (i8** %b ) #0
21
- %v5 = tail call i8* @objc_loadWeakRetained (i8** %b ) #0
22
- tail call void @objc_moveWeak (i8** %b , i8** %c ) #0
23
- tail call void @objc_release (i8* %a ) #0
24
- %v6 = tail call i8* @objc_retain (i8* %a ) #0
25
- %v7 = tail call i8* @objc_retainAutorelease (i8* %a ) #0
26
- %v8 = tail call i8* @objc_retainAutoreleaseReturnValue (i8* %a ) #0
27
- %v9 = tail call i8* @objc_retainAutoreleasedReturnValue (i8* %a ) #0
28
- %v10 = tail call i8* @objc_retainBlock (i8* %a ) #0
29
- tail call void @objc_storeStrong (i8** %b , i8* %a ) #0
30
- %v11 = tail call i8* @objc_storeWeak (i8** %b , i8* %a ) #0
31
- tail call void (...) @clang.arc.use (i8* %a ) #0
32
- %v12 = tail call i8* @objc_unsafeClaimAutoreleasedReturnValue (i8* %a ) #0
33
- %v13 = tail call i8* @objc_retainedObject (i8* %a ) #0
34
- %v14 = tail call i8* @objc_unretainedObject (i8* %a ) #0
35
- %v15 = tail call i8* @objc_unretainedPointer (i8* %a ) #0
36
- %v16 = tail call i8* @objc_retain.autorelease (i8* %a ) #0
37
- %v17 = tail call i32 @objc_sync.enter (i8* %a ) #0
38
- %v18 = tail call i32 @objc_sync.exit (i8* %a ) #0
39
- tail call void @objc_arc_annotation_topdown_bbstart (i8** %b , i8** %c ) #0
40
- tail call void @objc_arc_annotation_topdown_bbend (i8** %b , i8** %c ) #0
41
- tail call void @objc_arc_annotation_bottomup_bbstart (i8** %b , i8** %c ) #0
42
- tail call void @objc_arc_annotation_bottomup_bbend (i8** %b , i8** %c ) #0
43
- invoke void @objc_autoreleasePoolPop (i8* %a )
44
- to label %normalBlock unwind label %unwindBlock
45
- normalBlock:
46
- ret void
47
- unwindBlock:
48
- %ll = landingpad { i8* , i32 }
49
- cleanup
50
- ret void
51
- }
52
-
53
- // Check that auto-upgrader converts function calls to intrinsic calls. Note that
54
- // the auto-upgrader doesn't touch invoke instructions.
55
-
56
- // ARC: define void @testRuntimeCalls (i8* %[[A:.*]], i8** %[[B:.*]], i8** %[[C:.*]], i32* %[[D:.*]], i32** %[[E:.*]]) personality
11
+ // ARC: define void @testRuntimeCalls (i8* %[[A:.*]], i8** %[[B:.*]], i8** %[[C:.*]]) {
57
12
// ARC: %[[V0:.*]] = tail call i8* @llvm.objc.autorelease (i8* %[[A]])
58
13
// ARC-NEXT: tail call void @llvm.objc.autoreleasePoolPop (i8* %[[A]])
59
14
// ARC-NEXT: %[[V1:.*]] = tail call i8* @llvm.objc.autoreleasePoolPush ()
60
15
// ARC-NEXT: %[[V2:.*]] = tail call i8* @llvm.objc.autoreleaseReturnValue (i8* %[[A]])
61
16
// ARC-NEXT: tail call void @llvm.objc.copyWeak (i8** %[[B]], i8** %[[C]])
62
17
// ARC-NEXT: tail call void @llvm.objc.destroyWeak (i8** %[[B]])
63
- // ARC-NEXT: %[[V100:.*]] = bitcast i32** %[[E]] to i8**
64
- // ARC-NEXT: %[[V101:.*]] = bitcast i32* %[[D]] to i8*
65
- // ARC-NEXT: %[[V102:.*]] = tail call i8* @llvm.objc.initWeak (i8** %[[V100]], i8* %[[V101]])
66
- // ARC-NEXT: %[[V103:.*]] = bitcast i8* %[[V102]] to i32*
18
+ // ARC-NEXT: %[[V3:.*]] = tail call i8* @llvm.objc.initWeak (i8** %[[B]], i8* %[[A]])
67
19
// ARC-NEXT: %[[V4:.*]] = tail call i8* @llvm.objc.loadWeak (i8** %[[B]])
68
20
// ARC-NEXT: %[[V5:.*]] = tail call i8* @llvm.objc.loadWeakRetained (i8** %[[B]])
69
21
// ARC-NEXT: tail call void @llvm.objc.moveWeak (i8** %[[B]], i8** %[[C]])
@@ -87,16 +39,16 @@ unwindBlock:
87
39
// ARC-NEXT: tail call void @llvm.objc.arc.annotation.topdown.bbend (i8** %[[B]], i8** %[[C]])
88
40
// ARC-NEXT: tail call void @llvm.objc.arc.annotation.bottomup.bbstart (i8** %[[B]], i8** %[[C]])
89
41
// ARC-NEXT: tail call void @llvm.objc.arc.annotation.bottomup.bbend (i8** %[[B]], i8** %[[C]])
90
- // ARC-NEXT: invoke void @objc_autoreleasePoolPop ( i8* %[[A]])
42
+ // ARC-NEXT: ret void
91
43
92
- // MRR: define void @testRuntimeCalls (i8* %[[A:.*]], i8** %[[B:.*]], i8** %[[C:.*]], i32* %[[D:.*]], i32** %[[E:.*]]) personality
44
+ // MRR: define void @testRuntimeCalls (i8* %[[A:.*]], i8** %[[B:.*]], i8** %[[C:.*]]) {
93
45
// MRR: %[[V0:.*]] = tail call i8* @objc_autorelease (i8* %[[A]])
94
46
// MRR-NEXT: tail call void @objc_autoreleasePoolPop (i8* %[[A]])
95
47
// MRR-NEXT: %[[V1:.*]] = tail call i8* @objc_autoreleasePoolPush ()
96
48
// MRR-NEXT: %[[V2:.*]] = tail call i8* @objc_autoreleaseReturnValue (i8* %[[A]])
97
49
// MRR-NEXT: tail call void @objc_copyWeak (i8** %[[B]], i8** %[[C]])
98
50
// MRR-NEXT: tail call void @objc_destroyWeak (i8** %[[B]])
99
- // MRR-NEXT: %[[V3:.*]] = tail call i32 * @objc_initWeak (i32 ** %[[E ]], i32 * %[[D ]])
51
+ // MRR-NEXT: %[[V3:.*]] = tail call i8 * @objc_initWeak (i8 ** %[[B ]], i8 * %[[A ]])
100
52
// MRR-NEXT: %[[V4:.*]] = tail call i8* @objc_loadWeak (i8** %[[B]])
101
53
// MRR-NEXT: %[[V5:.*]] = tail call i8* @objc_loadWeakRetained (i8** %[[B]])
102
54
// MRR-NEXT: tail call void @objc_moveWeak (i8** %[[B]], i8** %[[C]])
@@ -120,4 +72,4 @@ unwindBlock:
120
72
// MRR-NEXT: tail call void @objc_arc_annotation_topdown_bbend (i8** %[[B]], i8** %[[C]])
121
73
// MRR-NEXT: tail call void @objc_arc_annotation_bottomup_bbstart (i8** %[[B]], i8** %[[C]])
122
74
// MRR-NEXT: tail call void @objc_arc_annotation_bottomup_bbend (i8** %[[B]], i8** %[[C]])
123
- // MRR-NEXT: invoke void @objc_autoreleasePoolPop ( i8* %[[A]])
75
+ // MRR-NEXT: ret void
0 commit comments