Skip to content

Commit 5d4d814

Browse files
committed
update existing SILGen tests
Note that the changes from `load_borrow` to `load [copy]` are for copyable types at the end of an access chain. So far this patch just makes more noncopyable things get borrowed when accessed, like globals, which is what we want.
1 parent 6e5b49a commit 5d4d814

File tree

1 file changed

+47
-46
lines changed

1 file changed

+47
-46
lines changed

test/SILGen/moveonly.swift

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -373,41 +373,43 @@ func moveOnlyStructMoveOnlyStructNonConsumingUse() {
373373
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
374374
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialStruct2
375375
// CHECK: [[GEP2:%.*]] = struct_element_addr [[GEP1]] : $*NonTrivialStruct2, #NonTrivialStruct2.copyableKlass
376-
// CHECK: [[BORROW:%.*]] = load_borrow [[GEP2]]
377-
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF : $@convention(thin) (@guaranteed CopyableKlass) -> ()
378-
// CHECK: apply [[FN]]([[BORROW]])
379-
// CHECK: end_borrow [[BORROW]]
376+
// CHECK: [[COPY:%.*]] = load [copy] [[GEP2]] : $*CopyableKlass
380377
// CHECK: end_access [[ACCESS]]
378+
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF : $@convention(thin) (@guaranteed CopyableKlass) -> ()
379+
// CHECK: apply [[FN]]([[COPY]])
380+
// CHECK: destroy_value [[COPY]] : $CopyableKlass
381381
// CHECK: } // end sil function '$s8moveonly018moveOnlyStructMovecD28CopyableKlassNonConsumingUseyyF'
382382
func moveOnlyStructMoveOnlyStructCopyableKlassNonConsumingUse() {
383383
var k = NonTrivialStruct()
384384
k = NonTrivialStruct()
385385
borrowVal(k.nonTrivialStruct2.copyableKlass)
386386
}
387387

388-
// CHECK-LABEL: sil hidden [ossa] @$s8moveonly42moveOnlyStructCopyableKlassNonConsumingUseyyF : $@convention(thin) () -> () {
389-
// CHECK: [[BOX:%.*]] = alloc_box
390-
// CHECK: [[BORROW_BOX:%.*]] = begin_borrow [lexical]
391-
//
388+
// CHECK-LABEL: sil hidden [ossa] @$s8moveonly021moveOnlyStructSetMoveC5FieldyyF : $@convention(thin) () -> () {
389+
// CHECK: [[BOX:%.*]] = alloc_box ${ var NonTrivialStruct }
390+
// CHECK: [[BORROW_BOX:%.*]] = begin_borrow [lexical] [[BOX]]
392391
// CHECK: project_box
393392
// CHECK: store
393+
//
394+
// CHECK: [[BOX2:%.*]] = alloc_box ${ let NonTrivialStruct2 }
395+
// CHECK: [[BORROW_BOX2:%.*]] = begin_borrow [lexical] [[BOX2]]
394396
// CHECK: project_box
395-
// CHECK: assign
397+
// CHECK: store
396398
//
397-
// CHECK: [[PROJECT:%.*]] = project_box [[BORROWED_BOX]]
398-
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
399-
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
400-
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.copyableKlass
401-
// CHECK: [[BORROW:%.*]] = load_borrow [[GEP]]
402-
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF : $@convention(thin) (@guaranteed CopyableKlass) -> ()
403-
// CHECK: apply [[FN]]([[BORROW]])
404-
// CHECK: end_borrow [[BORROW]]
399+
// CHECK: [[PROJECT1:%.*]] = project_box [[BORROW_BOX]]
400+
// CHECK: [[PROJECT2:%.*]] = project_box [[BORROW_BOX2]]
401+
// CHECK: [[MARKED_ADDR2:%.*]] = mark_must_check [assignable_but_not_consumable] [[PROJECT2]] : $*NonTrivialStruct2
402+
// CHECK: [[CONSUMED_LET:%.*]] = load [copy] [[MARKED_ADDR2]] : $*NonTrivialStruct2
403+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unknown] [[PROJECT1]]
404+
// CHECK: [[MARKED_ADDR1:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
405+
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARKED_ADDR1]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialStruct2
406+
// CHECK: assign [[CONSUMED_LET]] to [[GEP]] : $*NonTrivialStruct2
405407
// CHECK: end_access [[ACCESS]]
406-
// CHECK: } // end sil function '$s8moveonly42moveOnlyStructCopyableKlassNonConsumingUseyyF'
407-
func moveOnlyStructCopyableKlassNonConsumingUse() {
408+
// CHECK: } // end sil function '$s8moveonly021moveOnlyStructSetMoveC5FieldyyF'
409+
func moveOnlyStructSetMoveOnlyField() {
408410
var k = NonTrivialStruct()
409-
k = NonTrivialStruct()
410-
borrowVal(k.copyableKlass)
411+
let new = NonTrivialStruct2()
412+
k.nonTrivialStruct2 = new
411413
}
412414

413415
// CHECK-LABEL: sil hidden [ossa] @$s8moveonly022moveOnlyStructCopyableD15NonConsumingUseyyF : $@convention(thin) () -> () {
@@ -423,11 +425,11 @@ func moveOnlyStructCopyableKlassNonConsumingUse() {
423425
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
424426
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
425427
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialCopyableStruct
426-
// CHECK: [[BORROW:%.*]] = load_borrow [[GEP]]
427-
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA24NonTrivialCopyableStructVhF :
428-
// CHECK: apply [[FN]]([[BORROW]])
429-
// CHECK: end_borrow [[BORROW]]
428+
// CHECK: [[COPY:%.*]] = load [copy] [[GEP]] : $*NonTrivialCopyableStruct
430429
// CHECK: end_access [[ACCESS]]
430+
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA24NonTrivialCopyableStructVhF :
431+
// CHECK: apply [[FN]]([[COPY]])
432+
// CHECK: destroy_value [[COPY]] : $NonTrivialCopyableStruct
431433
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyableD15NonConsumingUseyyF'
432434
func moveOnlyStructCopyableStructNonConsumingUse() {
433435
var k = NonTrivialStruct()
@@ -449,11 +451,11 @@ func moveOnlyStructCopyableStructNonConsumingUse() {
449451
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
450452
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialCopyableStruct
451453
// CHECK: [[GEP2:%.*]] = struct_element_addr [[GEP1]] : $*NonTrivialCopyableStruct, #NonTrivialCopyableStruct.copyableKlass
452-
// CHECK: [[BORROW:%.*]] = load_borrow [[GEP2]]
453-
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF :
454-
// CHECK: apply [[FN]]([[BORROW]])
455-
// CHECK: end_borrow [[BORROW]]
454+
// CHECK: [[COPY:%.*]] = load [copy] [[GEP2]] : $*CopyableKlass
456455
// CHECK: end_access [[ACCESS]]
456+
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF :
457+
// CHECK: apply [[FN]]([[COPY]])
458+
// CHECK: destroy_value [[COPY]] : $CopyableKlass
457459
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyabledE20KlassNonConsumingUseyyF'
458460
func moveOnlyStructCopyableStructCopyableKlassNonConsumingUse() {
459461
var k = NonTrivialStruct()
@@ -475,11 +477,11 @@ func moveOnlyStructCopyableStructCopyableKlassNonConsumingUse() {
475477
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
476478
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialCopyableStruct
477479
// CHECK: [[GEP2:%.*]] = struct_element_addr [[GEP1]] : $*NonTrivialCopyableStruct, #NonTrivialCopyableStruct.nonTrivialCopyableStruct2
478-
// CHECK: [[BORROW:%.*]] = load_borrow [[GEP2]]
479-
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA25NonTrivialCopyableStruct2VhF :
480-
// CHECK: apply [[FN]]([[BORROW]])
481-
// CHECK: end_borrow [[BORROW]]
480+
// CHECK: [[COPY:%.*]] = load [copy] [[GEP2]] : $*NonTrivialCopyableStruct2
482481
// CHECK: end_access [[ACCESS]]
482+
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA25NonTrivialCopyableStruct2VhF :
483+
// CHECK: apply [[FN]]([[COPY]])
484+
// CHECK: destroy_value [[COPY]] : $NonTrivialCopyableStruct2
483485
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyabledeD15NonConsumingUseyyF'
484486
func moveOnlyStructCopyableStructCopyableStructNonConsumingUse() {
485487
var k = NonTrivialStruct()
@@ -502,11 +504,11 @@ func moveOnlyStructCopyableStructCopyableStructNonConsumingUse() {
502504
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialCopyableStruct
503505
// CHECK: [[GEP2:%.*]] = struct_element_addr [[GEP1]] : $*NonTrivialCopyableStruct, #NonTrivialCopyableStruct.nonTrivialCopyableStruct2
504506
// CHECK: [[GEP3:%.*]] = struct_element_addr [[GEP2]] : $*NonTrivialCopyableStruct2, #NonTrivialCopyableStruct2.copyableKlass
505-
// CHECK: [[BORROW:%.*]] = load_borrow [[GEP3]]
506-
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF :
507-
// CHECK: apply [[FN]]([[BORROW]])
508-
// CHECK: end_borrow [[BORROW]]
507+
// CHECK: [[COPY:%.*]] = load [copy] [[GEP3]] : $*CopyableKlass
509508
// CHECK: end_access [[ACCESS]]
509+
// CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF :
510+
// CHECK: apply [[FN]]([[COPY]])
511+
// CHECK: destroy_value [[COPY]] : $CopyableKlass
510512
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyablededE20KlassNonConsumingUseyyF'
511513
func moveOnlyStructCopyableStructCopyableStructCopyableKlassNonConsumingUse() {
512514
var k = NonTrivialStruct()
@@ -662,7 +664,7 @@ func enumSwitchTest1(_ e: __shared EnumSwitchTests.E) {
662664
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
663665
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[GLOBAL]]
664666
// CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
665-
// CHECK: [[LOADED_VAL:%.*]] = load_borrow [[MARKED_GLOBAL]]
667+
// CHECK: [[LOADED_VAL:%.*]] = load_borrow [[MARKED_GLOBAL]] : $*NonTrivialStruct
666668
// CHECK: apply {{%.*}}([[LOADED_VAL]])
667669
// CHECK: end_borrow [[LOADED_VAL]]
668670
// CHECK: end_access [[ACCESS]]
@@ -671,27 +673,26 @@ func enumSwitchTest1(_ e: __shared EnumSwitchTests.E) {
671673
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[GLOBAL]]
672674
// CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
673675
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARKED_GLOBAL]]
674-
// CHECK: [[LOADED_VAL:%.*]] = load_borrow [[GEP]]
676+
// CHECK: [[LOADED_VAL:%.*]] = load_borrow [[GEP]] : $*NonTrivialStruct2
675677
// CHECK: apply {{%.*}}([[LOADED_VAL]])
676678
// CHECK: end_borrow [[LOADED_VAL]]
677679
// CHECK: end_access [[ACCESS]]
678680
//
679681
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
680682
// CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
681-
// CHECK: [[LOADED_VAL:%.*]] = load [copy] [[MARKED_GLOBAL]]
683+
// CHECK: [[LOADED_VAL:%.*]] = load_borrow [[MARKED_GLOBAL]] : $*NonTrivialStruct
682684
// CHECK: apply {{%.*}}([[LOADED_VAL]])
683-
// CHECK: destroy_value [[LOADED_VAL]]
685+
// CHECK: end_borrow [[LOADED_VAL]]
684686
//
685687
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
686688
// CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
687-
// CHECK: [[LOADED_VAL:%.*]] = load [copy] [[MARKED_GLOBAL]]
689+
// FIXME: this copy probably shouldn't be here when accessing through the letGlobal, but maybe it's cleaned up?
690+
// CHECK: [[LOADED_VAL:%.*]] = load [copy] [[MARKED_GLOBAL]] : $*NonTrivialStruct
688691
// CHECK: [[LOADED_BORROWED_VAL:%.*]] = begin_borrow [[LOADED_VAL]]
689-
// CHECK: [[LOADED_GEP:%.*]] = struct_extract [[LOADED_BORROWED_VAL]]
690-
// CHECK: [[LOADED_GEP_COPY:%.*]] = copy_value [[LOADED_GEP]]
692+
// CHECK: [[LOADED_GEP:%.*]] = struct_extract [[LOADED_BORROWED_VAL]] : $NonTrivialStruct, #NonTrivialStruct.nonTrivialStruct2
693+
// CHECK: apply {{%.*}}([[LOADED_GEP]])
691694
// CHECK: end_borrow [[LOADED_BORROWED_VAL]]
692695
// CHECK: destroy_value [[LOADED_VAL]]
693-
// CHECK: apply {{%.*}}([[LOADED_GEP_COPY]])
694-
// CHECK: destroy_value [[LOADED_GEP_COPY]]
695696
// CHECK: } // end sil function '$s8moveonly16testGlobalBorrowyyF'
696697
func testGlobalBorrow() {
697698
borrowVal(varGlobal)

0 commit comments

Comments
 (0)