@@ -160,6 +160,25 @@ bb0(%0 : $TestClass, %1 : $@thick T.Type):
160
160
return %p : $Builtin.RawPointer
161
161
}
162
162
163
+ struct Str<T> {
164
+ var t: T
165
+ }
166
+
167
+ // CHECK-LABEL: define{{( protected)?}} i8* @project_tail_generic_struct
168
+ // CHECK: [[S1:%[0-9]+]] = add i64 17, %flags.alignmentMask
169
+ // CHECK-NEXT: [[S2:%[0-9]+]] = xor i64 %flags.alignmentMask, -1
170
+ // CHECK-NEXT: [[S3:%[0-9]+]] = and i64 [[S1]], [[S2]]
171
+ // CHECK-NEXT: [[S4:%[0-9]+]] = bitcast %{{.*}}* %0 to i8*
172
+ // CHECK-NEXT: [[S5:%[0-9]+]] = getelementptr inbounds i8, i8* [[S4]], i64 [[S3]]
173
+ // CHECK-NEXT: %tailaddr = bitcast i8* [[S5]] to %{{.*}}Str
174
+ // CHECK: ret
175
+ sil @project_tail_generic_struct : $@convention(thin) <T> (TestClass, @thick T.Type) -> Builtin.RawPointer {
176
+ bb0(%0 : $TestClass, %1 : $@thick T.Type):
177
+ %a = ref_tail_addr %0 : $TestClass, $Str<T>
178
+ %p = address_to_pointer %a : $*Str<T> to $Builtin.RawPointer
179
+ return %p : $Builtin.RawPointer
180
+ }
181
+
163
182
// CHECK-LABEL: define{{( protected)?}} void @project_tail_index_byte_to_int
164
183
// CHECK: [[S1:%[0-9]+]] = bitcast i8* %0 to %Vs4Int8*
165
184
// CHECK-NEXT: [[S2:%[0-9]+]] = getelementptr inbounds %Vs4Int8, %Vs4Int8* [[S1]], i64 2
@@ -179,6 +198,22 @@ bb0(%0 : $Builtin.RawPointer, %1 : $Int32):
179
198
return %r : $()
180
199
}
181
200
201
+ // CHECK-LABEL: define{{( protected)?}} i8* @project_tail_index_generic_struct
202
+ // CHECK: call %swift.type* @{{.*Str.*}}(%swift.type* %T)
203
+ // CHECK: load
204
+ // CHECK: and
205
+ // CHECK: xor
206
+ // CHECK: and
207
+ // CHECK: ret
208
+ sil @project_tail_index_generic_struct : $@convention(thin) <T> (Builtin.RawPointer, @thick T.Type) -> Builtin.RawPointer {
209
+ bb0(%0 : $Builtin.RawPointer, %1 : $@thick T.Type):
210
+ %a1 = pointer_to_address %0 : $Builtin.RawPointer to [strict] $*Int8
211
+ %c = integer_literal $Builtin.Word, 2
212
+ %a2 = tail_addr %a1 : $*Int8, %c : $Builtin.Word, $Str<T>
213
+ %p = address_to_pointer %a2 : $*Str<T> to $Builtin.RawPointer
214
+ return %p : $Builtin.RawPointer
215
+ }
216
+
182
217
// sizeof(EmptyClass) = 16 bytes
183
218
class EmptyClass {
184
219
}
0 commit comments