@@ -360,10 +360,8 @@ bb0(%0 : @guaranteed $Builtin.NativeObject, %1 : @guaranteed $Builtin.NativeObje
360
360
return %9999 : $()
361
361
}
362
362
363
- // TODO: We should be able to optimize these switch_enum. Make sure that today
364
- // we do not do so though.
365
363
// CHECK-LABEL: sil [ossa] @switch_enum_test_no_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
366
- // CHECK: copy_value
364
+ // CHECK-NOT : copy_value
367
365
// CHECK: } // end sil function 'switch_enum_test_no_default'
368
366
sil [ossa] @switch_enum_test_no_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
369
367
bb0(%0 : @guaranteed $FakeOptional<Builtin.NativeObject>):
383
381
}
384
382
385
383
// CHECK-LABEL: sil [ossa] @switch_enum_test_with_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
386
- // CHECK: copy_value
384
+ // CHECK-NOT : copy_value
387
385
// CHECK: } // end sil function 'switch_enum_test_with_default'
388
386
sil [ossa] @switch_enum_test_with_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
389
387
bb0(%0 : @guaranteed $FakeOptional<Builtin.NativeObject>):
@@ -1140,3 +1138,150 @@ bb0(%0 : $*NativeObjectPair, %1 : @owned $Builtin.NativeObject):
1140
1138
%9999 = tuple()
1141
1139
return %9999 : $()
1142
1140
}
1141
+
1142
+ // CHECK-LABEL: sil [ossa] @switch_enum_test_loadcopy_no_default : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1143
+ // CHECK-NOT: load [copy]
1144
+ // CHECK: load_borrow
1145
+ // CHECK-NOT: load [copy]
1146
+ // CHECK: } // end sil function 'switch_enum_test_loadcopy_no_default'
1147
+ sil [ossa] @switch_enum_test_loadcopy_no_default : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1148
+ bb0(%0 : @owned $FakeOptional<Builtin.NativeObject>):
1149
+ %0a = alloc_stack $FakeOptional<Builtin.NativeObject>
1150
+ store %0 to [init] %0a : $*FakeOptional<Builtin.NativeObject>
1151
+ %1 = load [copy] %0a : $*FakeOptional<Builtin.NativeObject>
1152
+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt.1: bb1, case #FakeOptional.none!enumelt: bb2
1153
+
1154
+ bb1(%2 : @owned $Builtin.NativeObject):
1155
+ destroy_value %2 : $Builtin.NativeObject
1156
+ br bb3
1157
+
1158
+ bb2:
1159
+ br bb3
1160
+
1161
+ bb3:
1162
+ destroy_addr %0a : $*FakeOptional<Builtin.NativeObject>
1163
+ dealloc_stack %0a : $*FakeOptional<Builtin.NativeObject>
1164
+ %9999 = tuple()
1165
+ return %9999 : $()
1166
+ }
1167
+
1168
+ // CHECK-LABEL: sil [ossa] @switch_enum_test_loadcopy_with_default : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1169
+ // CHECK-NOT: load [copy]
1170
+ // CHECK: load_borrow
1171
+ // CHECK-NOT: load [copy]
1172
+ // CHECK: } // end sil function 'switch_enum_test_loadcopy_with_default'
1173
+ sil [ossa] @switch_enum_test_loadcopy_with_default : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1174
+ bb0(%0 : @owned $FakeOptional<Builtin.NativeObject>):
1175
+ %0a = alloc_stack $FakeOptional<Builtin.NativeObject>
1176
+ store %0 to [init] %0a : $*FakeOptional<Builtin.NativeObject>
1177
+ %1 = load [copy] %0a : $*FakeOptional<Builtin.NativeObject>
1178
+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt.1: bb1, default bb2
1179
+
1180
+ bb1(%2 : @owned $Builtin.NativeObject):
1181
+ destroy_value %2 : $Builtin.NativeObject
1182
+ br bb3
1183
+
1184
+ bb2(%3 : @owned $FakeOptional<Builtin.NativeObject>):
1185
+ destroy_value %3 : $FakeOptional<Builtin.NativeObject>
1186
+ br bb3
1187
+
1188
+ bb3:
1189
+ destroy_addr %0a : $*FakeOptional<Builtin.NativeObject>
1190
+ dealloc_stack %0a : $*FakeOptional<Builtin.NativeObject>
1191
+ %9999 = tuple()
1192
+ return %9999 : $()
1193
+ }
1194
+
1195
+ // CHECK-LABEL: sil [ossa] @switch_enum_test_copyvalue_no_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
1196
+ // CHECK-NOT: copy_value
1197
+ // CHECK: } // end sil function 'switch_enum_test_copyvalue_no_default'
1198
+ sil [ossa] @switch_enum_test_copyvalue_no_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
1199
+ bb0(%0 : @guaranteed $FakeOptional<Builtin.NativeObject>):
1200
+ %1 = copy_value %0 : $FakeOptional<Builtin.NativeObject>
1201
+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt.1: bb1, case #FakeOptional.none!enumelt: bb2
1202
+
1203
+ bb1(%2 : @owned $Builtin.NativeObject):
1204
+ destroy_value %2 : $Builtin.NativeObject
1205
+ br bb3
1206
+
1207
+ bb2:
1208
+ br bb3
1209
+
1210
+ bb3:
1211
+ %9999 = tuple()
1212
+ return %9999 : $()
1213
+ }
1214
+
1215
+ // CHECK-LABEL: sil [ossa] @switch_enum_test_copyvalue_with_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
1216
+ // CHECK-NOT: copy_value
1217
+ // CHECK: } // end sil function 'switch_enum_test_copyvalue_with_default'
1218
+ sil [ossa] @switch_enum_test_copyvalue_with_default : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
1219
+ bb0(%0 : @guaranteed $FakeOptional<Builtin.NativeObject>):
1220
+ %1 = copy_value %0 : $FakeOptional<Builtin.NativeObject>
1221
+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt.1: bb1, default bb2
1222
+
1223
+ bb1(%2 : @owned $Builtin.NativeObject):
1224
+ destroy_value %2 : $Builtin.NativeObject
1225
+ br bb3
1226
+
1227
+ bb2(%3 : @owned $FakeOptional<Builtin.NativeObject>):
1228
+ destroy_value %3 : $FakeOptional<Builtin.NativeObject>
1229
+ br bb3
1230
+
1231
+ bb3:
1232
+ %9999 = tuple()
1233
+ return %9999 : $()
1234
+ }
1235
+
1236
+ // CHECK-LABEL: sil [ossa] @switch_enum_test_copyvalue_with_default_and_extract : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
1237
+ // CHECK-NOT: copy_value
1238
+ // CHECK: } // end sil function 'switch_enum_test_copyvalue_with_default_and_extract'
1239
+ sil [ossa] @switch_enum_test_copyvalue_with_default_and_extract : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> () {
1240
+ bb0(%0 : @guaranteed $FakeOptional<Builtin.NativeObject>):
1241
+ %f = function_ref @guaranteed_user : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
1242
+ %1 = copy_value %0 : $FakeOptional<Builtin.NativeObject>
1243
+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt.1: bb1, default bb2
1244
+
1245
+ bb1(%2 : @owned $Builtin.NativeObject):
1246
+ destroy_value %2 : $Builtin.NativeObject
1247
+ br bb3
1248
+
1249
+ bb2(%3 : @owned $FakeOptional<Builtin.NativeObject>):
1250
+ %3a = unchecked_enum_data %3 : $FakeOptional<Builtin.NativeObject>, #FakeOptional.some!enumelt.1
1251
+ apply %f(%3a) : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
1252
+ destroy_value %3a : $Builtin.NativeObject
1253
+ br bb3
1254
+
1255
+ bb3:
1256
+ %9999 = tuple()
1257
+ return %9999 : $()
1258
+ }
1259
+
1260
+ // TODO: We currently are unable to get rid of the begin_borrow. We should be
1261
+ // able to with appropriate analysis.
1262
+ // CHECK-LABEL: sil [ossa] @switch_enum_test_copyvalue_with_borrow : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1263
+ // CHECK-NOT: copy_value
1264
+ // CHECK: } // end sil function 'switch_enum_test_copyvalue_with_borrow'
1265
+ sil [ossa] @switch_enum_test_copyvalue_with_borrow : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1266
+ bb0(%0 : @owned $FakeOptional<Builtin.NativeObject>):
1267
+ %f = function_ref @guaranteed_user : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
1268
+ %0a = begin_borrow %0 : $FakeOptional<Builtin.NativeObject>
1269
+ %1 = copy_value %0a : $FakeOptional<Builtin.NativeObject>
1270
+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt.1: bb1, default bb2
1271
+
1272
+ bb1(%2 : @owned $Builtin.NativeObject):
1273
+ destroy_value %2 : $Builtin.NativeObject
1274
+ br bb3
1275
+
1276
+ bb2(%3 : @owned $FakeOptional<Builtin.NativeObject>):
1277
+ %3a = unchecked_enum_data %3 : $FakeOptional<Builtin.NativeObject>, #FakeOptional.some!enumelt.1
1278
+ apply %f(%3a) : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
1279
+ destroy_value %3a : $Builtin.NativeObject
1280
+ br bb3
1281
+
1282
+ bb3:
1283
+ end_borrow %0a : $FakeOptional<Builtin.NativeObject>
1284
+ destroy_value %0 : $FakeOptional<Builtin.NativeObject>
1285
+ %9999 = tuple()
1286
+ return %9999 : $()
1287
+ }
0 commit comments