[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / X86 / pr42022.ll
blob18ce596fc1c506bd76544c913f28e1cb12b1e7a3
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
4 ; See https://reviews.llvm.org/D70068 and https://reviews.llvm.org/D70587 for context
6 ; Checks that vector insertvalues into the struct become SLP seeds.
7 define { <2 x float>, <2 x float> } @StructOfVectors(float *%Ptr) {
8 ; CHECK-LABEL: @StructOfVectors(
9 ; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr inbounds float, float* [[PTR:%.*]], i64 0
10 ; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 1
11 ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 2
12 ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 3
13 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[GEP0]] to <4 x float>*
14 ; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 4
15 ; CHECK-NEXT:    [[TMP3:%.*]] = fadd fast <4 x float> [[TMP2]], <float 1.100000e+01, float 1.200000e+01, float 1.300000e+01, float 1.400000e+01>
16 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x float> [[TMP3]], i32 0
17 ; CHECK-NEXT:    [[VECIN0:%.*]] = insertelement <2 x float> undef, float [[TMP4]], i64 0
18 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP3]], i32 1
19 ; CHECK-NEXT:    [[VECIN1:%.*]] = insertelement <2 x float> [[VECIN0]], float [[TMP5]], i64 1
20 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x float> [[TMP3]], i32 2
21 ; CHECK-NEXT:    [[VECIN2:%.*]] = insertelement <2 x float> undef, float [[TMP6]], i64 0
22 ; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <4 x float> [[TMP3]], i32 3
23 ; CHECK-NEXT:    [[VECIN3:%.*]] = insertelement <2 x float> [[VECIN2]], float [[TMP7]], i64 1
24 ; CHECK-NEXT:    [[RET0:%.*]] = insertvalue { <2 x float>, <2 x float> } undef, <2 x float> [[VECIN1]], 0
25 ; CHECK-NEXT:    [[RET1:%.*]] = insertvalue { <2 x float>, <2 x float> } [[RET0]], <2 x float> [[VECIN3]], 1
26 ; CHECK-NEXT:    ret { <2 x float>, <2 x float> } [[RET1]]
28   %GEP0 = getelementptr inbounds float, float* %Ptr, i64 0
29   %L0 = load float, float * %GEP0
30   %GEP1 = getelementptr inbounds float, float* %Ptr, i64 1
31   %L1 = load float, float * %GEP1
32   %GEP2 = getelementptr inbounds float, float* %Ptr, i64 2
33   %L2 = load float, float * %GEP2
34   %GEP3 = getelementptr inbounds float, float* %Ptr, i64 3
35   %L3 = load float, float * %GEP3
37   %Fadd0 = fadd fast float %L0, 1.1e+01
38   %Fadd1 = fadd fast float %L1, 1.2e+01
39   %Fadd2 = fadd fast float %L2, 1.3e+01
40   %Fadd3 = fadd fast float %L3, 1.4e+01
42   %VecIn0 = insertelement <2 x float> undef, float %Fadd0, i64 0
43   %VecIn1 = insertelement <2 x float> %VecIn0, float %Fadd1, i64 1
45   %VecIn2 = insertelement <2 x float> undef, float %Fadd2, i64 0
46   %VecIn3 = insertelement <2 x float> %VecIn2, float %Fadd3, i64 1
48   %Ret0 = insertvalue {<2 x float>, <2 x float>} undef, <2 x float> %VecIn1, 0
49   %Ret1 = insertvalue {<2 x float>, <2 x float>} %Ret0, <2 x float> %VecIn3, 1
50   ret {<2 x float>, <2 x float>} %Ret1
53 %StructTy = type { float, float}
55 define [2 x %StructTy] @ArrayOfStruct(float *%Ptr) {
56 ; CHECK-LABEL: @ArrayOfStruct(
57 ; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr inbounds float, float* [[PTR:%.*]], i64 0
58 ; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 1
59 ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 2
60 ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 3
61 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[GEP0]] to <4 x float>*
62 ; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 4
63 ; CHECK-NEXT:    [[TMP3:%.*]] = fadd fast <4 x float> [[TMP2]], <float 1.100000e+01, float 1.200000e+01, float 1.300000e+01, float 1.400000e+01>
64 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x float> [[TMP3]], i32 0
65 ; CHECK-NEXT:    [[STRUCTIN0:%.*]] = insertvalue [[STRUCTTY:%.*]] undef, float [[TMP4]], 0
66 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP3]], i32 1
67 ; CHECK-NEXT:    [[STRUCTIN1:%.*]] = insertvalue [[STRUCTTY]] %StructIn0, float [[TMP5]], 1
68 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x float> [[TMP3]], i32 2
69 ; CHECK-NEXT:    [[STRUCTIN2:%.*]] = insertvalue [[STRUCTTY]] undef, float [[TMP6]], 0
70 ; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <4 x float> [[TMP3]], i32 3
71 ; CHECK-NEXT:    [[STRUCTIN3:%.*]] = insertvalue [[STRUCTTY]] %StructIn2, float [[TMP7]], 1
72 ; CHECK-NEXT:    [[RET0:%.*]] = insertvalue [2 x %StructTy] undef, [[STRUCTTY]] %StructIn1, 0
73 ; CHECK-NEXT:    [[RET1:%.*]] = insertvalue [2 x %StructTy] [[RET0]], [[STRUCTTY]] %StructIn3, 1
74 ; CHECK-NEXT:    ret [2 x %StructTy] [[RET1]]
76   %GEP0 = getelementptr inbounds float, float* %Ptr, i64 0
77   %L0 = load float, float * %GEP0
78   %GEP1 = getelementptr inbounds float, float* %Ptr, i64 1
79   %L1 = load float, float * %GEP1
80   %GEP2 = getelementptr inbounds float, float* %Ptr, i64 2
81   %L2 = load float, float * %GEP2
82   %GEP3 = getelementptr inbounds float, float* %Ptr, i64 3
83   %L3 = load float, float * %GEP3
85   %Fadd0 = fadd fast float %L0, 1.1e+01
86   %Fadd1 = fadd fast float %L1, 1.2e+01
87   %Fadd2 = fadd fast float %L2, 1.3e+01
88   %Fadd3 = fadd fast float %L3, 1.4e+01
90   %StructIn0 = insertvalue %StructTy undef, float %Fadd0, 0
91   %StructIn1 = insertvalue %StructTy %StructIn0, float %Fadd1, 1
93   %StructIn2 = insertvalue %StructTy undef, float %Fadd2, 0
94   %StructIn3 = insertvalue %StructTy %StructIn2, float %Fadd3, 1
96   %Ret0 = insertvalue [2 x %StructTy] undef, %StructTy %StructIn1, 0
97   %Ret1 = insertvalue [2 x %StructTy] %Ret0, %StructTy %StructIn3, 1
98   ret [2 x %StructTy] %Ret1
101 define {%StructTy, %StructTy} @StructOfStruct(float *%Ptr) {
102 ; CHECK-LABEL: @StructOfStruct(
103 ; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr inbounds float, float* [[PTR:%.*]], i64 0
104 ; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 1
105 ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 2
106 ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 3
107 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[GEP0]] to <4 x float>*
108 ; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 4
109 ; CHECK-NEXT:    [[TMP3:%.*]] = fadd fast <4 x float> [[TMP2]], <float 1.100000e+01, float 1.200000e+01, float 1.300000e+01, float 1.400000e+01>
110 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x float> [[TMP3]], i32 0
111 ; CHECK-NEXT:    [[STRUCTIN0:%.*]] = insertvalue [[STRUCTTY:%.*]] undef, float [[TMP4]], 0
112 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP3]], i32 1
113 ; CHECK-NEXT:    [[STRUCTIN1:%.*]] = insertvalue [[STRUCTTY]] %StructIn0, float [[TMP5]], 1
114 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x float> [[TMP3]], i32 2
115 ; CHECK-NEXT:    [[STRUCTIN2:%.*]] = insertvalue [[STRUCTTY]] undef, float [[TMP6]], 0
116 ; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <4 x float> [[TMP3]], i32 3
117 ; CHECK-NEXT:    [[STRUCTIN3:%.*]] = insertvalue [[STRUCTTY]] %StructIn2, float [[TMP7]], 1
118 ; CHECK-NEXT:    [[RET0:%.*]] = insertvalue { [[STRUCTTY]], [[STRUCTTY]] } undef, [[STRUCTTY]] %StructIn1, 0
119 ; CHECK-NEXT:    [[RET1:%.*]] = insertvalue { [[STRUCTTY]], [[STRUCTTY]] } [[RET0]], [[STRUCTTY]] %StructIn3, 1
120 ; CHECK-NEXT:    ret { [[STRUCTTY]], [[STRUCTTY]] } [[RET1]]
122   %GEP0 = getelementptr inbounds float, float* %Ptr, i64 0
123   %L0 = load float, float * %GEP0
124   %GEP1 = getelementptr inbounds float, float* %Ptr, i64 1
125   %L1 = load float, float * %GEP1
126   %GEP2 = getelementptr inbounds float, float* %Ptr, i64 2
127   %L2 = load float, float * %GEP2
128   %GEP3 = getelementptr inbounds float, float* %Ptr, i64 3
129   %L3 = load float, float * %GEP3
131   %Fadd0 = fadd fast float %L0, 1.1e+01
132   %Fadd1 = fadd fast float %L1, 1.2e+01
133   %Fadd2 = fadd fast float %L2, 1.3e+01
134   %Fadd3 = fadd fast float %L3, 1.4e+01
136   %StructIn0 = insertvalue %StructTy undef, float %Fadd0, 0
137   %StructIn1 = insertvalue %StructTy %StructIn0, float %Fadd1, 1
139   %StructIn2 = insertvalue %StructTy undef, float %Fadd2, 0
140   %StructIn3 = insertvalue %StructTy %StructIn2, float %Fadd3, 1
142   %Ret0 = insertvalue {%StructTy, %StructTy} undef, %StructTy %StructIn1, 0
143   %Ret1 = insertvalue {%StructTy, %StructTy} %Ret0, %StructTy %StructIn3, 1
144   ret {%StructTy, %StructTy} %Ret1
147 define {%StructTy, float, float} @NonHomogeneousStruct(float *%Ptr) {
148 ; CHECK-LABEL: @NonHomogeneousStruct(
149 ; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr inbounds float, float* [[PTR:%.*]], i64 0
150 ; CHECK-NEXT:    [[L0:%.*]] = load float, float* [[GEP0]], align 4
151 ; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 1
152 ; CHECK-NEXT:    [[L1:%.*]] = load float, float* [[GEP1]], align 4
153 ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 2
154 ; CHECK-NEXT:    [[L2:%.*]] = load float, float* [[GEP2]], align 4
155 ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds float, float* [[PTR]], i64 3
156 ; CHECK-NEXT:    [[L3:%.*]] = load float, float* [[GEP3]], align 4
157 ; CHECK-NEXT:    [[FADD0:%.*]] = fadd fast float [[L0]], 1.100000e+01
158 ; CHECK-NEXT:    [[FADD1:%.*]] = fadd fast float [[L1]], 1.200000e+01
159 ; CHECK-NEXT:    [[FADD2:%.*]] = fadd fast float [[L2]], 1.300000e+01
160 ; CHECK-NEXT:    [[FADD3:%.*]] = fadd fast float [[L3]], 1.400000e+01
161 ; CHECK-NEXT:    [[STRUCTIN0:%.*]] = insertvalue [[STRUCTTY:%.*]] undef, float [[FADD0]], 0
162 ; CHECK-NEXT:    [[STRUCTIN1:%.*]] = insertvalue [[STRUCTTY]] %StructIn0, float [[FADD1]], 1
163 ; CHECK-NEXT:    [[RET0:%.*]] = insertvalue { [[STRUCTTY]], float, float } undef, [[STRUCTTY]] %StructIn1, 0
164 ; CHECK-NEXT:    [[RET1:%.*]] = insertvalue { [[STRUCTTY]], float, float } [[RET0]], float [[FADD2]], 1
165 ; CHECK-NEXT:    [[RET2:%.*]] = insertvalue { [[STRUCTTY]], float, float } [[RET1]], float [[FADD3]], 2
166 ; CHECK-NEXT:    ret { [[STRUCTTY]], float, float } [[RET2]]
168   %GEP0 = getelementptr inbounds float, float* %Ptr, i64 0
169   %L0 = load float, float * %GEP0
170   %GEP1 = getelementptr inbounds float, float* %Ptr, i64 1
171   %L1 = load float, float * %GEP1
172   %GEP2 = getelementptr inbounds float, float* %Ptr, i64 2
173   %L2 = load float, float * %GEP2
174   %GEP3 = getelementptr inbounds float, float* %Ptr, i64 3
175   %L3 = load float, float * %GEP3
177   %Fadd0 = fadd fast float %L0, 1.1e+01
178   %Fadd1 = fadd fast float %L1, 1.2e+01
179   %Fadd2 = fadd fast float %L2, 1.3e+01
180   %Fadd3 = fadd fast float %L3, 1.4e+01
182   %StructIn0 = insertvalue %StructTy undef, float %Fadd0, 0
183   %StructIn1 = insertvalue %StructTy %StructIn0, float %Fadd1, 1
185   %Ret0 = insertvalue {%StructTy, float, float} undef, %StructTy %StructIn1, 0
186   %Ret1 = insertvalue {%StructTy, float, float} %Ret0, float %Fadd2, 1
187   %Ret2 = insertvalue {%StructTy, float, float} %Ret1, float %Fadd3, 2
188   ret {%StructTy, float, float} %Ret2
191 %Struct1Ty = type { i16, i16 }
192 %Struct2Ty = type { %Struct1Ty, %Struct1Ty}
194 define {%Struct2Ty, %Struct2Ty} @StructOfStructOfStruct(i16 *%Ptr) {
195 ; CHECK-LABEL: @StructOfStructOfStruct(
196 ; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr inbounds i16, i16* [[PTR:%.*]], i64 0
197 ; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i64 1
198 ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i64 2
199 ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i64 3
200 ; CHECK-NEXT:    [[GEP4:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i64 4
201 ; CHECK-NEXT:    [[GEP5:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i64 5
202 ; CHECK-NEXT:    [[GEP6:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i64 6
203 ; CHECK-NEXT:    [[GEP7:%.*]] = getelementptr inbounds i16, i16* [[PTR]], i64 7
204 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i16* [[GEP0]] to <8 x i16>*
205 ; CHECK-NEXT:    [[TMP2:%.*]] = load <8 x i16>, <8 x i16>* [[TMP1]], align 2
206 ; CHECK-NEXT:    [[TMP3:%.*]] = add <8 x i16> [[TMP2]], <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>
207 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x i16> [[TMP3]], i32 0
208 ; CHECK-NEXT:    [[STRUCTIN0:%.*]] = insertvalue [[STRUCT1TY:%.*]] undef, i16 [[TMP4]], 0
209 ; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x i16> [[TMP3]], i32 1
210 ; CHECK-NEXT:    [[STRUCTIN1:%.*]] = insertvalue [[STRUCT1TY]] %StructIn0, i16 [[TMP5]], 1
211 ; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x i16> [[TMP3]], i32 2
212 ; CHECK-NEXT:    [[STRUCTIN2:%.*]] = insertvalue [[STRUCT1TY]] undef, i16 [[TMP6]], 0
213 ; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x i16> [[TMP3]], i32 3
214 ; CHECK-NEXT:    [[STRUCTIN3:%.*]] = insertvalue [[STRUCT1TY]] %StructIn2, i16 [[TMP7]], 1
215 ; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x i16> [[TMP3]], i32 4
216 ; CHECK-NEXT:    [[STRUCTIN4:%.*]] = insertvalue [[STRUCT1TY]] undef, i16 [[TMP8]], 0
217 ; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x i16> [[TMP3]], i32 5
218 ; CHECK-NEXT:    [[STRUCTIN5:%.*]] = insertvalue [[STRUCT1TY]] %StructIn4, i16 [[TMP9]], 1
219 ; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <8 x i16> [[TMP3]], i32 6
220 ; CHECK-NEXT:    [[STRUCTIN6:%.*]] = insertvalue [[STRUCT1TY]] undef, i16 [[TMP10]], 0
221 ; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <8 x i16> [[TMP3]], i32 7
222 ; CHECK-NEXT:    [[STRUCTIN7:%.*]] = insertvalue [[STRUCT1TY]] %StructIn6, i16 [[TMP11]], 1
223 ; CHECK-NEXT:    [[STRUCT2IN0:%.*]] = insertvalue [[STRUCT2TY:%.*]] undef, [[STRUCT1TY]] %StructIn1, 0
224 ; CHECK-NEXT:    [[STRUCT2IN1:%.*]] = insertvalue [[STRUCT2TY]] %Struct2In0, [[STRUCT1TY]] %StructIn3, 1
225 ; CHECK-NEXT:    [[STRUCT2IN2:%.*]] = insertvalue [[STRUCT2TY]] undef, [[STRUCT1TY]] %StructIn5, 0
226 ; CHECK-NEXT:    [[STRUCT2IN3:%.*]] = insertvalue [[STRUCT2TY]] %Struct2In2, [[STRUCT1TY]] %StructIn7, 1
227 ; CHECK-NEXT:    [[RET0:%.*]] = insertvalue { [[STRUCT2TY]], [[STRUCT2TY]] } undef, [[STRUCT2TY]] %Struct2In1, 0
228 ; CHECK-NEXT:    [[RET1:%.*]] = insertvalue { [[STRUCT2TY]], [[STRUCT2TY]] } [[RET0]], [[STRUCT2TY]] %Struct2In3, 1
229 ; CHECK-NEXT:    ret { [[STRUCT2TY]], [[STRUCT2TY]] } [[RET1]]
231   %GEP0 = getelementptr inbounds i16, i16* %Ptr, i64 0
232   %L0 = load i16, i16 * %GEP0
233   %GEP1 = getelementptr inbounds i16, i16* %Ptr, i64 1
234   %L1 = load i16, i16 * %GEP1
235   %GEP2 = getelementptr inbounds i16, i16* %Ptr, i64 2
236   %L2 = load i16, i16 * %GEP2
237   %GEP3 = getelementptr inbounds i16, i16* %Ptr, i64 3
238   %L3 = load i16, i16 * %GEP3
239   %GEP4 = getelementptr inbounds i16, i16* %Ptr, i64 4
240   %L4 = load i16, i16 * %GEP4
241   %GEP5 = getelementptr inbounds i16, i16* %Ptr, i64 5
242   %L5 = load i16, i16 * %GEP5
243   %GEP6 = getelementptr inbounds i16, i16* %Ptr, i64 6
244   %L6 = load i16, i16 * %GEP6
245   %GEP7 = getelementptr inbounds i16, i16* %Ptr, i64 7
246   %L7 = load i16, i16 * %GEP7
248   %Fadd0 = add i16 %L0, 1
249   %Fadd1 = add i16 %L1, 2
250   %Fadd2 = add i16 %L2, 3
251   %Fadd3 = add i16 %L3, 4
252   %Fadd4 = add i16 %L4, 5
253   %Fadd5 = add i16 %L5, 6
254   %Fadd6 = add i16 %L6, 7
255   %Fadd7 = add i16 %L7, 8
257   %StructIn0 = insertvalue %Struct1Ty undef, i16 %Fadd0, 0
258   %StructIn1 = insertvalue %Struct1Ty %StructIn0, i16 %Fadd1, 1
260   %StructIn2 = insertvalue %Struct1Ty undef, i16 %Fadd2, 0
261   %StructIn3 = insertvalue %Struct1Ty %StructIn2, i16 %Fadd3, 1
263   %StructIn4 = insertvalue %Struct1Ty undef, i16 %Fadd4, 0
264   %StructIn5 = insertvalue %Struct1Ty %StructIn4, i16 %Fadd5, 1
266   %StructIn6 = insertvalue %Struct1Ty undef, i16 %Fadd6, 0
267   %StructIn7 = insertvalue %Struct1Ty %StructIn6, i16 %Fadd7, 1
269   %Struct2In0 = insertvalue %Struct2Ty undef, %Struct1Ty %StructIn1, 0
270   %Struct2In1 = insertvalue %Struct2Ty %Struct2In0, %Struct1Ty %StructIn3, 1
272   %Struct2In2 = insertvalue %Struct2Ty undef, %Struct1Ty %StructIn5, 0
273   %Struct2In3 = insertvalue %Struct2Ty %Struct2In2, %Struct1Ty %StructIn7, 1
275   %Ret0 = insertvalue {%Struct2Ty, %Struct2Ty} undef, %Struct2Ty %Struct2In1, 0
276   %Ret1 = insertvalue {%Struct2Ty, %Struct2Ty} %Ret0, %Struct2Ty %Struct2In3, 1
277   ret {%Struct2Ty, %Struct2Ty} %Ret1