@@ -142,3 +142,47 @@ void foo3() {
142142// OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
143143// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 1
144144// OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4
145+
146+ void foo4 () {
147+ vi4 a = { 1 , 2 , 3 , 4 };
148+
149+ int idx = 2 ;
150+ int e = a[idx];
151+ }
152+
153+ // CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
154+ // CIR: %[[IDX:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["idx", init]
155+ // CIR: %[[INIT:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["e", init]
156+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
157+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
158+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
159+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
160+ // CIR: %[[VEC_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
161+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
162+ // CIR: cir.store %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
163+ // CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i
164+ // CIR: cir.store %[[CONST_IDX]], %[[IDX]] : !s32i, !cir.ptr<!s32i>
165+ // CIR: %[[TMP1:.*]] = cir.load %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
166+ // CIR: %[[TMP2:.*]] = cir.load %[[IDX]] : !cir.ptr<!s32i>, !s32i
167+ // CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP1]][%[[TMP2]] : !s32i] : !cir.vector<4 x !s32i>
168+ // CIR: cir.store %[[ELE]], %[[INIT]] : !s32i, !cir.ptr<!s32i>
169+
170+ // LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16
171+ // LLVM: %[[IDX:.*]] = alloca i32, i64 1, align 4
172+ // LLVM: %[[INIT:.*]] = alloca i32, i64 1, align 4
173+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
174+ // LLVM: store i32 2, ptr %[[IDX]], align 4
175+ // LLVM: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
176+ // LLVM: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
177+ // LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]
178+ // LLVM: store i32 %[[ELE]], ptr %[[INIT]], align 4
179+
180+ // OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16
181+ // OGCG: %[[IDX:.*]] = alloca i32, align 4
182+ // OGCG: %[[INIT:.*]] = alloca i32, align 4
183+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16
184+ // OGCG: store i32 2, ptr %[[IDX]], align 4
185+ // OGCG: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
186+ // OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4
187+ // OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]
188+ // OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4
0 commit comments