@@ -1280,3 +1280,99 @@ bb2(%phi1 : @guaranteed $NonTrivialStruct, %phi2 : @guaranteed $NonTrivialStruct
12801280 return %9999 : $()
12811281}
12821282
1283+ // CHECK-LABEL: sil [ossa] @dce_deadterm4 :
1284+ // CHECK-NOT: switch_enum
1285+ // CHECK-LABEL: } // end sil function 'dce_deadterm4'
1286+ sil [ossa] @dce_deadterm4 : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1287+ bb0(%0 : @owned $FakeOptional<Builtin.NativeObject>):
1288+ %0a = alloc_stack $FakeOptional<Builtin.NativeObject>
1289+ store %0 to [init] %0a : $*FakeOptional<Builtin.NativeObject>
1290+ %1 = load [take] %0a : $*FakeOptional<Builtin.NativeObject>
1291+ %2 = copy_value %1 : $FakeOptional<Builtin.NativeObject>
1292+ apply undef(%2) : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> ()
1293+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
1294+
1295+ bb1(%3 : @owned $Builtin.NativeObject):
1296+ destroy_value %3 : $Builtin.NativeObject
1297+ br bb3
1298+
1299+ bb2:
1300+ br bb3
1301+
1302+ bb3:
1303+ switch_enum %2 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt: bb4, case #FakeOptional.none!enumelt: bb5
1304+
1305+ bb4(%4 : @owned $Builtin.NativeObject):
1306+ destroy_value %4 : $Builtin.NativeObject
1307+ br bb6
1308+
1309+ bb5:
1310+ br bb6
1311+
1312+ bb6:
1313+ dealloc_stack %0a : $*FakeOptional<Builtin.NativeObject>
1314+ %9999 = tuple()
1315+ return %9999 : $()
1316+ }
1317+
1318+ // CHECK-LABEL: sil [ossa] @dce_deadterm5 :
1319+ // CHECK: switch_enum
1320+ // CHECK-NOT: switch_enum
1321+ // CHECK-LABEL: } // end sil function 'dce_deadterm5'
1322+ sil [ossa] @dce_deadterm5 : $@convention(thin) (@owned FakeOptional<Builtin.NativeObject>) -> () {
1323+ bb0(%0 : @owned $FakeOptional<Builtin.NativeObject>):
1324+ %0a = alloc_stack $FakeOptional<Builtin.NativeObject>
1325+ store %0 to [init] %0a : $*FakeOptional<Builtin.NativeObject>
1326+ %1 = load [take] %0a : $*FakeOptional<Builtin.NativeObject>
1327+ %2 = copy_value %1 : $FakeOptional<Builtin.NativeObject>
1328+ apply undef(%2) : $@convention(thin) (@guaranteed FakeOptional<Builtin.NativeObject>) -> ()
1329+ switch_enum %1 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
1330+
1331+ bb1(%3 : @owned $Builtin.NativeObject):
1332+ destroy_value %3 : $Builtin.NativeObject
1333+ br bb3
1334+
1335+ bb2:
1336+ switch_enum %2 : $FakeOptional<Builtin.NativeObject>, case #FakeOptional.some!enumelt: bb4, case #FakeOptional.none!enumelt: bb5
1337+
1338+ bb3:
1339+ destroy_value %2 : $FakeOptional<Builtin.NativeObject>
1340+ br bb6
1341+
1342+ bb4(%4 : @owned $Builtin.NativeObject):
1343+ destroy_value %4 : $Builtin.NativeObject
1344+ br bb6
1345+
1346+ bb5:
1347+ br bb6
1348+
1349+ bb6:
1350+ dealloc_stack %0a : $*FakeOptional<Builtin.NativeObject>
1351+ %9999 = tuple()
1352+ return %9999 : $()
1353+ }
1354+
1355+ // CHECK-LABEL: sil [ossa] @dce_deadforwarding :
1356+ // CHECK-NOT: cond_br
1357+ // CHECK-LABEL: } // end sil function 'dce_deadforwarding'
1358+ sil [ossa] @dce_deadforwarding : $@convention(thin) (@guaranteed Klass) -> () {
1359+ bb0(%0 : @guaranteed $Klass):
1360+ %1 = copy_value %0 : $Klass
1361+ %func = function_ref @$use_klass2 : $@convention(thin) (@guaranteed Klass) -> ()
1362+ %funcres = apply %func(%1) : $@convention(thin) (@guaranteed Klass) -> ()
1363+ cond_br undef, bb1, bb2
1364+
1365+ bb1:
1366+ %3 = struct $NonTrivialStruct(%1 : $Klass)
1367+ destroy_value %3 : $NonTrivialStruct
1368+ br bb3
1369+
1370+ bb2:
1371+ %4 = struct $NonTrivialStruct(%1 : $Klass)
1372+ destroy_value %4 : $NonTrivialStruct
1373+ br bb3
1374+
1375+ bb3:
1376+ %res = tuple ()
1377+ return %res : $()
1378+ }
0 commit comments