@@ -1462,6 +1462,101 @@ bb0(%0 : @guaranteed $X):
1462
1462
return %5 : $Int32
1463
1463
}
1464
1464
1465
+ // CHECK-LABEL: @test_end_borrow3
1466
+ // CHECK: PAIR #3.
1467
+ // CHECK-NEXT: end_borrow %6 : $X
1468
+ // CHECK-NEXT: %3 = ref_element_addr %2 : $X, #X.x
1469
+ // CHECK-NEXT: r=0,w=0
1470
+ // CHECK: PAIR #4.
1471
+ // CHECK-NEXT: end_borrow %6 : $X
1472
+ // CHECK-NEXT: %4 = ref_element_addr %0 : $X, #X.x
1473
+ // CHECK-NEXT: r=0,w=0
1474
+ // CHECK: PAIR #5.
1475
+ // CHECK-NEXT: end_borrow %6 : $X
1476
+ // CHECK-NEXT: %7 = ref_element_addr %6 : $X, #X.x
1477
+ // CHECK-NEXT: r=1,w=1
1478
+ // CHECK: PAIR #6.
1479
+ // CHECK-NEXT: end_borrow %2 : $X
1480
+ // CHECK-NEXT: %3 = ref_element_addr %2 : $X, #X.x
1481
+ // CHECK-NEXT: r=1,w=1
1482
+ // CHECK: PAIR #7.
1483
+ // CHECK-NEXT: end_borrow %2 : $X
1484
+ // CHECK-NEXT: %4 = ref_element_addr %0 : $X, #X.x
1485
+ // CHECK-NEXT: r=0,w=0
1486
+ // CHECK: PAIR #8.
1487
+ // CHECK-NEXT: end_borrow %2 : $X
1488
+ // CHECK-NEXT: %7 = ref_element_addr %6 : $X, #X.x
1489
+ // CHECK-NEXT: r=0,w=0
1490
+ sil [ossa] @test_end_borrow3 : $@convention(thin) (@guaranteed X, @owned X) -> @owned (X, X) {
1491
+ bb0(%0 : @guaranteed $X, %1 : @owned $X):
1492
+ %2 = begin_borrow %1 : $X
1493
+ %3 = ref_element_addr %2 : $X, #X.x
1494
+ %4 = ref_element_addr %0 : $X, #X.x
1495
+ %5 = copy_value %2 : $X
1496
+ %6 = begin_borrow %5 : $X
1497
+ %7 = ref_element_addr %6 : $X, #X.x
1498
+ end_borrow %6 : $X
1499
+ end_borrow %2 : $X
1500
+ %r = tuple (%5 : $X, %1 : $X)
1501
+ return %r : $(X, X)
1502
+ }
1503
+
1504
+ // CHECK-LABEL: @test_end_borrow4
1505
+ // CHECK: PAIR #4.
1506
+ // CHECK-NEXT: end_borrow %3 : $X
1507
+ // CHECK-NEXT: %4 = ref_element_addr %3 : $X, #X.x
1508
+ // CHECK-NEXT: r=1,w=1
1509
+ // CHECK: PAIR #5.
1510
+ // CHECK-NEXT: end_borrow %3 : $X
1511
+ // CHECK-NEXT: %8 = ref_element_addr %7 : $X, #X.x
1512
+ // CHECK-NEXT: r=0,w=0
1513
+ // CHECK: PAIR #10.
1514
+ // CHECK-NEXT: end_borrow %7 : $X
1515
+ // CHECK-NEXT: %4 = ref_element_addr %3 : $X, #X.x
1516
+ // CHECK-NEXT: r=0,w=0
1517
+ // CHECK: PAIR #11.
1518
+ // CHECK-NEXT: end_borrow %7 : $X
1519
+ // CHECK-NEXT: %8 = ref_element_addr %7 : $X, #X.x
1520
+ // CHECK-NEXT: r=1,w=1
1521
+ // CHECK: PAIR #13.
1522
+ // CHECK-NEXT: end_borrow %2 : $X
1523
+ // CHECK-NEXT: %4 = ref_element_addr %3 : $X, #X.x
1524
+ // CHECK-NEXT: r=0,w=0
1525
+ // CHECK: PAIR #14.
1526
+ // CHECK-NEXT: end_borrow %2 : $X
1527
+ // CHECK-NEXT: %8 = ref_element_addr %7 : $X, #X.x
1528
+ // CHECK-NEXT: r=0,w=0
1529
+ sil [ossa] @test_end_borrow4 : $@convention(thin) (@guaranteed X, @in_guaranteed X) -> @owned X {
1530
+ bb0(%0 : @guaranteed $X, %1 : $*X):
1531
+ %2 = begin_borrow %0 : $X
1532
+ %3 = load_borrow %1 : $*X
1533
+ %4 = ref_element_addr %3 : $X, #X.x
1534
+ end_borrow %3 : $X
1535
+ %6 = load [copy] %1 : $*X
1536
+ %7 = begin_borrow %6 : $X
1537
+ %8 = ref_element_addr %7 : $X, #X.x
1538
+ end_borrow %7 : $X
1539
+ end_borrow %2 : $X
1540
+ return %6 : $X
1541
+ }
1542
+
1543
+ // CHECK-LABEL: @test_end_borrow5
1544
+ // CHECK: PAIR #3.
1545
+ // CHECK-NEXT: end_borrow %2 : $X
1546
+ // CHECK-NEXT: %5 = ref_element_addr [immutable] %4 : $X, #X.x
1547
+ // CHECK-NEXT: r=1,w=1
1548
+ sil [ossa] @test_end_borrow5 : $@convention(thin) (@guaranteed X) -> () {
1549
+ bb0(%0 : @guaranteed $X):
1550
+ %1 = ref_element_addr [immutable] %0 : $X, #X.x
1551
+ %2 = load_borrow %1 : $*X
1552
+ %3 = unconditional_checked_cast %2 : $X to Derived
1553
+ %4 = upcast %3 : $Derived to $X
1554
+ %5 = ref_element_addr [immutable] %4 : $X, #X.x
1555
+ end_borrow %2 : $X
1556
+ %7 = tuple ()
1557
+ return %7 : $()
1558
+ }
1559
+
1465
1560
// CHECK-LABEL: @test_load_borrow
1466
1561
// CHECK: PAIR #0.
1467
1562
// CHECK-NEXT: %1 = load_borrow %0 : $*X
0 commit comments