|
5 | 5 | // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll |
6 | 6 | // RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG |
7 | 7 |
|
| 8 | +typedef int vi2 __attribute__((ext_vector_type(2))); |
8 | 9 | typedef int vi4 __attribute__((ext_vector_type(4))); |
9 | 10 |
|
10 | 11 | void element_expr_from_gl() { |
@@ -44,3 +45,41 @@ void element_expr_from_gl() { |
44 | 45 | // OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16 |
45 | 46 | // OGCG: %[[ELEM_1:.*]] = extractelement <4 x i32> %[[TMP_A]], i64 1 |
46 | 47 | // OGCG: store i32 %[[ELEM_1]], ptr %[[Y_ADDR]], align 4 |
| 48 | + |
| 49 | +void element_expr_from_gl_with_vec_result() { |
| 50 | + vi4 a; |
| 51 | + vi2 b = a.xy; |
| 52 | + vi4 c = a.wzyx; |
| 53 | +} |
| 54 | + |
| 55 | +// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"] |
| 56 | +// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<2 x !s32i>, !cir.ptr<!cir.vector<2 x !s32i>>, ["b", init] |
| 57 | +// CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init] |
| 58 | +// CIR: %[[TMP_A:.*]] = cir.load {{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> |
| 59 | +// CIR: %[[POISON:.*]] = cir.const #cir.poison : !cir.vector<4 x !s32i> |
| 60 | +// CIR: %[[B_VALUE:.*]] = cir.vec.shuffle(%[[TMP_A]], %[[POISON]] : !cir.vector<4 x !s32i>) [#cir.int<0> : !s32i, #cir.int<1> : !s32i] : !cir.vector<2 x !s32i> |
| 61 | +// CIR: cir.store {{.*}} %[[B_VALUE]], %[[B_ADDR]] : !cir.vector<2 x !s32i>, !cir.ptr<!cir.vector<2 x !s32i>> |
| 62 | +// CIR: %[[TMP_A:.*]] = cir.load {{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> |
| 63 | +// CIR: %[[POISON:.*]] = cir.const #cir.poison : !cir.vector<4 x !s32i> |
| 64 | +// CIR: %[[C_VALUE:.*]] = cir.vec.shuffle(%[[TMP_A]], %[[POISON]] : !cir.vector<4 x !s32i>) [#cir.int<3> : !s32i, #cir.int<2> : !s32i, #cir.int<1> : !s32i, #cir.int<0> : !s32i] : !cir.vector<4 x !s32i> |
| 65 | +// CIR: cir.store {{.*}} %[[C_VALUE]], %[[C_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>> |
| 66 | + |
| 67 | +// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 16 |
| 68 | +// LLVM: %[[B_ADDR:.*]] = alloca <2 x i32>, i64 1, align 8 |
| 69 | +// LLVM: %[[C_ADDR:.*]] = alloca <4 x i32>, i64 1, align 16 |
| 70 | +// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16 |
| 71 | +// LLVM: %[[B_VALUE:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> poison, <2 x i32> <i32 0, i32 1> |
| 72 | +// LLVM: store <2 x i32> %[[B_VALUE]], ptr %[[B_ADDR]], align 8 |
| 73 | +// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16 |
| 74 | +// LLVM: %[[C_VALUE:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0> |
| 75 | +// LLVM: store <4 x i32> %[[C_VALUE]], ptr %[[C_ADDR]], align 16 |
| 76 | + |
| 77 | +// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 16 |
| 78 | +// OGCG: %[[B_ADDR:.*]] = alloca <2 x i32>, align 8 |
| 79 | +// OGCG: %[[C_ADDR:.*]] = alloca <4 x i32>, align 16 |
| 80 | +// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16 |
| 81 | +// OGCG: %[[B_VALUE:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> poison, <2 x i32> <i32 0, i32 1> |
| 82 | +// OGCG: store <2 x i32> %[[B_VALUE]], ptr %[[B_ADDR]], align 8 |
| 83 | +// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16 |
| 84 | +// OGCG: %[[C_VALUE:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0> |
| 85 | +// OGCG: store <4 x i32> %[[C_VALUE]], ptr %[[C_ADDR]], align 16 |
0 commit comments