1
1
// RUN: %clang_cc1 -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
2
2
3
+ // Also check we do not crash when running some middle-end passes. Most
4
+ // importantly this includes the IR verifier, to ensure we emit valid IR.
5
+ // RUN: %clang_cc1 -fenable-matrix -emit-llvm -triple x86_64-apple-darwin %s -o %t
6
+
3
7
// Tests for the matrix type builtins.
4
8
5
9
typedef double dx5x5_t __attribute__((matrix_type (5 , 5 )));
@@ -100,15 +104,15 @@ void transpose_global() {
100
104
void column_major_load_with_const_stride_double (double * Ptr ) {
101
105
// CHECK-LABEL: define void @column_major_load_with_const_stride_double(double* %Ptr)
102
106
// CHECK: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
103
- // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64.p0f64 (double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
107
+ // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64(double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
104
108
105
109
dx5x5_t m_a1 = __builtin_matrix_column_major_load (Ptr , 5 , 5 , 5 );
106
110
}
107
111
108
112
void column_major_load_with_const_stride2_double (double * Ptr ) {
109
113
// CHECK-LABEL: define void @column_major_load_with_const_stride2_double(double* %Ptr)
110
114
// CHECK: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
111
- // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64.p0f64 (double* align 8 [[PTR]], i64 15, i1 false, i32 5, i32 5)
115
+ // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64(double* align 8 [[PTR]], i64 15, i1 false, i32 5, i32 5)
112
116
113
117
dx5x5_t m_a2 = __builtin_matrix_column_major_load (Ptr , 5 , 5 , 2 * 3 + 9 );
114
118
}
@@ -117,7 +121,7 @@ void column_major_load_with_variable_stride_ull_float(float *Ptr, unsigned long
117
121
// CHECK-LABEL: define void @column_major_load_with_variable_stride_ull_float(float* %Ptr, i64 %S)
118
122
// CHECK: [[S:%.*]] = load i64, i64* %S.addr, align 8
119
123
// CHECK-NEXT: [[PTR:%.*]] = load float*, float** %Ptr.addr, align 8
120
- // CHECK-NEXT: call <6 x float> @llvm.matrix.column.major.load.v6f32.p0f32 (float* align 4 [[PTR]], i64 [[S]], i1 false, i32 2, i32 3)
124
+ // CHECK-NEXT: call <6 x float> @llvm.matrix.column.major.load.v6f32(float* align 4 [[PTR]], i64 [[S]], i1 false, i32 2, i32 3)
121
125
122
126
fx2x3_t m_b = __builtin_matrix_column_major_load (Ptr , 2 , 3 , S );
123
127
}
@@ -128,7 +132,7 @@ void column_major_load_with_stride_math_int(int *Ptr, int S) {
128
132
// CHECK-NEXT: [[STRIDE:%.*]] = add nsw i32 [[S]], 32
129
133
// CHECK-NEXT: [[STRIDE_EXT:%.*]] = sext i32 [[STRIDE]] to i64
130
134
// CHECK-NEXT: [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
131
- // CHECK-NEXT: call <80 x i32> @llvm.matrix.column.major.load.v80i32.p0i32 (i32* align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 4, i32 20)
135
+ // CHECK-NEXT: call <80 x i32> @llvm.matrix.column.major.load.v80i32(i32* align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 4, i32 20)
132
136
133
137
ix4x20_t m_c = __builtin_matrix_column_major_load (Ptr , 4 , 20 , S + 32 );
134
138
}
@@ -140,15 +144,15 @@ void column_major_load_with_stride_math_s_int(int *Ptr, short S) {
140
144
// CHECK-NEXT: [[STRIDE:%.*]] = add nsw i32 [[S_EXT]], 32
141
145
// CHECK-NEXT: [[STRIDE_EXT:%.*]] = sext i32 [[STRIDE]] to i64
142
146
// CHECK-NEXT: [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
143
- // CHECK-NEXT: %matrix = call <80 x i32> @llvm.matrix.column.major.load.v80i32.p0i32 (i32* align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 4, i32 20)
147
+ // CHECK-NEXT: %matrix = call <80 x i32> @llvm.matrix.column.major.load.v80i32(i32* align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 4, i32 20)
144
148
145
149
ix4x20_t m_c = __builtin_matrix_column_major_load (Ptr , 4 , 20 , S + 32 );
146
150
}
147
151
148
152
void column_major_load_array1 (double Ptr [25 ]) {
149
153
// CHECK-LABEL: define void @column_major_load_array1(double* %Ptr)
150
154
// CHECK: [[ADDR:%.*]] = load double*, double** %Ptr.addr, align 8
151
- // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64.p0f64 (double* align 8 [[ADDR]], i64 5, i1 false, i32 5, i32 5)
155
+ // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64(double* align 8 [[ADDR]], i64 5, i1 false, i32 5, i32 5)
152
156
153
157
dx5x5_t m = __builtin_matrix_column_major_load (Ptr , 5 , 5 , 5 );
154
158
}
@@ -158,7 +162,7 @@ void column_major_load_array2() {
158
162
// CHECK-NEXT: entry:
159
163
// CHECK-NEXT: [[PTR:%.*]] = alloca [25 x double], align 16
160
164
// CHECK: [[ARRAY_DEC:%.*]] = getelementptr inbounds [25 x double], [25 x double]* [[PTR]], i64 0, i64 0
161
- // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64.p0f64 (double* align 16 [[ARRAY_DEC]], i64 5, i1 false, i32 5, i32 5)
165
+ // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64(double* align 16 [[ARRAY_DEC]], i64 5, i1 false, i32 5, i32 5)
162
166
163
167
double Ptr [25 ];
164
168
dx5x5_t m = __builtin_matrix_column_major_load (Ptr , 5 , 5 , 5 );
@@ -167,15 +171,15 @@ void column_major_load_array2() {
167
171
void column_major_load_const (const double * Ptr ) {
168
172
// CHECK-LABEL: define void @column_major_load_const(double* %Ptr)
169
173
// CHECK: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
170
- // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64.p0f64 (double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
174
+ // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64(double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
171
175
172
176
dx5x5_t m_a1 = __builtin_matrix_column_major_load (Ptr , 5 , 5 , 5 );
173
177
}
174
178
175
179
void column_major_load_volatile (volatile double * Ptr ) {
176
180
// CHECK-LABEL: define void @column_major_load_volatile(double* %Ptr)
177
181
// CHECK: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
178
- // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64.p0f64 (double* align 8 [[PTR]], i64 5, i1 true, i32 5, i32 5)
182
+ // CHECK-NEXT: call <25 x double> @llvm.matrix.column.major.load.v25f64(double* align 8 [[PTR]], i64 5, i1 true, i32 5, i32 5)
179
183
180
184
dx5x5_t m_a1 = __builtin_matrix_column_major_load (Ptr , 5 , 5 , 5 );
181
185
}
@@ -184,7 +188,7 @@ void column_major_store_with_const_stride_double(double *Ptr) {
184
188
// CHECK-LABEL: define void @column_major_store_with_const_stride_double(double* %Ptr)
185
189
// CHECK: [[M:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
186
190
// CHECK-NEXT: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
187
- // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64.p0f64 (<25 x double> [[M]], double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
191
+ // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64(<25 x double> [[M]], double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
188
192
189
193
dx5x5_t m ;
190
194
__builtin_matrix_column_major_store (m , Ptr , 5 );
@@ -194,7 +198,7 @@ void column_major_store_with_const_stride2_double(double *Ptr) {
194
198
// CHECK-LABEL: define void @column_major_store_with_const_stride2_double(double* %Ptr)
195
199
// CHECK: [[M:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
196
200
// CHECK-NEXT: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
197
- // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64.p0f64 (<25 x double> [[M]], double* align 8 [[PTR]], i64 15, i1 false, i32 5, i32 5)
201
+ // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64(<25 x double> [[M]], double* align 8 [[PTR]], i64 15, i1 false, i32 5, i32 5)
198
202
//
199
203
dx5x5_t m ;
200
204
__builtin_matrix_column_major_store (m , Ptr , 2 * 3 + 9 );
@@ -207,7 +211,7 @@ void column_major_store_with_stride_math_int(int *Ptr, int S) {
207
211
// CHECK-NEXT: [[S:%.*]] = load i32, i32* %S.addr, align 4
208
212
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[S]], 32
209
213
// CHECK-NEXT: [[IDX:%.*]] = sext i32 [[ADD]] to i64
210
- // CHECK-NEXT: call void @llvm.matrix.column.major.store.v80i32.p0i32 (<80 x i32> [[M]], i32* align 4 [[PTR]], i64 [[IDX]], i1 false, i32 4, i32 20)
214
+ // CHECK-NEXT: call void @llvm.matrix.column.major.store.v80i32(<80 x i32> [[M]], i32* align 4 [[PTR]], i64 [[IDX]], i1 false, i32 4, i32 20)
211
215
212
216
ix4x20_t m ;
213
217
__builtin_matrix_column_major_store (m , Ptr , S + 32 );
@@ -221,7 +225,7 @@ void column_major_store_with_stride_math_s_int(int *Ptr, short S) {
221
225
// CHECK-NEXT: [[EXT:%.*]] = sext i16 [[S]] to i32
222
226
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[EXT]], 2
223
227
// CHECK-NEXT: [[IDX:%.*]] = sext i32 [[ADD]] to i64
224
- // CHECK-NEXT: call void @llvm.matrix.column.major.store.v80i32.p0i32 (<80 x i32> [[M]], i32* align 4 [[PTR]], i64 [[IDX]], i1 false, i32 4, i32 20)
228
+ // CHECK-NEXT: call void @llvm.matrix.column.major.store.v80i32(<80 x i32> [[M]], i32* align 4 [[PTR]], i64 [[IDX]], i1 false, i32 4, i32 20)
225
229
226
230
ix4x20_t m ;
227
231
__builtin_matrix_column_major_store (m , Ptr , S + 2 );
@@ -231,7 +235,7 @@ void column_major_store_array1(double Ptr[25]) {
231
235
// CHECK-LABEL: define void @column_major_store_array1(double* %Ptr)
232
236
// CHECK: [[M:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
233
237
// CHECK-NEXT: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
234
- // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64.p0f64 (<25 x double> [[M]], double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
238
+ // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64(<25 x double> [[M]], double* align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)
235
239
236
240
dx5x5_t m ;
237
241
__builtin_matrix_column_major_store (m , Ptr , 5 );
@@ -241,7 +245,7 @@ void column_major_store_array2() {
241
245
// CHECK-LABEL: define void @column_major_store_array2()
242
246
// CHECK: [[M:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
243
247
// CHECK-NEXT: [[PTR:%.*]] = getelementptr inbounds [25 x double], [25 x double]* %Ptr, i64 0, i64 0
244
- // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64.p0f64 (<25 x double> [[M]], double* align 16 [[PTR]], i64 5, i1 false, i32 5, i32 5)
248
+ // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64(<25 x double> [[M]], double* align 16 [[PTR]], i64 5, i1 false, i32 5, i32 5)
245
249
246
250
double Ptr [25 ];
247
251
dx5x5_t m ;
@@ -252,7 +256,7 @@ void column_major_store_volatile(volatile double *Ptr) {
252
256
// CHECK-LABEL: define void @column_major_store_volatile(double* %Ptr) #0 {
253
257
// CHECK: [[M:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
254
258
// CHECK-NEXT: [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
255
- // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64.p0f64 (<25 x double> [[M]], double* align 8 [[PTR]], i64 5, i1 true, i32 5, i32 5)
259
+ // CHECK-NEXT: call void @llvm.matrix.column.major.store.v25f64(<25 x double> [[M]], double* align 8 [[PTR]], i64 5, i1 true, i32 5, i32 5)
256
260
257
261
dx5x5_t m ;
258
262
__builtin_matrix_column_major_store (m , Ptr , 5 );
0 commit comments