forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconst_fold_objc_bridge.sil
111 lines (92 loc) · 2.79 KB
/
const_fold_objc_bridge.sil
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -performance-constant-propagation | %FileCheck %s
// REQUIRES: objc_interop
sil_stage canonical
import Builtin
import Swift
import Foundation
@objc class ObjCClass {}
struct Str: _ObjectiveCBridgeable {
func _bridgeToObjectiveC() -> ObjCClass
static func _forceBridgeFromObjectiveC(_ source: ObjCClass,
result: inout Str?)
static func _conditionallyBridgeFromObjectiveC(_ source: ObjCClass,
result: inout Str?) -> Bool
static func _unconditionallyBridgeFromObjectiveC(_ source: ObjCClass?) -> Str
// Make it a non-trivial type
var x: AnyObject?
}
// CHECK-LABEL: sil @checked_cast_with_take_always
// CHECK: [[A:%[0-9]+]] = alloc_stack
// CHECK: [[S:%[0-9]+]] = load %0
// CHECK-NOT: retain
// CHECK: [[D:%[0-9]+]] = apply %{{[0-9]+}}([[S]])
// CHECK: release_value [[S]]
// CHECK: store [[D]] to [[A]]
// CHECK: bb1:
// CHECK-NEXT: br bb3
// CHECK: bb2:
// CHECK-NEXT: br bb3
// CHECK: return
sil @checked_cast_with_take_always : $@convention(thin) (@in Str) -> ObjCClass {
bb0(%0 : $*Str):
%b = alloc_stack $ObjCClass
checked_cast_addr_br take_always Str in %0 : $*Str to ObjCClass in %b : $*ObjCClass, bb1, bb2
bb1:
br bb3
bb2:
br bb3
bb3:
%r = load %b : $*ObjCClass
dealloc_stack %b : $*ObjCClass
return %r : $ObjCClass
}
// CHECK-LABEL: sil @checked_cast_with_take_on_success
// CHECK: [[A:%[0-9]+]] = alloc_stack
// CHECK: [[S:%[0-9]+]] = load %0
// CHECK-NOT: retain
// CHECK: [[D:%[0-9]+]] = apply %{{[0-9]+}}([[S]])
// CHECK-NOT: release
// CHECK: store [[D]] to [[A]]
// CHECK: bb1:
// CHECK-NEXT: release_value [[S]]
// CHECK-NEXT: br bb3
// CHECK: bb2:
// CHECK-NEXT: br bb3
// CHECK: return
sil @checked_cast_with_take_on_success : $@convention(thin) (@in Str) -> ObjCClass {
bb0(%0 : $*Str):
%b = alloc_stack $ObjCClass
checked_cast_addr_br take_on_success Str in %0 : $*Str to ObjCClass in %b : $*ObjCClass, bb1, bb2
bb1:
br bb3
bb2:
br bb3
bb3:
%r = load %b : $*ObjCClass
dealloc_stack %b : $*ObjCClass
return %r : $ObjCClass
}
// CHECK-LABEL: sil @checked_cast_with_copy_on_success
// CHECK: [[A:%[0-9]+]] = alloc_stack
// CHECK: [[S:%[0-9]+]] = load %0
// CHECK: retain_value [[S]]
// CHECK: [[D:%[0-9]+]] = apply %{{[0-9]+}}([[S]])
// CHECK: release_value [[S]]
// CHECK: bb1:
// CHECK-NEXT: br bb3
// CHECK: bb2:
// CHECK-NEXT: br bb3
// CHECK: return
sil @checked_cast_with_copy_on_success : $@convention(thin) (@in Str) -> ObjCClass {
bb0(%0 : $*Str):
%b = alloc_stack $ObjCClass
checked_cast_addr_br copy_on_success Str in %0 : $*Str to ObjCClass in %b : $*ObjCClass, bb1, bb2
bb1:
br bb3
bb2:
br bb3
bb3:
%r = load %b : $*ObjCClass
dealloc_stack %b : $*ObjCClass
return %r : $ObjCClass
}