Skip to content

Commit f5b7d42

Browse files
authored
[CIR] Upstream local VectorType with 0 init elements (#138346)
This change adds local zero initialization for VectorType Issue #136487
1 parent 46f5852 commit f5b7d42

File tree

3 files changed

+67
-11
lines changed

3 files changed

+67
-11
lines changed

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

+6-5
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

+30-3
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,33 @@ 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]
73-
// CIR: %[[VEC_E_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
75+
// CIR: %[[VEC_H:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["h", init]
76+
// CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
77+
// CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
78+
// CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
79+
// CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
80+
// CIR: %[[VEC_E_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
81+
// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
7482
// CIR: cir.store %[[VEC_E_VAL]], %[[VEC_E]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
75-
// CIR: %[[VEC_F_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
83+
// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>
84+
// CIR: %[[X_VAL:.*]] = cir.load %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i
85+
// CIR: %[[CONST_5:.*]] = cir.const #cir.int<5> : !s32i
86+
// CIR: %[[CONST_6:.*]] = cir.const #cir.int<6> : !s32i
87+
// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>
88+
// CIR: %[[X:.*]] = cir.load %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i
89+
// CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
90+
// CIR: %[[X_PLUS_1:.*]] = cir.binop(add, %[[X]], %[[CONST_1]]) nsw : !s32i
91+
// CIR: %[[VEC_F_VAL:.*]] = cir.vec.create(%[[X_VAL]], %[[CONST_5]], %[[CONST_6]], %[[X_PLUS_1]] :
92+
// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
7693
// CIR: cir.store %[[VEC_F_VAL]], %[[VEC_F]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
77-
// CIR: %[[VEC_G_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
94+
// CIR: %[[CONST_5:.*]] = cir.const #cir.int<5> : !s32i
95+
// CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
96+
// CIR: %[[VEC_G_VAL:.*]] = cir.vec.create(%[[CONST_5]], %[[CONST_0]], %[[CONST_0]], %[[CONST_0]] :
97+
// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
7898
// CIR: cir.store %[[VEC_G_VAL]], %[[VEC_G]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
99+
// CIR: %[[ZERO:.*]] = cir.const #cir.int<0> : !s32i
100+
// CIR: %[[VEC_H_VAL:.*]] = cir.vec.create(%[[ZERO]], %[[ZERO]], %[[ZERO]], %[[ZERO]] : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
101+
// CIR: cir.store %[[VEC_H_VAL]], %[[VEC_H]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
79102

