brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.6 KiB · f6e67d5 Raw
322 lines · c
1// RUN: %clang_cc1 -no-enable-noundef-analysis -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck --check-prefixes=COMMON,CHECK64 %s2// RUN: %clang_cc1 -no-enable-noundef-analysis -fenable-matrix -triple i386-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck --check-prefixes=COMMON,CHECK32 %s3 4// Also check we do not crash when running some middle-end passes. Most5// importantly this includes the IR verifier, to ensure we emit valid IR.6// RUN: %clang_cc1 -fenable-matrix -emit-llvm -triple x86_64-apple-darwin %s -o %t7 8// Tests for the matrix type builtins.9 10typedef double dx5x5_t __attribute__((matrix_type(5, 5)));11typedef float fx2x3_t __attribute__((matrix_type(2, 3)));12typedef float fx3x2_t __attribute__((matrix_type(3, 2)));13typedef int ix20x4_t __attribute__((matrix_type(20, 4)));14typedef int ix4x20_t __attribute__((matrix_type(4, 20)));15typedef unsigned ux1x6_t __attribute__((matrix_type(1, 6)));16typedef unsigned ux6x1_t __attribute__((matrix_type(6, 1)));17 18void transpose_double_5x5(dx5x5_t *a) {19  // COMMON-LABEL: define{{.*}} void @transpose_double_5x5(20  // CHECK32:       [[A:%.*]] = load <25 x double>, ptr {{.*}}, align 421  // CHECK64:       [[A:%.*]] = load <25 x double>, ptr {{.*}}, align 822  // COMMON-NEXT:   [[TRANS:%.*]] = call <25 x double> @llvm.matrix.transpose.v25f64(<25 x double> [[A]], i32 5, i32 5)23  // CHECK32-NEXT:  store <25 x double> [[TRANS]], ptr %a_t, align 424  // CHECK64-NEXT:  store <25 x double> [[TRANS]], ptr %a_t, align 825 26  dx5x5_t a_t = __builtin_matrix_transpose(*a);27}28 29void transpose_float_3x2(fx3x2_t *a) {30  // COMMON-LABEL: define{{.*}} void @transpose_float_3x2(31  // COMMON:        [[A:%.*]] = load <6 x float>, ptr {{.*}}, align 432  // COMMON-NEXT:   [[TRANS:%.*]] = call <6 x float> @llvm.matrix.transpose.v6f32(<6 x float> [[A]], i32 3, i32 2)33  // COMMON-NEXT:   store <6 x float> [[TRANS]], ptr %a_t, align 434 35  fx2x3_t a_t = __builtin_matrix_transpose(*a);36}37 38void transpose_int_20x4(ix20x4_t *a) {39  // COMMON-LABEL: define{{.*}} void @transpose_int_20x4(40  // COMMON:         [[A:%.*]] = load <80 x i32>, ptr {{.*}}, align 441  // COMMON-NEXT:    [[TRANS:%.*]] = call <80 x i32> @llvm.matrix.transpose.v80i32(<80 x i32> [[A]], i32 20, i32 4)42  // COMMON-NEXT:    store <80 x i32> [[TRANS]], ptr %a_t, align 443 44  ix4x20_t a_t = __builtin_matrix_transpose(*a);45}46 47struct Foo {48  ux1x6_t in;49  ux6x1_t out;50};51 52void transpose_struct_member(struct Foo *F) {53  // COMMON-LABEL: define{{.*}} void @transpose_struct_member(54  // COMMON:         [[M:%.*]] = load <6 x i32>, ptr {{.*}}, align 455  // COMMON-NEXT:    [[M_T:%.*]] = call <6 x i32> @llvm.matrix.transpose.v6i32(<6 x i32> [[M]], i32 1, i32 6)56  // CHECK32-NEXT:   [[F_ADDR:%.*]] = load ptr, ptr %F.addr, align 457  // CHECK64-NEXT:   [[F_ADDR:%.*]] = load ptr, ptr %F.addr, align 858  // COMMON-NEXT:    [[OUT_PTR:%.*]] = getelementptr inbounds nuw %struct.Foo, ptr [[F_ADDR]], i32 0, i32 159  // COMMON-NEXT:    store <6 x i32> [[M_T]], ptr [[OUT_PTR]], align 460 61  F->out = __builtin_matrix_transpose(F->in);62}63 64void transpose_transpose_struct_member(struct Foo *F) {65  // COMMON-LABEL: define{{.*}} void @transpose_transpose_struct_member(66  // COMMON:         [[M:%.*]] = load <6 x i32>, ptr {{.*}}, align 467  // COMMON-NEXT:    [[M_T:%.*]] = call <6 x i32> @llvm.matrix.transpose.v6i32(<6 x i32> [[M]], i32 1, i32 6)68  // COMMON-NEXT:    [[M_T2:%.*]] = call <6 x i32> @llvm.matrix.transpose.v6i32(<6 x i32> [[M_T]], i32 6, i32 1)69  // CHECK32-NEXT:   [[F_ADDR:%.*]] = load ptr, ptr %F.addr, align 470  // CHECK64-NEXT:   [[F_ADDR:%.*]] = load ptr, ptr %F.addr, align 871  // COMMON-NEXT:    [[IN_PTR:%.*]] = getelementptr inbounds nuw %struct.Foo, ptr [[F_ADDR]], i32 0, i32 072  // COMMON-NEXT:    store <6 x i32> [[M_T2]], ptr [[IN_PTR]], align 473 74  F->in = __builtin_matrix_transpose(__builtin_matrix_transpose(F->in));75}76 77dx5x5_t get_matrix(void);78 79void transpose_rvalue(void) {80  // COMMON-LABEL: define{{.*}} void @transpose_rvalue()81  // COMMON-NEXT:  entry:82  // CHECK32-NEXT:   [[M_T_ADDR:%.*]] = alloca [25 x double], align 483  // CHECK64-NEXT:   [[M_T_ADDR:%.*]] = alloca [25 x double], align 884  // COMMON-NEXT:    [[CALL:%.*]] = call <25 x double> @get_matrix()85  // COMMON-NEXT:    [[M_T:%.*]] = call <25 x double> @llvm.matrix.transpose.v25f64(<25 x double> [[CALL]], i32 5, i32 5)86  // CHECK32-NEXT:   store <25 x double> [[M_T]], ptr [[M_T_ADDR]], align 487  // CHECK64-NEXT:   store <25 x double> [[M_T]], ptr [[M_T_ADDR]], align 888 89  dx5x5_t m_t = __builtin_matrix_transpose(get_matrix());90}91 92const dx5x5_t global_matrix;93 94void transpose_global(void) {95  // COMMON-LABEL: define{{.*}} void @transpose_global()96  // COMMON-NEXT:  entry:97  // CHECK32-NEXT:    [[M_T_ADDR:%.*]] = alloca [25 x double], align 498  // CHECK32-NEXT:    [[GLOBAL_MATRIX:%.*]] = load <25 x double>, ptr @global_matrix, align 499  // CHECK64-NEXT:    [[M_T_ADDR:%.*]] = alloca [25 x double], align 8100  // CHECK64-NEXT:    [[GLOBAL_MATRIX:%.*]] = load <25 x double>, ptr @global_matrix, align 8101  // COMMON-NEXT:    [[M_T:%.*]] = call <25 x double> @llvm.matrix.transpose.v25f64(<25 x double> [[GLOBAL_MATRIX]], i32 5, i32 5)102  // CHECK32-NEXT:    store <25 x double> [[M_T]], ptr [[M_T_ADDR]], align 4103  // CHECK64-NEXT:    store <25 x double> [[M_T]], ptr [[M_T_ADDR]], align 8104 105  dx5x5_t m_t = __builtin_matrix_transpose(global_matrix);106}107 108void column_major_load_with_const_stride_double(double *Ptr) {109  // COMMON-LABEL: define{{.*}} void @column_major_load_with_const_stride_double(ptr %Ptr)110  // CHECK32:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4111  // CHECK32-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i32(ptr align 4 [[PTR]], i32 5, i1 false, i32 5, i32 5)112  // CHECK64:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8113  // CHECK64-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i64(ptr align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)114 115  dx5x5_t m_a1 = __builtin_matrix_column_major_load(Ptr, 5, 5, 5);116}117 118void column_major_load_with_const_stride2_double(double *Ptr) {119  // COMMON-LABEL: define{{.*}} void @column_major_load_with_const_stride2_double(ptr %Ptr)120  // CHECK32:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4121  // CHECK32-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i32(ptr align 4 [[PTR]], i32 15, i1 false, i32 5, i32 5)122  // CHECK64:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8123  // CHECK64-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i64(ptr align 8 [[PTR]], i64 15, i1 false, i32 5, i32 5)124 125  dx5x5_t m_a2 = __builtin_matrix_column_major_load(Ptr, 5, 5, 2 * 3 + 9);126}127 128void column_major_load_with_variable_stride_ull_float(float *Ptr, unsigned long long S) {129  // COMMON-LABEL: define{{.*}} void @column_major_load_with_variable_stride_ull_float(ptr %Ptr, i64 %S)130  // CHECK32:         [[S:%.*]] = load i64, ptr %S.addr, align 8131  // CHECK32-NEXT:    [[STRIDE_TRUNC:%.*]] = trunc i64 [[S]] to i32132  // CHECK32-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4133  // CHECK32-NEXT:    call <6 x float> @llvm.matrix.column.major.load.v6f32.i32(ptr align 4 [[PTR]], i32 [[STRIDE_TRUNC]], i1 false, i32 2, i32 3)134 135  // CHECK64:         [[S:%.*]] = load i64, ptr %S.addr, align 8136  // CHECK64-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8137  // CHECK64-NEXT:    call <6 x float> @llvm.matrix.column.major.load.v6f32.i64(ptr align 4 [[PTR]], i64 [[S]], i1 false, i32 2, i32 3)138 139  fx2x3_t m_b = __builtin_matrix_column_major_load(Ptr, 2, 3, S);140}141 142void column_major_load_with_stride_math_int(int *Ptr, int S) {143  // COMMON-LABEL: define{{.*}} void @column_major_load_with_stride_math_int(ptr %Ptr, i32 %S)144  // COMMON:         [[S:%.*]] = load i32, ptr %S.addr, align 4145  // COMMON-NEXT:    [[STRIDE:%.*]] = add nsw i32 [[S]], 32146  // CHECK32-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4147  // CHECK32-NEXT:   call <80 x i32> @llvm.matrix.column.major.load.v80i32.i32(ptr align 4 [[PTR]], i32 [[STRIDE]], i1 false, i32 4, i32 20)148  //149  // CHECK64-NEXT:   [[STRIDE_EXT:%.*]] = sext i32 [[STRIDE]] to i64150  // CHECK64-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8151  // CHECK64-NEXT:   call <80 x i32> @llvm.matrix.column.major.load.v80i32.i64(ptr align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 4, i32 20)152 153  ix4x20_t m_c = __builtin_matrix_column_major_load(Ptr, 4, 20, S + 32);154}155 156void column_major_load_with_stride_math_s_int(int *Ptr, short S) {157  // COMMON-LABEL:  define{{.*}} void @column_major_load_with_stride_math_s_int(ptr %Ptr, i16 signext %S)158  // COMMON:         [[S:%.*]] = load i16, ptr %S.addr, align 2159  // COMMON-NEXT:    [[S_EXT:%.*]] = sext i16 [[S]] to i32160  // COMMON-NEXT:    [[STRIDE:%.*]] = add nsw i32 [[S_EXT]], 32161  // CHECK32-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4162  // CHECK32-NEXT:   %matrix = call <80 x i32> @llvm.matrix.column.major.load.v80i32.i32(ptr align 4 [[PTR]], i32 [[STRIDE]], i1 false, i32 4, i32 20)163  //164  // CHECK64-NEXT:   [[STRIDE_EXT:%.*]] = sext i32 [[STRIDE]] to i64165  // CHECK64-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8166  // CHECK64-NEXT:   %matrix = call <80 x i32> @llvm.matrix.column.major.load.v80i32.i64(ptr align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 4, i32 20)167 168  ix4x20_t m_c = __builtin_matrix_column_major_load(Ptr, 4, 20, S + 32);169}170 171void column_major_load_array1(double Ptr[25]) {172  // COMMON-LABEL: define{{.*}} void @column_major_load_array1(ptr %Ptr)173  // CHECK32:         [[ADDR:%.*]] = load ptr, ptr %Ptr.addr, align 4174  // CHECK32-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i32(ptr align 4 [[ADDR]], i32 5, i1 false, i32 5, i32 5)175 176  // CHECK64:         [[ADDR:%.*]] = load ptr, ptr %Ptr.addr, align 8177  // CHECK64-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i64(ptr align 8 [[ADDR]], i64 5, i1 false, i32 5, i32 5)178 179  dx5x5_t m = __builtin_matrix_column_major_load(Ptr, 5, 5, 5);180}181 182void column_major_load_array2(void) {183  // COMMON-LABEL: define{{.*}} void @column_major_load_array2() #0 {184  // COMMON-NEXT:  entry:185  // CHECK32-NEXT:    [[PTR:%.*]] = alloca [25 x double], align 8186  // CHECK32:         [[ARRAY_DEC:%.*]] = getelementptr inbounds [25 x double], ptr [[PTR]], i32 0, i32 0187  // CHECK32-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i32(ptr align 8 [[ARRAY_DEC]], i32 5, i1 false, i32 5, i32 5)188 189  // CHECK64-NEXT:    [[PTR:%.*]] = alloca [25 x double], align 16190  // CHECK64:         [[ARRAY_DEC:%.*]] = getelementptr inbounds [25 x double], ptr [[PTR]], i64 0, i64 0191  // CHECK64-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i64(ptr align 16 [[ARRAY_DEC]], i64 5, i1 false, i32 5, i32 5)192 193  double Ptr[25];194  dx5x5_t m = __builtin_matrix_column_major_load(Ptr, 5, 5, 5);195}196 197void column_major_load_const(const double *Ptr) {198  // COMMON-LABEL: define{{.*}} void @column_major_load_const(ptr %Ptr)199  // CHECK32:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4200  // CHECK32-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i32(ptr align 4 [[PTR]], i32 5, i1 false, i32 5, i32 5)201  //202  // CHECK64:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8203  // CHECK64-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i64(ptr align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)204 205  dx5x5_t m_a1 = __builtin_matrix_column_major_load(Ptr, 5, 5, 5);206}207 208void column_major_load_volatile(volatile double *Ptr) {209  // COMMON-LABEL: define{{.*}} void @column_major_load_volatile(ptr %Ptr)210  // CHECK32:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4211  // CHECK32-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i32(ptr align 4 [[PTR]], i32 5, i1 true, i32 5, i32 5)212  //213  // CHECK64:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8214  // CHECK64-NEXT:    call <25 x double> @llvm.matrix.column.major.load.v25f64.i64(ptr align 8 [[PTR]], i64 5, i1 true, i32 5, i32 5)215 216  dx5x5_t m_a1 = __builtin_matrix_column_major_load(Ptr, 5, 5, 5);217}218 219void column_major_store_with_const_stride_double(double *Ptr) {220  // COMMON-LABEL: define{{.*}} void @column_major_store_with_const_stride_double(ptr %Ptr)221  // CHECK32:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 4222  // CHECK32-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4223  // CHECK32-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i32(<25 x double> [[M]], ptr align 4 [[PTR]], i32 5, i1 false, i32 5, i32 5)224  //225  // CHECK64:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 8226  // CHECK64-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8227  // CHECK64-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i64(<25 x double> [[M]], ptr align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)228 229  dx5x5_t m;230  __builtin_matrix_column_major_store(m, Ptr, 5);231}232 233void column_major_store_with_const_stride2_double(double *Ptr) {234  // COMMON-LABEL: define{{.*}} void @column_major_store_with_const_stride2_double(ptr %Ptr)235  // CHECK32:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 4236  // CHECK32-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4237  // CHECK32-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i32(<25 x double> [[M]], ptr align 4 [[PTR]], i32 15, i1 false, i32 5, i32 5)238  //239  // CHECK64:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 8240  // CHECK64-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8241  // CHECK64-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i64(<25 x double> [[M]], ptr align 8 [[PTR]], i64 15, i1 false, i32 5, i32 5)242  //243  dx5x5_t m;244  __builtin_matrix_column_major_store(m, Ptr, 2 * 3 + 9);245}246 247void column_major_store_with_stride_math_int(int *Ptr, int S) {248  // COMMON-LABEL: define{{.*}} void @column_major_store_with_stride_math_int(ptr %Ptr, i32 %S)249  // COMMON:         [[M:%.*]] = load <80 x i32>, ptr {{.*}}, align 4250  // CHECK32-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4251  // CHECK64-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8252  // COMMON-NEXT:    [[S:%.*]] = load i32, ptr %S.addr, align 4253  // COMMON-NEXT:    [[ADD:%.*]] = add nsw i32 [[S]], 32254  // CHECK32-NEXT:   call void @llvm.matrix.column.major.store.v80i32.i32(<80 x i32> [[M]], ptr align 4 [[PTR]], i32 [[ADD]], i1 false, i32 4, i32 20)255  //256  // CHECK64-NEXT:   [[IDX:%.*]] = sext i32 [[ADD]] to i64257  // CHECK64-NEXT:   call void @llvm.matrix.column.major.store.v80i32.i64(<80 x i32> [[M]], ptr align 4 [[PTR]], i64 [[IDX]], i1 false, i32 4, i32 20)258 259  ix4x20_t m;260  __builtin_matrix_column_major_store(m, Ptr, S + 32);261}262 263void column_major_store_with_stride_math_s_int(int *Ptr, short S) {264  // COMMON-LABEL: define{{.*}} void @column_major_store_with_stride_math_s_int(ptr %Ptr, i16 signext %S)265  // COMMON:         [[M:%.*]] = load <80 x i32>, ptr {{.*}}, align 4266  // CHECK32-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4267  // CHECK64-NEXT:   [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8268  // COMMON-NEXT:    [[S:%.*]] = load i16, ptr %S.addr, align 2269  // COMMON-NEXT:    [[EXT:%.*]] = sext i16 [[S]] to i32270  // COMMON-NEXT:    [[ADD:%.*]] = add nsw i32 [[EXT]], 2271  // CHECK32-NEXT:   call void @llvm.matrix.column.major.store.v80i32.i32(<80 x i32> [[M]], ptr align 4 [[PTR]], i32 [[ADD]], i1 false, i32 4, i32 20)272  //273  // CHECK64-NEXT:   [[IDX:%.*]] = sext i32 [[ADD]] to i64274  // CHECK64-NEXT:   call void @llvm.matrix.column.major.store.v80i32.i64(<80 x i32> [[M]], ptr align 4 [[PTR]], i64 [[IDX]], i1 false, i32 4, i32 20)275 276  ix4x20_t m;277  __builtin_matrix_column_major_store(m, Ptr, S + 2);278}279 280void column_major_store_array1(double Ptr[25]) {281  // COMMON-LABEL: define{{.*}} void @column_major_store_array1(ptr %Ptr)282  // CHECK32:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 4283  // CHECK32-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4284  // CHECK32-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i32(<25 x double> [[M]], ptr align 4 [[PTR]], i32 5, i1 false, i32 5, i32 5)285  //286  // CHECK64:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 8287  // CHECK64-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8288  // CHECK64-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i64(<25 x double> [[M]], ptr align 8 [[PTR]], i64 5, i1 false, i32 5, i32 5)289 290  dx5x5_t m;291  __builtin_matrix_column_major_store(m, Ptr, 5);292}293 294void column_major_store_array2(void) {295  // COMMON-LABEL: define{{.*}} void @column_major_store_array2()296  // CHECK32:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 4297  // CHECK32-NEXT:    [[PTR:%.*]] = getelementptr inbounds [25 x double], ptr %Ptr, i32 0, i32 0298  // CHECK32-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i32(<25 x double> [[M]], ptr align 8 [[PTR]], i32 5, i1 false, i32 5, i32 5)299  //300  // CHECK64:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 8301  // CHECK64-NEXT:    [[PTR:%.*]] = getelementptr inbounds [25 x double], ptr %Ptr, i64 0, i64 0302  // CHECK64-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i64(<25 x double> [[M]], ptr align 16 [[PTR]], i64 5, i1 false, i32 5, i32 5)303 304  double Ptr[25];305  dx5x5_t m;306  __builtin_matrix_column_major_store(m, Ptr, 5);307}308 309void column_major_store_volatile(volatile double *Ptr) {310  // COMMON-LABEL: define{{.*}} void @column_major_store_volatile(ptr %Ptr) #0 {311  // CHECK32:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 4312  // CHECK32-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 4313  // CHECK32-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i32(<25 x double> [[M]], ptr align 4 [[PTR]], i32 5, i1 true, i32 5, i32 5)314  //315  // CHECK64:         [[M:%.*]] = load <25 x double>, ptr {{.*}}, align 8316  // CHECK64-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8317  // CHECK64-NEXT:    call void @llvm.matrix.column.major.store.v25f64.i64(<25 x double> [[M]], ptr align 8 [[PTR]], i64 5, i1 true, i32 5, i32 5)318 319  dx5x5_t m;320  __builtin_matrix_column_major_store(m, Ptr, 5);321}322