|
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 |
| -// ARC: define void @testRuntimeCalls(i8* %[[A:.*]], i8** %[[B:.*]], i8** %[[C:.*]]) { |
| 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 |
12 | 57 | // ARC: %[[V0:.*]] = tail call i8* @llvm.objc.autorelease(i8* %[[A]])
|
13 | 58 | // ARC-NEXT: tail call void @llvm.objc.autoreleasePoolPop(i8* %[[A]])
|
14 | 59 | // ARC-NEXT: %[[V1:.*]] = tail call i8* @llvm.objc.autoreleasePoolPush()
|
15 | 60 | // ARC-NEXT: %[[V2:.*]] = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %[[A]])
|
16 | 61 | // ARC-NEXT: tail call void @llvm.objc.copyWeak(i8** %[[B]], i8** %[[C]])
|
17 | 62 | // ARC-NEXT: tail call void @llvm.objc.destroyWeak(i8** %[[B]])
|
18 |
| -// ARC-NEXT: %[[V3:.*]] = tail call i8* @llvm.objc.initWeak(i8** %[[B]], i8* %[[A]]) |
| 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* |
19 | 67 | // ARC-NEXT: %[[V4:.*]] = tail call i8* @llvm.objc.loadWeak(i8** %[[B]])
|
20 | 68 | // ARC-NEXT: %[[V5:.*]] = tail call i8* @llvm.objc.loadWeakRetained(i8** %[[B]])
|
21 | 69 | // ARC-NEXT: tail call void @llvm.objc.moveWeak(i8** %[[B]], i8** %[[C]])
|
|
39 | 87 | // ARC-NEXT: tail call void @llvm.objc.arc.annotation.topdown.bbend(i8** %[[B]], i8** %[[C]])
|
40 | 88 | // ARC-NEXT: tail call void @llvm.objc.arc.annotation.bottomup.bbstart(i8** %[[B]], i8** %[[C]])
|
41 | 89 | // ARC-NEXT: tail call void @llvm.objc.arc.annotation.bottomup.bbend(i8** %[[B]], i8** %[[C]])
|
42 |
| -// ARC-NEXT: ret void |
| 90 | +// ARC-NEXT: invoke void @objc_autoreleasePoolPop(i8* %[[A]]) |
43 | 91 |
|
44 |
| -// MRR: define void @testRuntimeCalls(i8* %[[A:.*]], i8** %[[B:.*]], i8** %[[C:.*]]) { |
| 92 | +// MRR: define void @testRuntimeCalls(i8* %[[A:.*]], i8** %[[B:.*]], i8** %[[C:.*]], i32* %[[D:.*]], i32** %[[E:.*]]) personality |
45 | 93 | // MRR: %[[V0:.*]] = tail call i8* @objc_autorelease(i8* %[[A]])
|
46 | 94 | // MRR-NEXT: tail call void @objc_autoreleasePoolPop(i8* %[[A]])
|
47 | 95 | // MRR-NEXT: %[[V1:.*]] = tail call i8* @objc_autoreleasePoolPush()
|
48 | 96 | // MRR-NEXT: %[[V2:.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* %[[A]])
|
49 | 97 | // MRR-NEXT: tail call void @objc_copyWeak(i8** %[[B]], i8** %[[C]])
|
50 | 98 | // MRR-NEXT: tail call void @objc_destroyWeak(i8** %[[B]])
|
51 |
| -// MRR-NEXT: %[[V3:.*]] = tail call i8* @objc_initWeak(i8** %[[B]], i8* %[[A]]) |
| 99 | +// MRR-NEXT: %[[V3:.*]] = tail call i32* @objc_initWeak(i32** %[[E]], i32* %[[D]]) |
52 | 100 | // MRR-NEXT: %[[V4:.*]] = tail call i8* @objc_loadWeak(i8** %[[B]])
|
53 | 101 | // MRR-NEXT: %[[V5:.*]] = tail call i8* @objc_loadWeakRetained(i8** %[[B]])
|
54 | 102 | // MRR-NEXT: tail call void @objc_moveWeak(i8** %[[B]], i8** %[[C]])
|
|
72 | 120 | // MRR-NEXT: tail call void @objc_arc_annotation_topdown_bbend(i8** %[[B]], i8** %[[C]])
|
73 | 121 | // MRR-NEXT: tail call void @objc_arc_annotation_bottomup_bbstart(i8** %[[B]], i8** %[[C]])
|
74 | 122 | // MRR-NEXT: tail call void @objc_arc_annotation_bottomup_bbend(i8** %[[B]], i8** %[[C]])
|
75 |
| -// MRR-NEXT: ret void |
| 123 | +// MRR-NEXT: invoke void @objc_autoreleasePoolPop(i8* %[[A]]) |
0 commit comments