@@ -11,10 +11,16 @@ import SwiftShims
11
11
// CHECK: bb0([[IN:%[0-9]+]] : $*UInt8):
12
12
// CHECK-NEXT: [[IN_GEP:%[0-9]+]] = struct_element_addr [[IN]] : $*UInt8, #UInt8._value
13
13
// CHECK-NEXT: [[IN_LOADED:%[0-9]+]] = load [trivial] [[IN_GEP]] : $*Builtin.Int8
14
+ // CHECK-NEXT: [[LITERAL:%[0-9]+]] = integer_literal $Builtin.Int8, 1
15
+ // CHECK-NEXT: [[UINT8:%.*]] = struct $UInt8 ([[LITERAL]] : $Builtin.Int8)
16
+ // CHECK-NEXT: store [[UINT8]] to [trivial] [[IN]] : $*UInt8
14
17
// CHECK-NEXT: return [[IN_LOADED]] : $Builtin.Int8
15
18
sil [ossa] @struct_extract_load_to_load_struct_element_addr : $@convention(thin) (@inout UInt8) -> (Builtin.Int8) {
16
19
bb0(%0 : $*UInt8):
17
20
%1 = load [trivial] %0 : $*UInt8
21
+ %2 = integer_literal $Builtin.Int8, 1
22
+ %3 = struct_element_addr %0 : $*UInt8, #UInt8._value
23
+ store %2 to [trivial] %3 : $*Builtin.Int8
18
24
%5 = struct_extract %1 : $UInt8, #UInt8._value
19
25
return %5 : $Builtin.Int8
20
26
}
@@ -23,10 +29,16 @@ bb0(%0 : $*UInt8):
23
29
// CHECK: bb0([[IN:%[0-9]+]] : $*(Builtin.Int8, Builtin.Int8)):
24
30
// CHECK-NEXT: [[IN_GEP:%[0-9]+]] = tuple_element_addr [[IN]] : $*(Builtin.Int8, Builtin.Int8), 0
25
31
// CHECK-NEXT: [[IN_LOADED:%[0-9]+]] = load [trivial] [[IN_GEP]] : $*Builtin.Int8
32
+ // CHECK-NEXT: [[LITERAL:%[0-9]+]] = integer_literal $Builtin.Int8, 1
33
+ // CHECK-NEXT: [[IN_STORE_GEP:%[0-9]+]] = tuple_element_addr %0 : $*(Builtin.Int8, Builtin.Int8), 0
34
+ // CHECK-NEXT: store [[LITERAL]] to [trivial] [[IN_STORE_GEP]] : $*Builtin.Int8
26
35
// CHECK-NEXT: return [[IN_LOADED]] : $Builtin.Int8
27
36
sil [ossa] @tuple_extract_load_to_load_tuple_element_addr : $@convention(thin) (@inout (Builtin.Int8, Builtin.Int8)) -> (Builtin.Int8) {
28
37
bb0(%0 : $*(Builtin.Int8, Builtin.Int8)):
29
38
%1 = load [trivial] %0 : $*(Builtin.Int8, Builtin.Int8)
39
+ %2 = integer_literal $Builtin.Int8, 1
40
+ %3 = tuple_element_addr %0 : $*(Builtin.Int8, Builtin.Int8), 0
41
+ store %2 to [trivial] %3 : $*Builtin.Int8
30
42
%5 = tuple_extract %1 : $(Builtin.Int8, Builtin.Int8), 0
31
43
return %5 : $Builtin.Int8
32
44
}
@@ -36,12 +48,18 @@ bb0(%0 : $*(Builtin.Int8, Builtin.Int8)):
36
48
// CHECK-LABEL: sil [ossa] @multiple_use_struct_extract_load_to_load_struct_element_addr
37
49
// CHECK: bb0([[IN:%[0-9]+]] : $*UInt8):
38
50
// CHECK-NEXT: load
51
+ // CHECK-NEXT: integer_literal
52
+ // CHECK-NEXT: struct
53
+ // CHECK-NEXT: store
39
54
// CHECK-NEXT: struct_extract
40
55
// CHECK-NEXT: tuple
41
56
// CHECK-NEXT: return
42
57
sil [ossa] @multiple_use_struct_extract_load_to_load_struct_element_addr : $@convention(thin) (@inout UInt8) -> (UInt8, Builtin.Int8) {
43
58
bb0(%0 : $*UInt8):
44
59
%1 = load [trivial] %0 : $*UInt8
60
+ %2 = integer_literal $Builtin.Int8, 1
61
+ %3 = struct_element_addr %0 : $*UInt8, #UInt8._value
62
+ store %2 to [trivial] %3 : $*Builtin.Int8
45
63
%5 = struct_extract %1 : $UInt8, #UInt8._value
46
64
%6 = tuple (%1 : $UInt8, %5 : $Builtin.Int8)
47
65
return %6 : $(UInt8, Builtin.Int8)
@@ -52,12 +70,18 @@ bb0(%0 : $*UInt8):
52
70
// CHECK-LABEL: sil [ossa] @multiple_use_tuple_extract_load_to_load_tuple_element_addr
53
71
// CHECK: bb0
54
72
// CHECK-NEXT: load
73
+ // CHECK-NEXT: integer_literal
74
+ // CHECK-NEXT: tuple_element_addr
75
+ // CHECK-NEXT: store
55
76
// CHECK-NEXT: tuple_extract
56
77
// CHECK-NEXT: tuple
57
78
// CHECK-NEXT: return
58
79
sil [ossa] @multiple_use_tuple_extract_load_to_load_tuple_element_addr : $@convention(thin) (@inout (Builtin.Int8, Builtin.Int8)) -> ((Builtin.Int8, Builtin.Int8), Builtin.Int8) {
59
80
bb0(%0 : $*(Builtin.Int8, Builtin.Int8)):
60
81
%1 = load [trivial] %0 : $*(Builtin.Int8, Builtin.Int8)
82
+ %2 = integer_literal $Builtin.Int8, 1
83
+ %3 = tuple_element_addr %0 : $*(Builtin.Int8, Builtin.Int8), 0
84
+ store %2 to [trivial] %3 : $*Builtin.Int8
61
85
%5 = tuple_extract %1 : $(Builtin.Int8, Builtin.Int8), 0
62
86
%6 = tuple (%1 : $(Builtin.Int8, Builtin.Int8), %5 : $Builtin.Int8)
63
87
return %6 : $((Builtin.Int8, Builtin.Int8), Builtin.Int8)
@@ -115,3 +139,32 @@ bb0(%0 : $*X1):
115
139
%result = tuple (%a : $Int, %copy1 : $AnyObject, %copy2 : $AnyObject)
116
140
return %result : $(Int, AnyObject, AnyObject)
117
141
}
142
+
143
+ struct X2 {
144
+ @_hasStorage @_hasInitialValue var obj: AnyObject { get set }
145
+ }
146
+
147
+ struct X3 {
148
+ @_hasStorage @_hasInitialValue var x2: X2 { get set }
149
+ }
150
+
151
+ // CHECK-LABEL: sil private [ossa] @testStoreNontrivial : $@convention(thin) (@inout X3, @guaranteed AnyObject) -> () {
152
+ // CHECK-LABEL: bb0(%0 : $*X3, %1 : @guaranteed $AnyObject):
153
+ // CHECK: [[CP:%.*]] = copy_value %1 : $AnyObject
154
+ // CHECK: [[ACCESS:%.*]] = begin_access [modify] [unknown] %0 : $*X3
155
+ // CHECK: [[X2:%.*]] = struct $X2 ([[CP]] : $AnyObject)
156
+ // CHECK: [[X3:%.*]] = struct $X3 ([[X2]] : $X2)
157
+ // CHECK: store [[X3]] to [assign] [[ACCESS]] : $*X3
158
+ // CHECK: end_access [[ACCESS]] : $*X3
159
+ // CHECK-LABEL: } // end sil function 'testStoreNontrivial'
160
+ sil private [ossa] @testStoreNontrivial : $@convention(thin) (@inout X3, @guaranteed AnyObject) -> () {
161
+ bb0(%0 : $*X3, %1 : $AnyObject):
162
+ %4 = copy_value %1 : $AnyObject
163
+ %5 = begin_access [modify] [unknown] %0 : $*X3
164
+ %6 = struct_element_addr %5 : $*X3, #X3.x2
165
+ %7 = struct_element_addr %6 : $*X2, #X2.obj
166
+ store %4 to [assign] %7 : $*AnyObject
167
+ end_access %5 : $*X3
168
+ %12 = tuple ()
169
+ return %12 : $()
170
+ }
0 commit comments