@@ -44,6 +44,9 @@ public enum NonTrivialEnum {
4444 case third( NonTrivialStruct )
4545}
4646
47+ var varGlobal = NonTrivialStruct ( )
48+ let letGlobal = NonTrivialStruct ( )
49+
4750public func borrowVal( _ e : NonTrivialEnum ) { }
4851public func borrowVal( _ e : FD ) { }
4952public func borrowVal( _ k: CopyableKlass ) { }
@@ -517,3 +520,123 @@ func enumSwitchTest1(_ e: EnumSwitchTests.E) {
517520 break
518521 }
519522}
523+
524+ //////////////////////
525+ // Global Addr Test //
526+ //////////////////////
527+
528+ // Make sure that we emit a new global_addr for each use.
529+ // CHECK-LABEL: sil hidden [ossa] @$s8moveonly16testGlobalBorrowyyF : $@convention(thin) () -> () {
530+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
531+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [no_consume_or_assign] [[GLOBAL]]
532+ // CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[MARKED_GLOBAL]]
533+ // CHECK: [[LOADED_VAL:%.*]] = load_borrow [[ACCESS]]
534+ // CHECK: apply {{%.*}}([[LOADED_VAL]])
535+ // CHECK: end_borrow [[LOADED_VAL]]
536+ // CHECK: end_access [[ACCESS]]
537+ //
538+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
539+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [no_consume_or_assign] [[GLOBAL]]
540+ // CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[MARKED_GLOBAL]]
541+ // CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]]
542+ // CHECK: [[LOADED_VAL:%.*]] = load_borrow [[GEP]]
543+ // CHECK: apply {{%.*}}([[LOADED_VAL]])
544+ // CHECK: end_borrow [[LOADED_VAL]]
545+ // CHECK: end_access [[ACCESS]]
546+ //
547+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
548+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [no_consume_or_assign] [[GLOBAL]]
549+ // CHECK: [[LOADED_VAL:%.*]] = load [copy] [[MARKED_GLOBAL]]
550+ // CHECK: apply {{%.*}}([[LOADED_VAL]])
551+ // CHECK: destroy_value [[LOADED_VAL]]
552+ //
553+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
554+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [no_consume_or_assign] [[GLOBAL]]
555+ // CHECK: [[LOADED_VAL:%.*]] = load [copy] [[MARKED_GLOBAL]]
556+ // CHECK: [[LOADED_BORROWED_VAL:%.*]] = begin_borrow [[LOADED_VAL]]
557+ // CHECK: [[LOADED_GEP:%.*]] = struct_extract [[LOADED_BORROWED_VAL]]
558+ // CHECK: [[LOADED_GEP_COPY:%.*]] = copy_value [[LOADED_GEP]]
559+ // CHECK: end_borrow [[LOADED_BORROWED_VAL]]
560+ // CHECK: destroy_value [[LOADED_VAL]]
561+ // CHECK: apply {{%.*}}([[LOADED_GEP_COPY]])
562+ // CHECK: destroy_value [[LOADED_GEP_COPY]]
563+ // CHECK: } // end sil function '$s8moveonly16testGlobalBorrowyyF'
564+ func testGlobalBorrow( ) {
565+ borrowVal ( varGlobal)
566+ borrowVal ( varGlobal. nonTrivialStruct2)
567+ borrowVal ( letGlobal)
568+ borrowVal ( letGlobal. nonTrivialStruct2)
569+ }
570+
571+ // CHECK-LABEL: sil hidden [ossa] @$s8moveonly17testGlobalConsumeyyF : $@convention(thin) () -> () {
572+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
573+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
574+ // CHECK: [[ACCESS:%.*]] = begin_access [deinit] [dynamic] [[MARKED_GLOBAL]]
575+ // CHECK: [[LOADED_VAL:%.*]] = load [take]
576+ // CHECK: apply {{%.*}}([[LOADED_VAL]])
577+ // CHECK: end_access [[ACCESS]]
578+ //
579+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
580+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
581+ // CHECK: [[ACCESS:%.*]] = begin_access [deinit] [dynamic] [[MARKED_GLOBAL]]
582+ // CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]]
583+ // CHECK: [[LOADED_VAL:%.*]] = load [take] [[GEP]]
584+ // CHECK: apply {{%.*}}([[LOADED_VAL]])
585+ // CHECK: end_access [[ACCESS]]
586+ //
587+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
588+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [no_consume_or_assign] [[GLOBAL]]
589+ // CHECK: [[LOADED_VAL:%.*]] = load [copy] [[MARKED_GLOBAL]]
590+ // CHECK: apply {{%.*}}([[LOADED_VAL]])
591+ //
592+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9letGlobalAA16NonTrivialStructVvp :
593+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [no_consume_or_assign] [[GLOBAL]]
594+ // CHECK: [[LOADED_VAL:%.*]] = load [copy] [[MARKED_GLOBAL]]
595+ // CHECK: [[LOADED_BORROWED_VAL:%.*]] = begin_borrow [[LOADED_VAL]]
596+ // CHECK: [[LOADED_GEP:%.*]] = struct_extract [[LOADED_BORROWED_VAL]]
597+ // CHECK: [[LOADED_GEP_COPY:%.*]] = copy_value [[LOADED_GEP]]
598+ // CHECK: end_borrow [[LOADED_BORROWED_VAL]]
599+ // CHECK: destroy_value [[LOADED_VAL]]
600+ // CHECK: apply {{%.*}}([[LOADED_GEP_COPY]])
601+ //
602+ // CHECK: } // end sil function '$s8moveonly17testGlobalConsumeyyF'
603+ func testGlobalConsume( ) {
604+ consumeVal ( varGlobal)
605+ consumeVal ( varGlobal. nonTrivialStruct2)
606+ consumeVal ( letGlobal)
607+ consumeVal ( letGlobal. nonTrivialStruct2)
608+ }
609+
610+ // CHECK-LABEL: sil hidden [ossa] @$s8moveonly16testGlobalAssignyyF : $@convention(thin) () -> () {
611+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
612+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
613+ // CHECK: [[ACCESS:%.*]] = begin_access [modify] [dynamic] [[MARKED_GLOBAL]]
614+ // CHECK: assign {{%.*}} to [[ACCESS]]
615+ // CHECK: end_access [[ACCESS]]
616+ //
617+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
618+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
619+ // CHECK: [[ACCESS:%.*]] = begin_access [modify] [dynamic] [[MARKED_GLOBAL]]
620+ // CHECK: assign {{%.*}} to [[ACCESS]]
621+ // CHECK: end_access [[ACCESS]]
622+ //
623+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
624+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
625+ // CHECK: [[ACCESS:%.*]] = begin_access [modify] [dynamic] [[MARKED_GLOBAL]]
626+ // CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]]
627+ // CHECK: assign {{%.*}} to [[GEP]]
628+ // CHECK: end_access [[ACCESS]]
629+ //
630+ // CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly9varGlobalAA16NonTrivialStructVvp :
631+ // CHECK: [[MARKED_GLOBAL:%.*]] = mark_must_check [assignable_but_not_consumable] [[GLOBAL]]
632+ // CHECK: [[ACCESS:%.*]] = begin_access [modify] [dynamic] [[MARKED_GLOBAL]]
633+ // CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]]
634+ // CHECK: assign {{%.*}} to [[GEP]]
635+ // CHECK: end_access [[ACCESS]]
636+ // CHECK: } // end sil function '$s8moveonly16testGlobalAssignyyF'
637+ func testGlobalAssign( ) {
638+ varGlobal = NonTrivialStruct ( )
639+ varGlobal = NonTrivialStruct ( )
640+ varGlobal. nonTrivialStruct2 = NonTrivialStruct2 ( )
641+ varGlobal. nonTrivialStruct2 = NonTrivialStruct2 ( )
642+ }
0 commit comments