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