@@ -21,6 +21,15 @@ struct Two {
21
21
var b: Klass
22
22
}
23
23
24
+ struct NonTrivialStruct {
25
+ var val:Klass
26
+ }
27
+
28
+ public enum FakeOptional<T> {
29
+ case none
30
+ case some(T)
31
+ }
32
+
24
33
sil @unknown : $@convention(thin) () -> ()
25
34
26
35
sil [ossa] @guaranteed_user : $@convention(thin) (@guaranteed Klass) -> ()
@@ -1410,3 +1419,49 @@ bb2:
1410
1419
unwind
1411
1420
}
1412
1421
1422
+ // This does not get optimized correctly because of the conservative treatment of load_borrow/end_borrow in MemBehavior
1423
+ // CHECK-LABEL: sil [ossa] @test_temprvoborrowboundary1 :
1424
+ // CHECK: copy_addr
1425
+ // TODO-CHECK-NOT: alloc_stack
1426
+ // TODO-CHECK-NOT: copy_addr
1427
+ // TODO-CHECK: [[ADDR:%.*]] = unchecked_take_enum_data_addr %0 : $*FakeOptional<NonTrivialStruct>, #FakeOptional.some!enumelt
1428
+ // TODO-CHECK: [[ELE:%.*]] = struct_element_addr [[ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.val
1429
+ // TODO-CHECK: [[LD:%.*]] = load_borrow [[ELE]] : $*Klass
1430
+ // TODO-CHECK: end_borrow [[LD]] : $Klass
1431
+ // TODO-CHECK: destroy_addr [[ADDR]]
1432
+ // CHECK: } // end sil function 'test_temprvoborrowboundary1'
1433
+ sil [ossa] @test_temprvoborrowboundary1 : $@convention(thin) (@in FakeOptional<NonTrivialStruct>) -> () {
1434
+ bb0(%0 : $*FakeOptional<NonTrivialStruct>):
1435
+ %1 = alloc_stack $NonTrivialStruct
1436
+ %2 = unchecked_take_enum_data_addr %0 : $*FakeOptional<NonTrivialStruct>, #FakeOptional.some!enumelt
1437
+ copy_addr [take] %2 to [initialization] %1 : $*NonTrivialStruct
1438
+ %4 = struct_element_addr %1 : $*NonTrivialStruct, #NonTrivialStruct.val
1439
+ %5 = load_borrow %4 : $*Klass
1440
+ end_borrow %5 : $Klass
1441
+ destroy_addr %1 : $*NonTrivialStruct
1442
+ dealloc_stack %1 : $*NonTrivialStruct
1443
+ %res = tuple ()
1444
+ return %res : $()
1445
+ }
1446
+
1447
+ // This does not get optimized because of the end borrow in a different block
1448
+ // CHECK-LABEL: sil [ossa] @test_temprvoborrowboundary2 :
1449
+ // CHECK: copy_addr
1450
+ // CHECK: } // end sil function 'test_temprvoborrowboundary2'
1451
+ sil [ossa] @test_temprvoborrowboundary2 : $@convention(thin) (@in FakeOptional<NonTrivialStruct>) -> () {
1452
+ bb0(%0 : $*FakeOptional<NonTrivialStruct>):
1453
+ %1 = alloc_stack $NonTrivialStruct
1454
+ %2 = unchecked_take_enum_data_addr %0 : $*FakeOptional<NonTrivialStruct>, #FakeOptional.some!enumelt
1455
+ copy_addr [take] %2 to [initialization] %1 : $*NonTrivialStruct
1456
+ %4 = struct_element_addr %1 : $*NonTrivialStruct, #NonTrivialStruct.val
1457
+ %5 = load_borrow %4 : $*Klass
1458
+ br bb1(%5 : $Klass)
1459
+
1460
+ bb1(%6 : @guaranteed $Klass):
1461
+ end_borrow %6 : $Klass
1462
+ destroy_addr %1 : $*NonTrivialStruct
1463
+ dealloc_stack %1 : $*NonTrivialStruct
1464
+ %res = tuple ()
1465
+ return %res : $()
1466
+ }
1467
+
0 commit comments