1 // RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
2
3 template <typename X>
4 using matrix_4_4 = X __attribute__((matrix_type(4, 4)));
5
6 template <typename Y>
7 using matrix_5_5 = Y __attribute__((matrix_type(5, 5)));
8
9 // CHECK-LABEL: define{{.*}} void @_Z25CastCharMatrixToIntCStylev()
CastCharMatrixToIntCStyle()10 void CastCharMatrixToIntCStyle() {
11 // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
12 // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
13 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
14 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
15
16 matrix_5_5<char> c;
17 matrix_5_5<int> i;
18 i = (matrix_5_5<int>)c;
19 }
20
21 // CHECK-LABEL: define{{.*}} void @_Z29CastCharMatrixToIntStaticCastv()
CastCharMatrixToIntStaticCast()22 void CastCharMatrixToIntStaticCast() {
23 // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
24 // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
25 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
26 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
27
28 matrix_5_5<char> c;
29 matrix_5_5<int> i;
30 i = static_cast<matrix_5_5<int>>(c);
31 }
32
33 // CHECK-LABEL: define{{.*}} void @_Z33CastCharMatrixToUnsignedIntCStylev
CastCharMatrixToUnsignedIntCStyle()34 void CastCharMatrixToUnsignedIntCStyle() {
35 // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
36 // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
37 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
38 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
39 // CHECK-NEXT: ret void
40
41 matrix_5_5<char> c;
42 matrix_5_5<unsigned int> u;
43 u = (matrix_5_5<unsigned int>)c;
44 }
45
46 // CHECK-LABEL: define{{.*}} void @_Z37CastCharMatrixToUnsignedIntStaticCastv
CastCharMatrixToUnsignedIntStaticCast()47 void CastCharMatrixToUnsignedIntStaticCast() {
48 // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
49 // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
50 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
51 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
52 // CHECK-NEXT: ret void
53
54 matrix_5_5<char> c;
55 matrix_5_5<unsigned int> u;
56 u = static_cast<matrix_5_5<unsigned int>>(c);
57 }
58
59 // CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedLongIntMatrixToShortCStylev
CastUnsignedLongIntMatrixToShortCStyle()60 void CastUnsignedLongIntMatrixToShortCStyle() {
61 // CHECK: [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
62 // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
63 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
64 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
65 // CHECK-NEXT: ret void
66
67 matrix_5_5<unsigned long int> u;
68 matrix_5_5<short int> s;
69 s = (matrix_5_5<short int>)u;
70 }
71
72 // CHECK-LABEL: define{{.*}} void @_Z42CastUnsignedLongIntMatrixToShortStaticCastv
CastUnsignedLongIntMatrixToShortStaticCast()73 void CastUnsignedLongIntMatrixToShortStaticCast() {
74 // CHECK: [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
75 // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
76 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
77 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
78 // CHECK-NEXT: ret void
79
80 matrix_5_5<unsigned long int> u;
81 matrix_5_5<short int> s;
82 s = static_cast<matrix_5_5<short int>>(u);
83 }
84
85 // CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToShortCStylev()
CastIntMatrixToShortCStyle()86 void CastIntMatrixToShortCStyle() {
87 // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
88 // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
89 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
90 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
91 // CHECK-NEXT: ret void
92
93 matrix_5_5<int> i;
94 matrix_5_5<short int> s;
95 s = (matrix_5_5<short int>)i;
96 }
97
98 // CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToShortStaticCastv()
CastIntMatrixToShortStaticCast()99 void CastIntMatrixToShortStaticCast() {
100 // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
101 // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
102 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
103 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
104 // CHECK-NEXT: ret void
105
106 matrix_5_5<int> i;
107 matrix_5_5<short int> s;
108 s = static_cast<matrix_5_5<short int>>(i);
109 }
110
111 // CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToFloatCStylev()
CastIntMatrixToFloatCStyle()112 void CastIntMatrixToFloatCStyle() {
113 // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
114 // CHECK-NEXT: [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
115 // CHECK-NEXT: [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
116 // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
117 // CHECK-NEXT: ret void
118
119 matrix_5_5<int> i;
120 matrix_5_5<float> f;
121 f = (matrix_5_5<float>)i;
122 }
123
124 // CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToFloatStaticCastv()
CastIntMatrixToFloatStaticCast()125 void CastIntMatrixToFloatStaticCast() {
126 // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
127 // CHECK-NEXT: [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
128 // CHECK-NEXT: [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
129 // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
130 // CHECK-NEXT: ret void
131
132 matrix_5_5<int> i;
133 matrix_5_5<float> f;
134 f = static_cast<matrix_5_5<float>>(i);
135 }
136
137 // CHECK-LABEL: define{{.*}} void @_Z34CastUnsignedIntMatrixToFloatCStylev()
CastUnsignedIntMatrixToFloatCStyle()138 void CastUnsignedIntMatrixToFloatCStyle() {
139 // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
140 // CHECK-NEXT: [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
141 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
142 // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
143 // CHECK-NEXT: ret void
144
145 matrix_5_5<unsigned short int> u;
146 matrix_5_5<float> f;
147 f = (matrix_5_5<float>)u;
148 }
149
150 // CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedIntMatrixToFloatStaticCastv()
CastUnsignedIntMatrixToFloatStaticCast()151 void CastUnsignedIntMatrixToFloatStaticCast() {
152 // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
153 // CHECK-NEXT: [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
154 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
155 // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
156 // CHECK-NEXT: ret void
157
158 matrix_5_5<unsigned short int> u;
159 matrix_5_5<float> f;
160 f = static_cast<matrix_5_5<float>>(u);
161 }
162
163 // CHECK-LABEL: define{{.*}} void @_Z27CastDoubleMatrixToIntCStylev()
CastDoubleMatrixToIntCStyle()164 void CastDoubleMatrixToIntCStyle() {
165 // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
166 // CHECK-NEXT: [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
167 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
168 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
169 // CHECK-NEXT: ret void
170
171 matrix_5_5<double> d;
172 matrix_5_5<int> i;
173 i = (matrix_5_5<int>)d;
174 }
175
176 // CHECK-LABEL: define{{.*}} void @_Z31CastDoubleMatrixToIntStaticCastv()
CastDoubleMatrixToIntStaticCast()177 void CastDoubleMatrixToIntStaticCast() {
178 // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
179 // CHECK-NEXT: [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
180 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
181 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
182 // CHECK-NEXT: ret void
183
184 matrix_5_5<double> d;
185 matrix_5_5<int> i;
186 i = static_cast<matrix_5_5<int>>(d);
187 }
188
189 // CHECK-LABEL: define{{.*}} void @_Z39CastFloatMatrixToUnsignedShortIntCStylev()
CastFloatMatrixToUnsignedShortIntCStyle()190 void CastFloatMatrixToUnsignedShortIntCStyle() {
191 // CHECK: [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
192 // CHECK-NEXT: [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
193 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
194 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
195 // CHECK-NEXT: ret void
196
197 matrix_5_5<float> f;
198 matrix_5_5<unsigned short int> i;
199 i = (matrix_5_5<unsigned short int>)f;
200 }
201
202 // CHECK-LABEL: define{{.*}} void @_Z43CastFloatMatrixToUnsignedShortIntStaticCastv()
CastFloatMatrixToUnsignedShortIntStaticCast()203 void CastFloatMatrixToUnsignedShortIntStaticCast() {
204 // CHECK: [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
205 // CHECK-NEXT: [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
206 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
207 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
208 // CHECK-NEXT: ret void
209
210 matrix_5_5<float> f;
211 matrix_5_5<unsigned short int> i;
212 i = static_cast<matrix_5_5<unsigned short int>>(f);
213 }
214
215 // CHECK-LABEL: define{{.*}} void @_Z29CastDoubleMatrixToFloatCStylev()
CastDoubleMatrixToFloatCStyle()216 void CastDoubleMatrixToFloatCStyle() {
217 // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
218 // CHECK-NEXT: [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
219 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
220 // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
221 // CHECK-NEXT: ret void
222
223 matrix_5_5<double> d;
224 matrix_5_5<float> f;
225 f = (matrix_5_5<float>)d;
226 }
227
228 // CHECK-LABEL: define{{.*}} void @_Z33CastDoubleMatrixToFloatStaticCastv()
CastDoubleMatrixToFloatStaticCast()229 void CastDoubleMatrixToFloatStaticCast() {
230 // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
231 // CHECK-NEXT: [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
232 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
233 // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
234 // CHECK-NEXT: ret void
235
236 matrix_5_5<double> d;
237 matrix_5_5<float> f;
238 f = static_cast<matrix_5_5<float>>(d);
239 }
240
241 // CHECK-LABEL: define{{.*}} void @_Z39CastUnsignedShortIntToUnsignedIntCStylev()
CastUnsignedShortIntToUnsignedIntCStyle()242 void CastUnsignedShortIntToUnsignedIntCStyle() {
243 // CHECK: [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
244 // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
245 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
246 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
247 // CHECK-NEXT: ret void
248
249 matrix_5_5<unsigned short int> s;
250 matrix_5_5<unsigned int> i;
251 i = (matrix_5_5<unsigned int>)s;
252 }
253
254 // CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedShortIntToUnsignedIntStaticCastv()
CastUnsignedShortIntToUnsignedIntStaticCast()255 void CastUnsignedShortIntToUnsignedIntStaticCast() {
256 // CHECK: [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
257 // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
258 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
259 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
260 // CHECK-NEXT: ret void
261
262 matrix_5_5<unsigned short int> s;
263 matrix_5_5<unsigned int> i;
264 i = static_cast<matrix_5_5<unsigned int>>(s);
265 }
266
267 // CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedLongIntToUnsignedShortIntCStylev()
CastUnsignedLongIntToUnsignedShortIntCStyle()268 void CastUnsignedLongIntToUnsignedShortIntCStyle() {
269 // CHECK: [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
270 // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
271 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
272 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
273 // CHECK-NEXT: ret void
274
275 matrix_5_5<unsigned long int> l;
276 matrix_5_5<unsigned short int> s;
277 s = (matrix_5_5<unsigned short int>)l;
278 }
279
280 // CHECK-LABEL: define{{.*}} void @_Z47CastUnsignedLongIntToUnsignedShortIntStaticCastv()
CastUnsignedLongIntToUnsignedShortIntStaticCast()281 void CastUnsignedLongIntToUnsignedShortIntStaticCast() {
282 // CHECK: [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
283 // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
284 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
285 // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
286 // CHECK-NEXT: ret void
287
288 matrix_5_5<unsigned long int> l;
289 matrix_5_5<unsigned short int> s;
290 s = static_cast<matrix_5_5<unsigned short int>>(l);
291 }
292
293 // CHECK-LABEL: define{{.*}} void @_Z31CastUnsignedShortIntToIntCStylev()
CastUnsignedShortIntToIntCStyle()294 void CastUnsignedShortIntToIntCStyle() {
295 // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
296 // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
297 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
298 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
299 // CHECK-NEXT: ret void
300
301 matrix_5_5<unsigned short int> u;
302 matrix_5_5<int> i;
303 i = (matrix_5_5<int>)u;
304 }
305
306 // CHECK-LABEL: define{{.*}} void @_Z35CastUnsignedShortIntToIntStaticCastv()
CastUnsignedShortIntToIntStaticCast()307 void CastUnsignedShortIntToIntStaticCast() {
308 // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
309 // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
310 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
311 // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
312 // CHECK-NEXT: ret void
313
314 matrix_5_5<unsigned short int> u;
315 matrix_5_5<int> i;
316 i = static_cast<matrix_5_5<int>>(u);
317 }
318
319 // CHECK-LABEL: define{{.*}} void @_Z30CastIntToUnsignedLongIntCStylev()
CastIntToUnsignedLongIntCStyle()320 void CastIntToUnsignedLongIntCStyle() {
321 // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
322 // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
323 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
324 // CHECK-NEXT: store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
325 // CHECK-NEXT: ret void
326
327 matrix_5_5<int> i;
328 matrix_5_5<unsigned long int> u;
329 u = (matrix_5_5<unsigned long int>)i;
330 }
331
332 // CHECK-LABEL: define{{.*}} void @_Z34CastIntToUnsignedLongIntStaticCastv()
CastIntToUnsignedLongIntStaticCast()333 void CastIntToUnsignedLongIntStaticCast() {
334 // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
335 // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
336 // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
337 // CHECK-NEXT: store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
338 // CHECK-NEXT: ret void
339
340 matrix_5_5<int> i;
341 matrix_5_5<unsigned long int> u;
342 u = static_cast<matrix_5_5<unsigned long int>>(i);
343 }
344
345 class Foo {
346 int x[10];
347
348 public:
349 Foo(matrix_5_5<int> x);
350 };
351
class_constructor_matrix_ty(matrix_5_5<int> m)352 Foo class_constructor_matrix_ty(matrix_5_5<int> m) {
353 // CHECK-LABEL: define void @_Z27class_constructor_matrix_tyu11matrix_typeILm5ELm5EiE(%class.Foo* noalias sret(%class.Foo) align 4 %agg.result, <25 x i32> noundef %m)
354 // CHECK: [[M:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
355 // CHECK-NEXT: call void @_ZN3FooC1Eu11matrix_typeILm5ELm5EiE(%class.Foo* noundef nonnull align 4 dereferenceable(40) %agg.result, <25 x i32> noundef [[M]])
356 // CHECK-NEXT: ret void
357
358 return Foo(m);
359 }
360
361 struct Bar {
362 float x[10];
363 Bar(matrix_4_4<float> x);
364 };
365
struct_constructor_matrix_ty(matrix_4_4<float> m)366 Bar struct_constructor_matrix_ty(matrix_4_4<float> m) {
367 // CHECK-LABEL: define void @_Z28struct_constructor_matrix_tyu11matrix_typeILm4ELm4EfE(%struct.Bar* noalias sret(%struct.Bar) align 4 %agg.result, <16 x float> noundef %m)
368 // CHECK: [[M:%.*]] = load <16 x float>, <16 x float>* {{.*}}, align 4
369 // CHECK-NEXT: call void @_ZN3BarC1Eu11matrix_typeILm4ELm4EfE(%struct.Bar* noundef nonnull align 4 dereferenceable(40) %agg.result, <16 x float> noundef [[M]])
370 // CHECK-NEXT: ret void
371
372 return Bar(m);
373 }
374