@@ -213,3 +213,126 @@ void foo4() {
213213// OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
214214// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]
215215// OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4
216+
217+ void foo5 () {
218+ vi4 a = { 1 , 2 , 3 , 4 };
219+
220+ a[2 ] = 5 ;
221+ }
222+
223+ // CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
224+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
225+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
226+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
227+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
228+ // CIR: %[[VEC_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
229+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
230+ // CIR: cir.store %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
231+ // CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i
232+ // CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i
233+ // CIR: %[[TMP:.*]] = cir.load %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
234+ // CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[CONST_VAL]], %[[TMP]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>
235+ // CIR: cir.store %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
236+
237+ // LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16
238+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
239+ // LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
240+ // LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP]], i32 5, i32 2
241+ // LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16
242+
243+ // OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16
244+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
245+ // OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
246+ // OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP]], i32 5, i32 2
247+ // OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16
248+
249+ void foo6 () {
250+ vi4 a = { 1 , 2 , 3 , 4 };
251+ int idx = 2 ;
252+ int value = 5 ;
253+ a[idx] = value;
254+ }
255+
256+ // CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
257+ // CIR: %[[IDX:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["idx", init]
258+ // CIR: %[[VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["value", init]
259+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
260+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
261+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
262+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
263+ // CIR: %[[VEC_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
264+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
265+ // CIR: cir.store %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
266+ // CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i
267+ // CIR: cir.store %[[CONST_IDX]], %[[IDX]] : !s32i, !cir.ptr<!s32i>
268+ // CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i
269+ // CIR: cir.store %[[CONST_VAL]], %[[VAL]] : !s32i, !cir.ptr<!s32i>
270+ // CIR: %[[TMP1:.*]] = cir.load %[[VAL]] : !cir.ptr<!s32i>, !s32i
271+ // CIR: %[[TMP2:.*]] = cir.load %[[IDX]] : !cir.ptr<!s32i>, !s32i
272+ // CIR: %[[TMP3:.*]] = cir.load %0 : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
273+ // CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[TMP1]], %[[TMP3]][%[[TMP2]] : !s32i] : !cir.vector<4 x !s32i>
274+ // CIR: cir.store %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
275+
276+ // LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16
277+ // LLVM: %[[IDX:.*]] = alloca i32, i64 1, align 4
278+ // LLVM: %[[VAL:.*]] = alloca i32, i64 1, align 4
279+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %1, align 16
280+ // LLVM: store i32 2, ptr %[[IDX]], align 4
281+ // LLVM: store i32 5, ptr %[[VAL]], align 4
282+ // LLVM: %[[TMP1:.*]] = load i32, ptr %[[VAL]], align 4
283+ // LLVM: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
284+ // LLVM: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
285+ // LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP3]], i32 %[[TMP1]], i32 %[[TMP2]]
286+ // LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16
287+
288+ // OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16
289+ // OGCG: %[[IDX:.*]] = alloca i32, align 4
290+ // OGCG: %[[VAL:.*]] = alloca i32, align 4
291+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
292+ // OGCG: store i32 2, ptr %[[IDX]], align 4
293+ // OGCG: store i32 5, ptr %[[VAL]], align 4
294+ // OGCG: %[[TMP1:.*]] = load i32, ptr %[[VAL]], align 4
295+ // OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
296+ // OGCG: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
297+ // OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP3]], i32 %[[TMP1]], i32 %[[TMP2]]
298+ // OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16
299+
300+ void foo7 () {
301+ vi4 a = {1 , 2 , 3 , 4 };
302+ a[2 ] += 5 ;
303+ }
304+
305+ // CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
306+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
307+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
308+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
309+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
310+ // CIR: %[[VEC_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
311+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
312+ // CIR: cir.store %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
313+ // CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i
314+ // CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i
315+ // CIR: %[[TMP:.*]] = cir.load %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
316+ // CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>
317+ // CIR: %[[RES:.*]] = cir.binop(add, %[[ELE]], %[[CONST_VAL]]) nsw : !s32i
318+ // CIR: %[[TMP2:.*]] = cir.load %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
319+ // CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[RES]], %[[TMP2]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>
320+ // CIR: cir.store %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
321+
322+ // LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16
323+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
324+ // LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
325+ // LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 2
326+ // LLVM: %[[RES:.*]] = add nsw i32 %[[ELE]], 5
327+ // LLVM: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
328+ // LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP2]], i32 %[[RES]], i32 2
329+ // LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16
330+
331+ // OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16
332+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
333+ // OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
334+ // OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 2
335+ // OGCG: %[[RES:.*]] = add nsw i32 %[[ELE]], 5
336+ // OGCG: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
337+ // OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP2]], i32 %[[RES]], i32 2
338+ // OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16
0 commit comments