Skip to content

Commit 1fe148c

Browse files
committed
[Test] Added tests showing extra copies.
As a separate commit to make the behavior change more obvious.
1 parent a9eba20 commit 1fe148c

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

test/SILOptimizer/temp_rvalue_opt_ossa.sil

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public enum FakeOptional<T> {
3939
case some(T)
4040
}
4141

42+
43+
sil [ossa] @getKlass : $@convention(thin) () -> @owned Klass
44+
4245
sil @unknown : $@convention(thin) () -> ()
4346

4447
sil [ossa] @guaranteed_user : $@convention(thin) (@guaranteed Klass) -> ()
@@ -1506,6 +1509,122 @@ bb2:
15061509
unwind
15071510
}
15081511

1512+
// CHECK-LABEL: sil [ossa] @take_from_original_copy_addr__final_use_load_take : {{.*}} {
1513+
// CHECK: [[GET:%[^,]+]] = function_ref @getKlass
1514+
// CHECK: [[USER:%[^,]+]] = function_ref @inguaranteed_user_without_result
1515+
// CHECK: [[INSTANCE_1:%[^,]+]] = apply [[GET]]()
1516+
// CHECK: [[ADDR:%[^,]+]] = alloc_stack $Klass
1517+
// CHECK: store [[INSTANCE_1]] to [init] [[ADDR]]
1518+
// CHECK: apply [[USER]]([[ADDR]])
1519+
// CHECK: [[INSTANCE_2:%[^,]+]] = load [copy] [[ADDR]]
1520+
// Extra copy: ^^^^^^^^^^^
1521+
// CHECK: destroy_addr [[ADDR]]
1522+
// CHECK: dealloc_stack [[ADDR]]
1523+
// CHECK: return [[INSTANCE_2]]
1524+
// CHECK-LABEL: } // end sil function 'take_from_original_copy_addr__final_use_load_take'
1525+
sil [ossa] @take_from_original_copy_addr__final_use_load_take : $() -> @owned Klass {
1526+
%getKlass = function_ref @getKlass : $@convention(thin) () -> @owned Klass
1527+
%user = function_ref @inguaranteed_user_without_result : $@convention(thin) (@in_guaranteed Klass) -> ()
1528+
%instance_1 = apply %getKlass() : $@convention(thin) () -> @owned Klass
1529+
%src = alloc_stack $Klass
1530+
store %instance_1 to [init] %src : $*Klass
1531+
apply %user(%src) : $@convention(thin) (@in_guaranteed Klass) -> ()
1532+
%tmp = alloc_stack $Klass
1533+
copy_addr [take] %src to [init] %tmp : $*Klass
1534+
%instance_2 = load [take] %tmp : $*Klass
1535+
dealloc_stack %tmp : $*Klass
1536+
dealloc_stack %src : $*Klass
1537+
return %instance_2 : $Klass
1538+
}
1539+
1540+
// CHECK-LABEL: sil [ossa] @take_from_original_copy_addr__final_use_copy_addr_take : {{.*}} {
1541+
// CHECK: {{bb[0-9]+}}([[OUT:%[^,]+]] :
1542+
// CHECK: [[GET:%[^,]+]] = function_ref @getKlass
1543+
// CHECK: [[USER:%[^,]+]] = function_ref @inguaranteed_user_without_result
1544+
// CHECK: [[INSTANCE_1:%[^,]+]] = apply [[GET]]()
1545+
// CHECK: [[SRC:%[^,]+]] = alloc_stack $Klass
1546+
// CHECK: store [[INSTANCE_1]] to [init] [[SRC]]
1547+
// CHECK: apply [[USER]]([[SRC]])
1548+
// CHECK: copy_addr [[SRC]] to [init] [[OUT]]
1549+
// Extra copy: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1550+
// CHECK: destroy_addr [[SRC]]
1551+
// CHECK: dealloc_stack [[SRC]]
1552+
// CHECK-LABEL: } // end sil function 'take_from_original_copy_addr__final_use_copy_addr_take'
1553+
sil [ossa] @take_from_original_copy_addr__final_use_copy_addr_take : $() -> @out Klass {
1554+
entry(%out : $*Klass):
1555+
%getKlass = function_ref @getKlass : $@convention(thin) () -> @owned Klass
1556+
%user = function_ref @inguaranteed_user_without_result : $@convention(thin) (@in_guaranteed Klass) -> ()
1557+
%instance_1 = apply %getKlass() : $@convention(thin) () -> @owned Klass
1558+
%src = alloc_stack $Klass
1559+
store %instance_1 to [init] %src : $*Klass
1560+
apply %user(%src) : $@convention(thin) (@in_guaranteed Klass) -> ()
1561+
%tmp = alloc_stack $Klass
1562+
copy_addr [take] %src to [init] %tmp : $*Klass
1563+
copy_addr [take] %tmp to [init] %out : $*Klass
1564+
dealloc_stack %tmp : $*Klass
1565+
dealloc_stack %src : $*Klass
1566+
%retval = tuple ()
1567+
return %retval : $()
1568+
}
1569+
1570+
// CHECK-LABEL: sil [ossa] @take_from_original_copy_addr__final_use_load_copy : {{.*}} {
1571+
// CHECK: [[GET:%[^,]+]] = function_ref @getKlass
1572+
// CHECK: [[USER:%[^,]+]] = function_ref @inguaranteed_user_without_result
1573+
// CHECK: [[INSTANCE_1:%[^,]+]] = apply [[GET]]()
1574+
// CHECK: [[SRC:%[^,]+]] = alloc_stack $Klass
1575+
// CHECK: store [[INSTANCE_1]] to [init] [[SRC]]
1576+
// CHECK: apply [[USER]]([[SRC]])
1577+
// CHECK: [[INSTANCE_2:%[^,]+]] = load [copy] [[SRC]]
1578+
// CHECK: destroy_addr [[SRC]]
1579+
// CHECK: dealloc_stack [[SRC]]
1580+
// CHECK: return [[INSTANCE_2]]
1581+
// CHECK-LABEL: } // end sil function 'take_from_original_copy_addr__final_use_load_copy'
1582+
sil [ossa] @take_from_original_copy_addr__final_use_load_copy : $() -> @owned Klass {
1583+
%getKlass = function_ref @getKlass : $@convention(thin) () -> @owned Klass
1584+
%user = function_ref @inguaranteed_user_without_result : $@convention(thin) (@in_guaranteed Klass) -> ()
1585+
%instance_1 = apply %getKlass() : $@convention(thin) () -> @owned Klass
1586+
%src = alloc_stack $Klass
1587+
store %instance_1 to [init] %src : $*Klass
1588+
apply %user(%src) : $@convention(thin) (@in_guaranteed Klass) -> ()
1589+
%tmp = alloc_stack $Klass
1590+
copy_addr [take] %src to [init] %tmp : $*Klass
1591+
%instance_2 = load [copy] %tmp : $*Klass
1592+
destroy_addr %tmp : $*Klass
1593+
dealloc_stack %tmp : $*Klass
1594+
dealloc_stack %src : $*Klass
1595+
return %instance_2 : $Klass
1596+
}
1597+
1598+
// CHECK-LABEL: sil [ossa] @take_from_original_copy_addr__final_use_copy_addr_copy : {{.*}} {
1599+
// CHECK: {{bb[0-9]+}}([[OUT:%[^,]+]] : $*Klass):
1600+
// CHECK: [[GET:%[^,]+]] = function_ref @getKlass
1601+
// CHECK: [[USER:%[^,]+]] = function_ref @inguaranteed_user_without_result
1602+
// CHECK: [[INSTANCE:%[^,]+]] = apply [[GET]]()
1603+
// CHECK: [[SRC:%[^,]+]] = alloc_stack $Klass
1604+
// CHECK: store [[INSTANCE]] to [init] [[SRC]]
1605+
// CHECK: apply [[USER]]([[SRC]])
1606+
// CHECK: copy_addr [[SRC]] to [init] [[OUT]]
1607+
// CHECK: destroy_addr [[SRC]]
1608+
// CHECK: dealloc_stack [[SRC]]
1609+
// CHECK-LABEL: } // end sil function 'take_from_original_copy_addr__final_use_copy_addr_copy'
1610+
sil [ossa] @take_from_original_copy_addr__final_use_copy_addr_copy : $() -> @out Klass {
1611+
entry(%out : $*Klass):
1612+
%getKlass = function_ref @getKlass : $@convention(thin) () -> @owned Klass
1613+
%user = function_ref @inguaranteed_user_without_result : $@convention(thin) (@in_guaranteed Klass) -> ()
1614+
%instance_1 = apply %getKlass() : $@convention(thin) () -> @owned Klass
1615+
%src = alloc_stack $Klass
1616+
store %instance_1 to [init] %src : $*Klass
1617+
apply %user(%src) : $@convention(thin) (@in_guaranteed Klass) -> ()
1618+
%tmp = alloc_stack $Klass
1619+
copy_addr [take] %src to [init] %tmp : $*Klass
1620+
copy_addr %tmp to [init] %out : $*Klass
1621+
destroy_addr %tmp : $*Klass
1622+
dealloc_stack %tmp : $*Klass
1623+
dealloc_stack %src : $*Klass
1624+
%retval = tuple ()
1625+
return %retval : $()
1626+
}
1627+
15091628
// This does not get optimized correctly because of the conservative treatment of load_borrow/end_borrow in MemBehavior
15101629
// CHECK-LABEL: sil [ossa] @test_temprvoborrowboundary1 :
15111630
// CHECK: copy_addr

0 commit comments

Comments
 (0)