Skip to content

Commit 821d56d

Browse files
committed
[CIR] Upstream local VectorType with 0 init elemnts
1 parent 4fcbdb2 commit 821d56d

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,11 +1684,6 @@ mlir::Value ScalarExprEmitter::VisitInitListExpr(InitListExpr *e) {
16841684
return {};
16851685
}
16861686

1687-
if (numInitElements == 0) {
1688-
cgf.cgm.errorNYI(e->getSourceRange(), "InitListExpr with 0 init elements");
1689-
return {};
1690-
}
1691-
16921687
if (e->getType()->isVectorType()) {
16931688
const auto vectorType =
16941689
mlir::cast<cir::VectorType>(cgf.convertType(e->getType()));
@@ -1710,6 +1705,12 @@ mlir::Value ScalarExprEmitter::VisitInitListExpr(InitListExpr *e) {
17101705
cgf.getLoc(e->getSourceRange()), vectorType, elements);
17111706
}
17121707

1708+
if (numInitElements == 0) {
1709+
cgf.cgm.errorNYI(e->getSourceRange(),
1710+
"InitListExpr Non VectorType with 0 init elements");
1711+
return {};
1712+
}
1713+
17131714
return Visit(e->getInit(0));
17141715
}
17151716

clang/test/CIR/CodeGen/vector-ext.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ void foo() {
6161
vi4 f = { x, 5, 6, x + 1 };
6262

6363
vi4 g = { 5 };
64+
65+
vi4 h = {};
6466
}
6567

6668
// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]
@@ -70,12 +72,15 @@ void foo() {
7072
// CIR: %[[VEC_E:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["e", init]
7173
// CIR: %[[VEC_F:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["f", init]
7274
// CIR: %[[VEC_G:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["g", init]
75+
// CIR: %[[VEC_H:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["h", init]
7376
// CIR: %[[VEC_E_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
7477
// CIR: cir.store %[[VEC_E_VAL]], %[[VEC_E]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
7578
// CIR: %[[VEC_F_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
7679
// CIR: cir.store %[[VEC_F_VAL]], %[[VEC_F]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
7780
// CIR: %[[VEC_G_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
7881
// CIR: cir.store %[[VEC_G_VAL]], %[[VEC_G]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
82+
// CIR: %[[VEC_H_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
83+
// CIR: cir.store %[[VEC_H_VAL]], %[[VEC_H]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
7984

8085
// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16
8186
// LLVM: %[[VEC_B:.*]] = alloca <3 x i32>, i64 1, align 16
@@ -84,9 +89,11 @@ void foo() {
8489
// LLVM: %[[VEC_E:.*]] = alloca <4 x i32>, i64 1, align 16
8590
// LLVM: %[[VEC_F:.*]] = alloca <4 x i32>, i64 1, align 16
8691
// LLVM: %[[VEC_G:.*]] = alloca <4 x i32>, i64 1, align 16
92+
// LLVM: %[[VEC_H:.*]] = alloca <4 x i32>, i64 1, align 16
8793
// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_E]], align 16
8894
// LLVM: store <4 x i32> {{.*}}, ptr %[[VEC_F]], align 16
8995
// LLVM: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_G]], align 16
96+
// LLVM: store <4 x i32> zeroinitializer, ptr %[[VEC_H]], align 16
9097

9198
// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
9299
// OGCG: %[[VEC_B:.*]] = alloca <3 x i32>, align 16
@@ -95,9 +102,11 @@ void foo() {
95102
// OGCG: %[[VEC_E:.*]] = alloca <4 x i32>, align 16
96103
// OGCG: %[[VEC_F:.*]] = alloca <4 x i32>, align 16
97104
// OGCG: %[[VEC_G:.*]] = alloca <4 x i32>, align 16
105+
// OGCG: %[[VEC_H:.*]] = alloca <4 x i32>, align 16
98106
// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_E]], align 16
99107
// OGCG: store <4 x i32> {{.*}}, ptr %[[VEC_F]], align 16
100108
// OGCG: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_G]], align 16
109+
// OGCG: store <4 x i32> zeroinitializer, ptr %[[VEC_H]], align 16
101110

102111
void foo2(vi4 p) {}
103112

clang/test/CIR/CodeGen/vector.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ void foo() {
5151
vi4 e = { x, 5, 6, x + 1 };
5252

5353
vi4 f = { 5 };
54+
55+
vi4 g = {};
5456
}
5557

5658
// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]
@@ -59,32 +61,39 @@ void foo() {
5961
// CIR: %[[VEC_D:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["d", init]
6062
// CIR: %[[VEC_E:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["e", init]
6163
// CIR: %[[VEC_F:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["f", init]
64+
// CIR: %[[VEC_H:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["g", init]
6265
// CIR: %[[VEC_D_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
6366
// CIR: cir.store %[[VEC_D_VAL]], %[[VEC_D]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
6467
// CIR: %[[VEC_E_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
6568
// CIR: cir.store %[[VEC_E_VAL]], %[[VEC_E]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
6669
// CIR: %[[VEC_F_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
6770
// CIR: cir.store %[[VEC_F_VAL]], %[[VEC_F]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
71+
// CIR: %[[VEC_G_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
72+
// CIR: cir.store %[[VEC_G_VAL]], %[[VEC_H]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
6873

6974
// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16
7075
// LLVM: %[[VEC_B:.*]] = alloca <2 x double>, i64 1, align 16
7176
// LLVM: %[[VEC_C:.*]] = alloca <2 x i64>, i64 1, align 16
7277
// LLVM: %[[VEC_D:.*]] = alloca <4 x i32>, i64 1, align 16
7378
// LLVM: %[[VEC_E:.*]] = alloca <4 x i32>, i64 1, align 16
7479
// LLVM: %[[VEC_F:.*]] = alloca <4 x i32>, i64 1, align 16
80+
// LLVM: %[[VEC_G:.*]] = alloca <4 x i32>, i64 1, align 16
7581
// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_D]], align 16
7682
// LLVM: store <4 x i32> {{.*}}, ptr %[[VEC_E]], align 16
7783
// LLVM: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_F]], align 16
84+
// LLVM: store <4 x i32> zeroinitializer, ptr %[[VEC_G]], align 16
7885

7986
// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
8087
// OGCG: %[[VEC_B:.*]] = alloca <2 x double>, align 16
8188
// OGCG: %[[VEC_C:.*]] = alloca <2 x i64>, align 16
8289
// OGCG: %[[VEC_D:.*]] = alloca <4 x i32>, align 16
8390
// OGCG: %[[VEC_E:.*]] = alloca <4 x i32>, align 16
8491
// OGCG: %[[VEC_F:.*]] = alloca <4 x i32>, align 16
92+
// OGCG: %[[VEC_G:.*]] = alloca <4 x i32>, align 16
8593
// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_D]], align 16
8694
// OGCG: store <4 x i32> {{.*}}, ptr %[[VEC_E]], align 16
8795
// OGCG: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_F]], align 16
96+
// OGCG: store <4 x i32> zeroinitializer, ptr %[[VEC_G]], align 16
8897

8998
void foo2(vi4 p) {}
9099

0 commit comments

Comments
 (0)