80103
// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16
81104
// LLVM: %[[VEC_B:.*]] = alloca <3 x i32>, i64 1, align 16
@@ -84,9 +107,11 @@ void foo() {
84107
// LLVM: %[[VEC_E:.*]] = alloca <4 x i32>, i64 1, align 16
85108
// LLVM: %[[VEC_F:.*]] = alloca <4 x i32>, i64 1, align 16
86109
// LLVM: %[[VEC_G:.*]] = alloca <4 x i32>, i64 1, align 16
110+
// LLVM: %[[VEC_H:.*]] = alloca <4 x i32>, i64 1, align 16
87111
// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_E]], align 16
88112
// LLVM: store <4 x i32> {{.*}}, ptr %[[VEC_F]], align 16
89113
// LLVM: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_G]], align 16
114+
// LLVM: store <4 x i32> zeroinitializer, ptr %[[VEC_H]], align 16
90115

91116
// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
92117
// OGCG: %[[VEC_B:.*]] = alloca <3 x i32>, align 16
@@ -95,9 +120,11 @@ void foo() {
95120
// OGCG: %[[VEC_E:.*]] = alloca <4 x i32>, align 16
96121
// OGCG: %[[VEC_F:.*]] = alloca <4 x i32>, align 16
97122
// OGCG: %[[VEC_G:.*]] = alloca <4 x i32>, align 16
123+
// OGCG: %[[VEC_H:.*]] = alloca <4 x i32>, align 16
98124
// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_E]], align 16
99125
// OGCG: store <4 x i32> {{.*}}, ptr %[[VEC_F]], align 16
100126
// OGCG: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_G]], align 16
127+
// OGCG: store <4 x i32> zeroinitializer, ptr %[[VEC_H]], align 16
101128

102129
void foo2(vi4 p) {}
103130

clang/test/CIR/CodeGen/vector.cpp

+31-3
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,58 @@ 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]
62-
// CIR: %[[VEC_D_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
64+
// CIR: %[[VEC_G:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["g", init]
65+
// CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
66+
// CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
67+
// CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
68+
// CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
69+
// CIR: %[[VEC_D_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
70+
// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
6371
// CIR: cir.store %[[VEC_D_VAL]], %[[VEC_D]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
64-
// CIR: %[[VEC_E_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
72+
// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>
73+
// CIR: %[[X_VAL:.*]] = cir.load %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i
74+
// CIR: %[[CONST_5:.*]] = cir.const #cir.int<5> : !s32i
75+
// CIR: %[[CONST_6:.*]] = cir.const #cir.int<6> : !s32i
76+
// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>
77+
// CIR: %[[X:.*]] = cir.load %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i
78+
// CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
79+
// CIR: %[[X_PLUS_1:.*]] = cir.binop(add, %[[X]], %[[CONST_1]]) nsw : !s32i
80+
// CIR: %[[VEC_E_VAL:.*]] = cir.vec.create(%[[X_VAL]], %[[CONST_5]], %[[CONST_6]], %[[X_PLUS_1]] :
81+
// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
6582
// CIR: cir.store %[[VEC_E_VAL]], %[[VEC_E]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
66-
// CIR: %[[VEC_F_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
83+
// CIR: %[[CONST_5:.*]] = cir.const #cir.int<5> : !s32i
84+
// CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
85+
// CIR: %[[VEC_F_VAL:.*]] = cir.vec.create(%[[CONST_5]], %[[CONST_0]], %[[CONST_0]], %[[CONST_0]] :
86+
// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
6787
// CIR: cir.store %[[VEC_F_VAL]], %[[VEC_F]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
88+
// CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
89+
// CIR: %[[VEC_G_VAL:.*]] = cir.vec.create(%[[CONST_0]], %[[CONST_0]], %[[CONST_0]], %[[CONST_0]] :
90+
// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
91+
// CIR: cir.store %[[VEC_G_VAL]], %[[VEC_G]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
6892

6993
// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16
7094
// LLVM: %[[VEC_B:.*]] = alloca <2 x double>, i64 1, align 16
7195
// LLVM: %[[VEC_C:.*]] = alloca <2 x i64>, i64 1, align 16
7296
// LLVM: %[[VEC_D:.*]] = alloca <4 x i32>, i64 1, align 16
7397
// LLVM: %[[VEC_E:.*]] = alloca <4 x i32>, i64 1, align 16
7498
// LLVM: %[[VEC_F:.*]] = alloca <4 x i32>, i64 1, align 16
99+
// LLVM: %[[VEC_G:.*]] = alloca <4 x i32>, i64 1, align 16
75100
// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_D]], align 16
76101
// LLVM: store <4 x i32> {{.*}}, ptr %[[VEC_E]], align 16
77102
// LLVM: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_F]], align 16
103+
// LLVM: store <4 x i32> zeroinitializer, ptr %[[VEC_G]], align 16
78104

79105
// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
80106
// OGCG: %[[VEC_B:.*]] = alloca <2 x double>, align 16
81107
// OGCG: %[[VEC_C:.*]] = alloca <2 x i64>, align 16
82108
// OGCG: %[[VEC_D:.*]] = alloca <4 x i32>, align 16
83109
// OGCG: %[[VEC_E:.*]] = alloca <4 x i32>, align 16
84110
// OGCG: %[[VEC_F:.*]] = alloca <4 x i32>, align 16
111+
// OGCG: %[[VEC_G:.*]] = alloca <4 x i32>, align 16
85112
// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_D]], align 16
86113
// OGCG: store <4 x i32> {{.*}}, ptr %[[VEC_E]], align 16
87114
// OGCG: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_F]], align 16
115+
// OGCG: store <4 x i32> zeroinitializer, ptr %[[VEC_G]], align 16
88116

89117
void foo2(vi4 p) {}
90118

0 commit comments

Comments
 (0)