@@ -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'
382382func 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'
432434func 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'
458460func 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'
484486func 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'
511513func 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'
696697func testGlobalBorrow( ) {
697698 borrowVal ( varGlobal)
0 commit comments