@@ -62,3 +62,104 @@ enum Maybe2<T : Equatable> {
62
62
}
63
63
}
64
64
}
65
+
66
+ func doit< T> ( _ f: ( ) -> T ) -> T {
67
+ f ( )
68
+ }
69
+ // CHECK-LABEL: sil hidden @duplicate1 : {{.*}} {
70
+ // CHECK: {{bb[0-9]+}}({{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, [[INSTANCE_ADDR_IN:%[^,]+]] : $*Value):
71
+ // CHECK: [[INSTANCE_ADDR:%[^,]+]] = alloc_stack $Value
72
+ // CHECK: [[OUTPUT_TUPLE_ADDR:%[^,]+]] = alloc_stack $(Value, Value)
73
+ // CHECK: [[DUPLICATE_CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone10duplicate15valuex_xtx_tlFx_xtyXEfU_
74
+ // CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
75
+ // CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR]])
76
+ // CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (Value, Value) on [[INSTANCE_ADDR]] : $*Value
77
+ // CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENDENCY]]
78
+ // CHECK: apply {{%[^,]+}}<(Value, Value)>([[OUTPUT_TUPLE_ADDR]], [[CONVERTED]])
79
+ // CHECK-LABEL: } // end sil function 'duplicate1'
80
+ // CHECK-LABEL: sil private @$s19opaque_values_Onone10duplicate15valuex_xtx_tlFx_xtyXEfU_ : {{.*}} {
81
+ // CHECK: {{bb[0-9]+}}([[TUPLE_ADDR:%[^,]+]] : $*(Value, Value), [[VALUE_ADDR:%[^,]+]] :
82
+ // CHECK: [[ELT_1_ADDR:%[^,]+]] = tuple_element_addr [[TUPLE_ADDR]]{{.*}}, 0
83
+ // CHECK: copy_addr [[VALUE_ADDR]] to [init] [[ELT_1_ADDR]]
84
+ // CHECK: [[ELT_2_ADDR:%[^,]+]] = tuple_element_addr [[TUPLE_ADDR]]{{.*}}, 1
85
+ // CHECK: copy_addr [[VALUE_ADDR]] to [init] [[ELT_2_ADDR]] : $*Value
86
+ // CHECK-LABEL: } // end sil function '$s19opaque_values_Onone10duplicate15valuex_xtx_tlFx_xtyXEfU_'
87
+ @_silgen_name ( " duplicate1 " )
88
+ func duplicate1< Value> ( value: Value ) -> ( Value , Value ) {
89
+ doit {
90
+ ( value, value)
91
+ }
92
+ }
93
+ // CHECK-LABEL: sil hidden @duplicate2 : {{.*}} {
94
+ // CHECK: {{bb[0-9]+}}({{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, [[INSTANCE_ADDR_IN:%[^,]+]] : $*Value):
95
+ // CHECK: [[INSTANCE_ADDR:%[^,]+]] = alloc_stack $Value
96
+ // CHECK: [[OUTPUT_TUPLE_ADDR:%[^,]+]] = alloc_stack $(one: Value, two: Value)
97
+ // CHECK: [[DUPLICATE_CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone10duplicate25valuex3one_x3twotx_tlFxAD_xAEtyXEfU_
98
+ // CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
99
+ // CHECK: [[DUPLICATE_INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[DUPLICATE_CLOSURE]]<Value>([[INSTANCE_ADDR]])
100
+ // CHECK: [[DEPENDENDENCY:%[^,]+]] = mark_dependence [[DUPLICATE_INSTANCE_CLOSURE]] : $@noescape @callee_guaranteed () -> @out (one: Value, two: Value) on [[INSTANCE_ADDR]] : $*Value
101
+ // CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENDENCY]]
102
+ // CHECK: apply {{%[^,]+}}<(one: Value, two: Value)>([[OUTPUT_TUPLE_ADDR]], [[CONVERTED]])
103
+ // CHECK-LABEL: } // end sil function 'duplicate2'
104
+ // CHECK-LABEL: sil private @$s19opaque_values_Onone10duplicate25valuex3one_x3twotx_tlFxAD_xAEtyXEfU_ : {{.*}} {
105
+ // CHECK: {{bb[0-9]+}}([[TUPLE_ADDR:%[^,]+]] : $*(one: Value, two: Value), [[VALUE_ADDR:%[^,]+]] :
106
+ // CHECK: [[ELT_1_ADDR:%[^,]+]] = tuple_element_addr [[TUPLE_ADDR]]{{.*}}, 0
107
+ // CHECK: copy_addr [[VALUE_ADDR]] to [init] [[ELT_1_ADDR]]
108
+ // CHECK: [[ELT_2_ADDR:%[^,]+]] = tuple_element_addr [[TUPLE_ADDR]]{{.*}}, 1
109
+ // CHECK: copy_addr [[VALUE_ADDR]] to [init] [[ELT_2_ADDR]] : $*Value
110
+ // CHECK-LABEL: } // end sil function '$s19opaque_values_Onone10duplicate25valuex3one_x3twotx_tlFxAD_xAEtyXEfU_'
111
+ @_silgen_name ( " duplicate2 " )
112
+ func duplicate2< Value> ( value: Value ) -> ( one: Value , two: Value ) {
113
+ doit {
114
+ ( one: value, two: value)
115
+ }
116
+ }
117
+ @_silgen_name ( " duplicate_with_int1 " )
118
+ func duplicate_with_int1< Value> ( value: Value ) -> ( Value , Value , Int ) {
119
+ doit {
120
+ ( value, value, 42 )
121
+ }
122
+ }
123
+ @_silgen_name ( " duplicate_with_int2 " )
124
+ func duplicate_with_int2< Value> ( value: Value ) -> ( ( Value , Value ) , Int ) {
125
+ doit {
126
+ ( ( value, value) , 42 )
127
+ }
128
+ }
129
+
130
+ // CHECK-LABEL: sil hidden @duplicate_with_int3 : {{.*}} {
131
+ // CHECK: {{bb[0-9]+}}({{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, {{%[^,]+}} : $*Value, [[INSTANCE_ADDR_IN:%[^,]+]] : $*Value):
132
+ // CHECK: [[INSTANCE_ADDR:%[^,]+]] = alloc_stack $Value
133
+ // CHECK: [[CLOSURE:%[^,]+]] = function_ref @$s19opaque_values_Onone19duplicate_with_int35valueSi_x_x_x_SitxttSitx_tlFSi_x_x_x_SitxttSityXEfU_
134
+ // CHECK: copy_addr [[INSTANCE_ADDR_IN]] to [init] [[INSTANCE_ADDR]]
135
+ // CHECK: [[INSTANCE_CLOSURE:%[^,]+]] = partial_apply [callee_guaranteed] [on_stack] [[CLOSURE]]<Value>([[INSTANCE_ADDR]])
136
+ // CHECK: [[DEPENDENCY:%[^,]+]] = mark_dependence [[INSTANCE_CLOSURE]]
137
+ // CHECK: [[CONVERTED:%[^,]+]] = convert_function [[DEPENDENCY]]
138
+ // CHECK: apply {{%[^,]+}}<(Int, (Value, (Value, (Value, Int), Value)), Int)>({{%[^,]+}}, [[CONVERTED]])
139
+ // CHECK-LABEL: } // end sil function 'duplicate_with_int3'
140
+ // CHECK-LABEL: sil private @$s19opaque_values_Onone19duplicate_with_int35valueSi_x_x_x_SitxttSitx_tlFSi_x_x_x_SitxttSityXEfU_ {{.*}} {
141
+ // CHECK: {{bb[0-9]+}}([[OUT_ADDR:%[^,]+]] : $*(Int, (Value, (Value, (Value, Int), Value)), Int), [[IN_ADDR:%[^,]+]] : $*Value):
142
+ // CHECK: [[OUT_1_ADDR:%[^,]+]] = tuple_element_addr [[OUT_ADDR]] : $*(Int, (Value, (Value, (Value, Int), Value)), Int), 1
143
+ // CHECK: [[OUT_1_0_ADDR:%[^,]+]] = tuple_element_addr [[OUT_1_ADDR]] : $*(Value, (Value, (Value, Int), Value)), 0
144
+ // CHECK: copy_addr [[IN_ADDR]] to [init] [[OUT_1_0_ADDR]]
145
+ // CHECK: [[OUT_1_1_ADDR:%[^,]+]] = tuple_element_addr [[OUT_1_ADDR]] : $*(Value, (Value, (Value, Int), Value)), 1
146
+ // CHECK: [[OUT_1_1_0_ADDR:%[^,]+]] = tuple_element_addr [[OUT_1_1_ADDR]] : $*(Value, (Value, Int), Value), 0
147
+ // CHECK: copy_addr [[IN_ADDR]] to [init] [[OUT_1_1_0_ADDR]]
148
+ // CHECK: [[OUT_1_1_1_ADDR:%[^,]+]] = tuple_element_addr [[OUT_1_1_ADDR]] : $*(Value, (Value, Int), Value), 1
149
+ // CHECK: [[OUT_1_1_1_2_ADDR:%[^,]+]] = tuple_element_addr [[OUT_1_1_1_ADDR]] : $*(Value, Int), 0
150
+ // CHECK: copy_addr [[IN_ADDR]] to [init] [[OUT_1_1_1_2_ADDR]]
151
+ // CHECK: [[OUT_1_1_2_ADDR:%[^,]+]] = tuple_element_addr [[OUT_1_1_ADDR]] : $*(Value, (Value, Int), Value), 2
152
+ // CHECK: copy_addr [[IN_ADDR]] to [init] [[OUT_1_1_2_ADDR]]
153
+ // CHECK: [[OUT_1_1_1_1_ADDR:%[^,]+]] = tuple_element_addr [[OUT_1_1_1_ADDR]] : $*(Value, Int), 1
154
+ // CHECK: store {{%[^,]+}} to [[OUT_1_1_1_1_ADDR]]
155
+ // CHECK: [[OUT_2_ADDR:%[^,]+]] = tuple_element_addr [[OUT_ADDR]] : $*(Int, (Value, (Value, (Value, Int), Value)), Int), 0
156
+ // CHECK: store {{%[^,]+}} to [[OUT_2_ADDR]]
157
+ // CHECK: [[OUT_2_ADDR:%[^,]+]] = tuple_element_addr [[OUT_ADDR]] : $*(Int, (Value, (Value, (Value, Int), Value)), Int), 2
158
+ // CHECK: store {{%[^,]+}} to [[OUT_2_ADDR]]
159
+ // CHECK-LABEL: } // end sil function '$s19opaque_values_Onone19duplicate_with_int35valueSi_x_x_x_SitxttSitx_tlFSi_x_x_x_SitxttSityXEfU_'
160
+ @_silgen_name ( " duplicate_with_int3 " )
161
+ func duplicate_with_int3< Value> ( value: Value ) -> ( Int , ( Value , ( Value , ( Value , Int ) , Value ) ) , Int ) {
162
+ doit {
163
+ ( 42 , ( value, ( value, ( value, 43 ) , value) ) , 44 )
164
+ }
165
+ }
0 commit comments