@@ -44,6 +44,9 @@ public enum NonTrivialEnum {
44
44
case third( NonTrivialStruct )
45
45
}
46
46
47
+ var varGlobal = NonTrivialStruct ( )
48
+ let letGlobal = NonTrivialStruct ( )
49
+
47
50
public func borrowVal( _ e : NonTrivialEnum ) { }
48
51
public func borrowVal( _ e : FD ) { }
49
52
public func borrowVal( _ k: CopyableKlass ) { }
@@ -517,3 +520,123 @@ func enumSwitchTest1(_ e: EnumSwitchTests.E) {
517
520
break
518
521
}
519
522
}
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