@@ -213,3 +213,126 @@ void foo4() {
213
213
// OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
214
214
// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]
215
215
// 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