xref: /llvm-project/clang/test/CodeGenCXX/matrix-vector-bit-int.cpp (revision 03744d2aaffee04bc1e4d0668c41556c3c20d406)
149331ab0SShilei Tian // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
26e58e99aSSirraide // RUN: %clang_cc1 -fenable-matrix %s -emit-llvm -triple x86_64-unknown-linux -disable-llvm-passes -o - -std=c++11 | FileCheck %s
36e58e99aSSirraide 
46e58e99aSSirraide using i8x3 = _BitInt(8) __attribute__((ext_vector_type(3)));
56e58e99aSSirraide using i8x3x3 = _BitInt(8) __attribute__((matrix_type(3, 3)));
66e58e99aSSirraide using i32x3 = _BitInt(32) __attribute__((ext_vector_type(3)));
76e58e99aSSirraide using i32x3x3 = _BitInt(32) __attribute__((matrix_type(3, 3)));
86e58e99aSSirraide using i512x3 = _BitInt(512) __attribute__((ext_vector_type(3)));
96e58e99aSSirraide using i512x3x3 = _BitInt(512) __attribute__((matrix_type(3, 3)));
106e58e99aSSirraide 
1149331ab0SShilei Tian // CHECK-LABEL: define dso_local i32 @_Z2v1Dv3_DB8_(
1249331ab0SShilei Tian // CHECK-SAME: i32 [[A_COERCE:%.*]]) #[[ATTR0:[0-9]+]] {
1349331ab0SShilei Tian // CHECK-NEXT:  [[ENTRY:.*:]]
1449331ab0SShilei Tian // CHECK-NEXT:    [[RETVAL:%.*]] = alloca <3 x i8>, align 4
1549331ab0SShilei Tian // CHECK-NEXT:    [[A:%.*]] = alloca <3 x i8>, align 4
1649331ab0SShilei Tian // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca <3 x i8>, align 4
1749331ab0SShilei Tian // CHECK-NEXT:    store i32 [[A_COERCE]], ptr [[A]], align 4
18*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN:%.*]] = load <4 x i8>, ptr [[A]], align 4
19*03744d2aSShilei Tian // CHECK-NEXT:    [[A1:%.*]] = shufflevector <4 x i8> [[LOADVECN]], <4 x i8> poison, <3 x i32> <i32 0, i32 1, i32 2>
2049331ab0SShilei Tian // CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <3 x i8> [[A1]], <3 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
2149331ab0SShilei Tian // CHECK-NEXT:    store <4 x i8> [[EXTRACTVEC]], ptr [[A_ADDR]], align 4
22*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN2:%.*]] = load <4 x i8>, ptr [[A_ADDR]], align 4
23*03744d2aSShilei Tian // CHECK-NEXT:    [[EXTRACTVEC3:%.*]] = shufflevector <4 x i8> [[LOADVECN2]], <4 x i8> poison, <3 x i32> <i32 0, i32 1, i32 2>
24*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN4:%.*]] = load <4 x i8>, ptr [[A_ADDR]], align 4
25*03744d2aSShilei Tian // CHECK-NEXT:    [[EXTRACTVEC5:%.*]] = shufflevector <4 x i8> [[LOADVECN4]], <4 x i8> poison, <3 x i32> <i32 0, i32 1, i32 2>
2649331ab0SShilei Tian // CHECK-NEXT:    [[ADD:%.*]] = add <3 x i8> [[EXTRACTVEC3]], [[EXTRACTVEC5]]
2749331ab0SShilei Tian // CHECK-NEXT:    store <3 x i8> [[ADD]], ptr [[RETVAL]], align 4
2849331ab0SShilei Tian // CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4
2949331ab0SShilei Tian // CHECK-NEXT:    ret i32 [[TMP0]]
3049331ab0SShilei Tian //
316e58e99aSSirraide i8x3 v1(i8x3 a) {
326e58e99aSSirraide   return a + a;
336e58e99aSSirraide }
346e58e99aSSirraide 
3549331ab0SShilei Tian // CHECK-LABEL: define dso_local noundef <3 x i32> @_Z2v2Dv3_DB32_(
3649331ab0SShilei Tian // CHECK-SAME: <3 x i32> noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {
3749331ab0SShilei Tian // CHECK-NEXT:  [[ENTRY:.*:]]
3849331ab0SShilei Tian // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca <3 x i32>, align 16
3949331ab0SShilei Tian // CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <3 x i32> [[A]], <3 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
4049331ab0SShilei Tian // CHECK-NEXT:    store <4 x i32> [[EXTRACTVEC]], ptr [[A_ADDR]], align 16
41*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN:%.*]] = load <4 x i32>, ptr [[A_ADDR]], align 16
42*03744d2aSShilei Tian // CHECK-NEXT:    [[EXTRACTVEC1:%.*]] = shufflevector <4 x i32> [[LOADVECN]], <4 x i32> poison, <3 x i32> <i32 0, i32 1, i32 2>
43*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN2:%.*]] = load <4 x i32>, ptr [[A_ADDR]], align 16
44*03744d2aSShilei Tian // CHECK-NEXT:    [[EXTRACTVEC3:%.*]] = shufflevector <4 x i32> [[LOADVECN2]], <4 x i32> poison, <3 x i32> <i32 0, i32 1, i32 2>
4549331ab0SShilei Tian // CHECK-NEXT:    [[ADD:%.*]] = add <3 x i32> [[EXTRACTVEC1]], [[EXTRACTVEC3]]
4649331ab0SShilei Tian // CHECK-NEXT:    ret <3 x i32> [[ADD]]
4749331ab0SShilei Tian //
486e58e99aSSirraide i32x3 v2(i32x3 a) {
496e58e99aSSirraide   return a + a;
506e58e99aSSirraide }
516e58e99aSSirraide 
5249331ab0SShilei Tian // CHECK-LABEL: define dso_local noundef <3 x i512> @_Z2v3Dv3_DB512_(
5349331ab0SShilei Tian // CHECK-SAME: ptr noundef byval(<3 x i512>) align 256 [[TMP0:%.*]]) #[[ATTR2:[0-9]+]] {
5449331ab0SShilei Tian // CHECK-NEXT:  [[ENTRY:.*:]]
5549331ab0SShilei Tian // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca <3 x i512>, align 256
56*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN:%.*]] = load <4 x i512>, ptr [[TMP0]], align 256
57*03744d2aSShilei Tian // CHECK-NEXT:    [[A:%.*]] = shufflevector <4 x i512> [[LOADVECN]], <4 x i512> poison, <3 x i32> <i32 0, i32 1, i32 2>
5849331ab0SShilei Tian // CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <3 x i512> [[A]], <3 x i512> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
5949331ab0SShilei Tian // CHECK-NEXT:    store <4 x i512> [[EXTRACTVEC]], ptr [[A_ADDR]], align 256
60*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN1:%.*]] = load <4 x i512>, ptr [[A_ADDR]], align 256
61*03744d2aSShilei Tian // CHECK-NEXT:    [[EXTRACTVEC2:%.*]] = shufflevector <4 x i512> [[LOADVECN1]], <4 x i512> poison, <3 x i32> <i32 0, i32 1, i32 2>
62*03744d2aSShilei Tian // CHECK-NEXT:    [[LOADVECN3:%.*]] = load <4 x i512>, ptr [[A_ADDR]], align 256
63*03744d2aSShilei Tian // CHECK-NEXT:    [[EXTRACTVEC4:%.*]] = shufflevector <4 x i512> [[LOADVECN3]], <4 x i512> poison, <3 x i32> <i32 0, i32 1, i32 2>
6449331ab0SShilei Tian // CHECK-NEXT:    [[ADD:%.*]] = add <3 x i512> [[EXTRACTVEC2]], [[EXTRACTVEC4]]
6549331ab0SShilei Tian // CHECK-NEXT:    ret <3 x i512> [[ADD]]
6649331ab0SShilei Tian //
676e58e99aSSirraide i512x3 v3(i512x3 a) {
686e58e99aSSirraide   return a + a;
696e58e99aSSirraide }
706e58e99aSSirraide 
7149331ab0SShilei Tian // CHECK-LABEL: define dso_local noundef <9 x i8> @_Z2m1u11matrix_typeILm3ELm3EDB8_E(
7249331ab0SShilei Tian // CHECK-SAME: <9 x i8> noundef [[A:%.*]]) #[[ATTR3:[0-9]+]] {
7349331ab0SShilei Tian // CHECK-NEXT:  [[ENTRY:.*:]]
7449331ab0SShilei Tian // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca [9 x i8], align 1
7549331ab0SShilei Tian // CHECK-NEXT:    store <9 x i8> [[A]], ptr [[A_ADDR]], align 1
7649331ab0SShilei Tian // CHECK-NEXT:    [[TMP0:%.*]] = load <9 x i8>, ptr [[A_ADDR]], align 1
7749331ab0SShilei Tian // CHECK-NEXT:    [[TMP1:%.*]] = load <9 x i8>, ptr [[A_ADDR]], align 1
7849331ab0SShilei Tian // CHECK-NEXT:    [[TMP2:%.*]] = add <9 x i8> [[TMP0]], [[TMP1]]
7949331ab0SShilei Tian // CHECK-NEXT:    ret <9 x i8> [[TMP2]]
8049331ab0SShilei Tian //
816e58e99aSSirraide i8x3x3 m1(i8x3x3 a) {
826e58e99aSSirraide   return a + a;
836e58e99aSSirraide }
846e58e99aSSirraide 
8549331ab0SShilei Tian // CHECK-LABEL: define dso_local noundef <9 x i32> @_Z2m2u11matrix_typeILm3ELm3EDB32_E(
8649331ab0SShilei Tian // CHECK-SAME: <9 x i32> noundef [[A:%.*]]) #[[ATTR4:[0-9]+]] {
8749331ab0SShilei Tian // CHECK-NEXT:  [[ENTRY:.*:]]
8849331ab0SShilei Tian // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca [9 x i32], align 4
8949331ab0SShilei Tian // CHECK-NEXT:    store <9 x i32> [[A]], ptr [[A_ADDR]], align 4
9049331ab0SShilei Tian // CHECK-NEXT:    [[TMP0:%.*]] = load <9 x i32>, ptr [[A_ADDR]], align 4
9149331ab0SShilei Tian // CHECK-NEXT:    [[TMP1:%.*]] = load <9 x i32>, ptr [[A_ADDR]], align 4
9249331ab0SShilei Tian // CHECK-NEXT:    [[TMP2:%.*]] = add <9 x i32> [[TMP0]], [[TMP1]]
9349331ab0SShilei Tian // CHECK-NEXT:    ret <9 x i32> [[TMP2]]
9449331ab0SShilei Tian //
956e58e99aSSirraide i32x3x3 m2(i32x3x3 a) {
966e58e99aSSirraide   return a + a;
976e58e99aSSirraide }
986e58e99aSSirraide 
9949331ab0SShilei Tian // CHECK-LABEL: define dso_local noundef <9 x i512> @_Z2m3u11matrix_typeILm3ELm3EDB512_E(
10049331ab0SShilei Tian // CHECK-SAME: <9 x i512> noundef [[A:%.*]]) #[[ATTR5:[0-9]+]] {
10149331ab0SShilei Tian // CHECK-NEXT:  [[ENTRY:.*:]]
10249331ab0SShilei Tian // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca [9 x i512], align 8
10349331ab0SShilei Tian // CHECK-NEXT:    store <9 x i512> [[A]], ptr [[A_ADDR]], align 8
10449331ab0SShilei Tian // CHECK-NEXT:    [[TMP0:%.*]] = load <9 x i512>, ptr [[A_ADDR]], align 8
10549331ab0SShilei Tian // CHECK-NEXT:    [[TMP1:%.*]] = load <9 x i512>, ptr [[A_ADDR]], align 8
10649331ab0SShilei Tian // CHECK-NEXT:    [[TMP2:%.*]] = add <9 x i512> [[TMP0]], [[TMP1]]
10749331ab0SShilei Tian // CHECK-NEXT:    ret <9 x i512> [[TMP2]]
10849331ab0SShilei Tian //
1096e58e99aSSirraide i512x3x3 m3(i512x3x3 a) {
1106e58e99aSSirraide   return a + a;
1116e58e99aSSirraide }
112