@@ -23,13 +23,37 @@ sil_global [let] @gstr : $Str = {
2323class B { }
2424class E : B { }
2525
26+ class C {
27+ @_hasStorage var c: Builtin.Int64
28+ }
29+
30+ class D : C {
31+ @_hasStorage var d: Builtin.Int64
32+ }
33+
2634sil_global hidden [let] @gb : $B
2735sil_global hidden [let] @gb2 : $(B, Int64)
2836
2937sil_global private @gb_obj : $B = {
3038 %initval = object $B ()
3139}
3240
41+ sil_global [let] @gc : $D = {
42+ %0 = integer_literal $Builtin.Int64, 0
43+ %1 = integer_literal $Builtin.Int64, 1
44+ %2 = integer_literal $Builtin.Int64, 2
45+ %3 = integer_literal $Builtin.Int64, 3
46+ %initval = object $D (%0, %1, [tail_elems] %2, %3)
47+ }
48+
49+ sil_global @gc_var : $D = {
50+ %0 = integer_literal $Builtin.Int64, 0
51+ %1 = integer_literal $Builtin.Int64, 1
52+ %2 = integer_literal $Builtin.Int64, 2
53+ %3 = integer_literal $Builtin.Int64, 3
54+ %initval = object $D (%0, %1, [tail_elems] %2, %3)
55+ }
56+
3357sil [global_init_once_fn] @init_gb : $@convention(c) () -> () {
3458bb0:
3559 alloc_global @gb
@@ -469,3 +493,40 @@ bb0(%0 : $*B):
469493 return %3 : $()
470494}
471495
496+ // CHECK-LABEL: sil [ossa] @load_from_global_object :
497+ // CHECK-DAG: [[I0:%.*]] = integer_literal $Builtin.Int64, 0
498+ // CHECK-DAG: [[I1:%.*]] = integer_literal $Builtin.Int64, 1
499+ // CHECK-DAG: [[I2:%.*]] = integer_literal $Builtin.Int64, 2
500+ // CHECK-DAG: [[I3:%.*]] = integer_literal $Builtin.Int64, 3
501+ // CHECK: [[T:%.*]] = tuple ([[I0]] : $Builtin.Int64, [[I1]] : $Builtin.Int64, [[I2]] : $Builtin.Int64, [[I3]] : $Builtin.Int64)
502+ // CHECK: return [[T]]
503+ // CHECK: } // end sil function 'load_from_global_object'
504+ sil [ossa] @load_from_global_object : $@convention(thin) () -> (Builtin.Int64, Builtin.Int64, Builtin.Int64, Builtin.Int64) {
505+ bb0:
506+ %0 = global_value @gc : $D
507+ %1 = upcast %0 to $C
508+ %2 = ref_element_addr %1, #C.c
509+ %3 = ref_element_addr %0, #D.d
510+ %4 = ref_tail_addr %1, $Builtin.Int64
511+ %5 = integer_literal $Builtin.Word, 1
512+ %6 = index_addr %4, %5
513+ %7 = load [trivial] %2
514+ %8 = load [trivial] %3
515+ %9 = load [trivial] %4
516+ %10 = load [trivial] %6
517+ %11 = tuple (%7, %8, %9, %10)
518+ return %11
519+ }
520+
521+ // CHECK-LABEL: sil [ossa] @dont_load_from_global_var_object :
522+ // CHECK: [[L:%.*]] = load
523+ // CHECK: return [[L]]
524+ // CHECK: } // end sil function 'dont_load_from_global_var_object'
525+ sil [ossa] @dont_load_from_global_var_object : $@convention(thin) () -> Builtin.Int64 {
526+ bb0:
527+ %0 = global_value @gc_var : $D
528+ %1 = ref_element_addr %0, #D.d
529+ %2 = load [trivial] %1
530+ return %2
531+ }
532+
0 commit comments