@@ -373,41 +373,43 @@ func moveOnlyStructMoveOnlyStructNonConsumingUse() {
373
373
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
374
374
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialStruct2
375
375
// 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
380
377
// 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
381
381
// CHECK: } // end sil function '$s8moveonly018moveOnlyStructMovecD28CopyableKlassNonConsumingUseyyF'
382
382
func moveOnlyStructMoveOnlyStructCopyableKlassNonConsumingUse( ) {
383
383
var k = NonTrivialStruct ( )
384
384
k = NonTrivialStruct ( )
385
385
borrowVal ( k. nonTrivialStruct2. copyableKlass)
386
386
}
387
387
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]]
392
391
// CHECK: project_box
393
392
// CHECK: store
393
+ //
394
+ // CHECK: [[BOX2:%.*]] = alloc_box ${ let NonTrivialStruct2 }
395
+ // CHECK: [[BORROW_BOX2:%.*]] = begin_borrow [lexical] [[BOX2]]
394
396
// CHECK: project_box
395
- // CHECK: assign
397
+ // CHECK: store
396
398
//
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
405
407
// CHECK: end_access [[ACCESS]]
406
- // CHECK: } // end sil function '$s8moveonly42moveOnlyStructCopyableKlassNonConsumingUseyyF '
407
- func moveOnlyStructCopyableKlassNonConsumingUse ( ) {
408
+ // CHECK: } // end sil function '$s8moveonly021moveOnlyStructSetMoveC5FieldyyF '
409
+ func moveOnlyStructSetMoveOnlyField ( ) {
408
410
var k = NonTrivialStruct ( )
409
- k = NonTrivialStruct ( )
410
- borrowVal ( k . copyableKlass )
411
+ let new = NonTrivialStruct2 ( )
412
+ k . nonTrivialStruct2 = new
411
413
}
412
414
413
415
// CHECK-LABEL: sil hidden [ossa] @$s8moveonly022moveOnlyStructCopyableD15NonConsumingUseyyF : $@convention(thin) () -> () {
@@ -423,11 +425,11 @@ func moveOnlyStructCopyableKlassNonConsumingUse() {
423
425
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
424
426
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
425
427
// 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
430
429
// CHECK: end_access [[ACCESS]]
430
+ // CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA24NonTrivialCopyableStructVhF :
431
+ // CHECK: apply [[FN]]([[COPY]])
432
+ // CHECK: destroy_value [[COPY]] : $NonTrivialCopyableStruct
431
433
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyableD15NonConsumingUseyyF'
432
434
func moveOnlyStructCopyableStructNonConsumingUse( ) {
433
435
var k = NonTrivialStruct ( )
@@ -449,11 +451,11 @@ func moveOnlyStructCopyableStructNonConsumingUse() {
449
451
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
450
452
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialCopyableStruct
451
453
// 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
456
455
// CHECK: end_access [[ACCESS]]
456
+ // CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF :
457
+ // CHECK: apply [[FN]]([[COPY]])
458
+ // CHECK: destroy_value [[COPY]] : $CopyableKlass
457
459
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyabledE20KlassNonConsumingUseyyF'
458
460
func moveOnlyStructCopyableStructCopyableKlassNonConsumingUse( ) {
459
461
var k = NonTrivialStruct ( )
@@ -475,11 +477,11 @@ func moveOnlyStructCopyableStructCopyableKlassNonConsumingUse() {
475
477
// CHECK: [[MARKED_ADDR:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
476
478
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialCopyableStruct
477
479
// 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
482
481
// CHECK: end_access [[ACCESS]]
482
+ // CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA25NonTrivialCopyableStruct2VhF :
483
+ // CHECK: apply [[FN]]([[COPY]])
484
+ // CHECK: destroy_value [[COPY]] : $NonTrivialCopyableStruct2
483
485
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyabledeD15NonConsumingUseyyF'
484
486
func moveOnlyStructCopyableStructCopyableStructNonConsumingUse( ) {
485
487
var k = NonTrivialStruct ( )
@@ -502,11 +504,11 @@ func moveOnlyStructCopyableStructCopyableStructNonConsumingUse() {
502
504
// CHECK: [[GEP1:%.*]] = struct_element_addr [[MARKED_ADDR]] : $*NonTrivialStruct, #NonTrivialStruct.nonTrivialCopyableStruct
503
505
// CHECK: [[GEP2:%.*]] = struct_element_addr [[GEP1]] : $*NonTrivialCopyableStruct, #NonTrivialCopyableStruct.nonTrivialCopyableStruct2
504
506
// 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
509
508
// CHECK: end_access [[ACCESS]]
509
+ // CHECK: [[FN:%.*]] = function_ref @$s8moveonly9borrowValyyAA13CopyableKlassChF :
510
+ // CHECK: apply [[FN]]([[COPY]])
511
+ // CHECK: destroy_value [[COPY]] : $CopyableKlass
510
512
// CHECK: } // end sil function '$s8moveonly022moveOnlyStructCopyablededE20KlassNonConsumingUseyyF'
511
513
func moveOnlyStructCopyableStructCopyableStructCopyableKlassNonConsumingUse( ) {
512
514
var k = NonTrivialStruct ( )
@@ -662,7 +664,7 @@ func enumSwitchTest1(_ e: __shared EnumSwitchTests.E) {
662
664
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
663
665
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[GLOBAL]]
664
666
// 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
666
668
// CHECK: apply {{%.*}}([[LOADED_VAL]])
667
669
// CHECK: end_borrow [[LOADED_VAL]]
668
670
// CHECK: end_access [[ACCESS]]
@@ -671,27 +673,26 @@ func enumSwitchTest1(_ e: __shared EnumSwitchTests.E) {
671
673
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[GLOBAL]]
672
674
// CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[ACCESS]]
673
675
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARKED_GLOBAL]]
674
- // CHECK: [[LOADED_VAL:%.*]] = load_borrow [[GEP]]
676
+ // CHECK: [[LOADED_VAL:%.*]] = load_borrow [[GEP]] : $*NonTrivialStruct2
675
677
// CHECK: apply {{%.*}}([[LOADED_VAL]])
676
678
// CHECK: end_borrow [[LOADED_VAL]]
677
679
// CHECK: end_access [[ACCESS]]
678
680
//
679
681
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
680
682
// 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
682
684
// CHECK: apply {{%.*}}([[LOADED_VAL]])
683
- // CHECK: destroy_value [[LOADED_VAL]]
685
+ // CHECK: end_borrow [[LOADED_VAL]]
684
686
//
685
687
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
686
688
// 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
688
691
// 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]])
691
694
// CHECK: end_borrow [[LOADED_BORROWED_VAL]]
692
695
// CHECK: destroy_value [[LOADED_VAL]]
693
- // CHECK: apply {{%.*}}([[LOADED_GEP_COPY]])
694
- // CHECK: destroy_value [[LOADED_GEP_COPY]]
695
696
// CHECK: } // end sil function '$s8moveonly16testGlobalBorrowyyF'
696
697
func testGlobalBorrow( ) {
697
698
borrowVal ( varGlobal)
0 commit comments