@@ -1462,6 +1462,101 @@ bb0(%0 : @guaranteed $X):
14621462 return %5 : $Int32
14631463}
14641464
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+
14651560// CHECK-LABEL: @test_load_borrow
14661561// CHECK: PAIR #0.
14671562// CHECK-NEXT: %1 = load_borrow %0 : $*X
0 commit comments