@@ -136,3 +136,80 @@ void foo2(vi4 p) {}
136136
137137// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
138138// OGCG: store <4 x i32> %{{.*}}, ptr %[[VEC_A]], align 16
139+
140+ void foo3 () {
141+ vi4 a = { 1 , 2 , 3 , 4 };
142+ int e = a[1 ];
143+ }
144+
145+ // CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
146+ // CIR: %[[INIT:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["e", init]
147+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
148+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
149+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
150+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
151+ // CIR: %[[VEC_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
152+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
153+ // CIR: cir.store %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
154+ // CIR: %[[TMP:.*]] = cir.load %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
155+ // CIR: %[[IDX:.*]] = cir.const #cir.int<1> : !s32i
156+ // CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP]][%[[IDX]] : !s32i] : !cir.vector<4 x !s32i>
157+ // CIR: cir.store %[[ELE]], %[[INIT]] : !s32i, !cir.ptr<!s32i>
158+
159+ // LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16
160+ // LLVM: %[[INIT:.*]] = alloca i32, i64 1, align 4
161+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
162+ // LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
163+ // LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 1
164+ // LLVM: store i32 %[[ELE]], ptr %[[INIT]], align 4
165+
166+ // OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16
167+ // OGCG: %[[INIT:.*]] = alloca i32, align 4
168+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
169+ // OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
170+ // OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 1
171+ // OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4
172+
173+ void foo4 () {
174+ vi4 a = { 1 , 2 , 3 , 4 };
175+
176+ int idx = 2 ;
177+ int e = a[idx];
178+ }
179+
180+ // CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
181+ // CIR: %[[IDX:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["idx", init]
182+ // CIR: %[[INIT:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["e", init]
183+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
184+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
185+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
186+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
187+ // CIR: %[[VEC_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
188+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
189+ // CIR: cir.store %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
190+ // CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i
191+ // CIR: cir.store %[[CONST_IDX]], %[[IDX]] : !s32i, !cir.ptr<!s32i>
192+ // CIR: %[[TMP1:.*]] = cir.load %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
193+ // CIR: %[[TMP2:.*]] = cir.load %[[IDX]] : !cir.ptr<!s32i>, !s32i
194+ // CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP1]][%[[TMP2]] : !s32i] : !cir.vector<4 x !s32i>
195+ // CIR: cir.store %[[ELE]], %[[INIT]] : !s32i, !cir.ptr<!s32i>
196+
197+ // LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16
198+ // LLVM: %[[IDX:.*]] = alloca i32, i64 1, align 4
199+ // LLVM: %[[INIT:.*]] = alloca i32, i64 1, align 4
200+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
201+ // LLVM: store i32 2, ptr %[[IDX]], align 4
202+ // LLVM: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
203+ // LLVM: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
204+ // LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]
205+ // LLVM: store i32 %[[ELE]], ptr %[[INIT]], align 4
206+
207+ // OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16
208+ // OGCG: %[[IDX:.*]] = alloca i32, align 4
209+ // OGCG: %[[INIT:.*]] = alloca i32, align 4
210+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
211+ // OGCG: store i32 2, ptr %[[IDX]], align 4
212+ // OGCG: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
213+ // OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
214+ // OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]
215+ // OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4
0 commit comments