OLD | NEW |
1 ; RUN: opt %s -simplify-struct-reg-signatures -S | FileCheck %s | 1 ; RUN: opt %s -simplify-struct-reg-signatures -S | FileCheck %s |
2 | 2 |
3 declare i32 @__gxx_personality_v0(...) | 3 declare i32 @__gxx_personality_v0(...) |
4 | 4 |
5 %struct = type { i32, i32 } | 5 %struct = type { i32, i32 } |
6 | 6 |
7 %rec_struct = type {%rec_struct*} | 7 %rec_struct = type {%rec_struct*} |
8 %rec_problem_struct = type{void (%rec_problem_struct)*} | 8 %rec_problem_struct = type{void (%rec_problem_struct)*} |
9 %rec_pair_1 = type {%rec_pair_2*} | 9 %rec_pair_1 = type {%rec_pair_2*} |
10 %rec_pair_2 = type {%rec_pair_1*} | 10 %rec_pair_2 = type {%rec_pair_1*} |
(...skipping 14 matching lines...) Expand all Loading... |
25 declare %struct @struct_returning_extern(i32, %struct) | 25 declare %struct @struct_returning_extern(i32, %struct) |
26 | 26 |
27 ; verify that parameters are mapped correctly: single param, two, and combo | 27 ; verify that parameters are mapped correctly: single param, two, and combo |
28 ; with non-struct regs | 28 ; with non-struct regs |
29 ; CHECK-NOT: declare void @extern_func(%struct) | 29 ; CHECK-NOT: declare void @extern_func(%struct) |
30 ; CHECK-NOT: declare %struct @struct_returning_extern(i32, %struct) | 30 ; CHECK-NOT: declare %struct @struct_returning_extern(i32, %struct) |
31 ; CHECK-LABEL: declare void @extern_func(%struct* byval) | 31 ; CHECK-LABEL: declare void @extern_func(%struct* byval) |
32 ; CHECK-LABEL: declare void @struct_returning_extern(%struct* sret, i32, %struct
* byval) | 32 ; CHECK-LABEL: declare void @struct_returning_extern(%struct* sret, i32, %struct
* byval) |
33 | 33 |
34 define void @main(%struct* byval %ptr) { | 34 define void @main(%struct* byval %ptr) { |
35 %val = load %struct* %ptr | 35 %val = load %struct, %struct* %ptr |
36 call void @extern_func(%struct %val) | 36 call void @extern_func(%struct %val) |
37 ret void | 37 ret void |
38 } | 38 } |
39 | 39 |
40 define void @two_param_func(%struct %val1, %struct %val2) { | 40 define void @two_param_func(%struct %val1, %struct %val2) { |
41 call void @extern_func(%struct %val1) | 41 call void @extern_func(%struct %val1) |
42 call void @extern_func(%struct %val2) | 42 call void @extern_func(%struct %val2) |
43 ret void | 43 ret void |
44 } | 44 } |
45 | 45 |
(...skipping 21 matching lines...) Expand all Loading... |
67 cleanup | 67 cleanup |
68 resume {i8*, i32} %exn | 68 resume {i8*, i32} %exn |
69 } | 69 } |
70 | 70 |
71 ; verify return value and codegen | 71 ; verify return value and codegen |
72 ; CHECK-LABEL: define void @returns_struct(%struct* sret %retVal, i32 %an_int, %
struct* byval %val.ptr) | 72 ; CHECK-LABEL: define void @returns_struct(%struct* sret %retVal, i32 %an_int, %
struct* byval %val.ptr) |
73 ; CHECK-NEXT: %tmp2 = alloca %struct | 73 ; CHECK-NEXT: %tmp2 = alloca %struct |
74 ; CHECK-NEXT: %tmp.sreg.ptr = alloca %struct | 74 ; CHECK-NEXT: %tmp.sreg.ptr = alloca %struct |
75 ; CHECK-NEXT: %tmp = alloca %struct | 75 ; CHECK-NEXT: %tmp = alloca %struct |
76 ; CHECK-NEXT: %val.sreg.ptr = alloca %struct | 76 ; CHECK-NEXT: %val.sreg.ptr = alloca %struct |
77 ; CHECK-NEXT: %val.sreg = load %struct* %val.ptr | 77 ; CHECK-NEXT: %val.sreg = load %struct, %struct* %val.ptr |
78 ; CHECK-NEXT: store %struct %val.sreg, %struct* %val.sreg.ptr | 78 ; CHECK-NEXT: store %struct %val.sreg, %struct* %val.sreg.ptr |
79 ; CHECK-NEXT: call void @struct_returning_extern(%struct* sret %tmp, i32 %an_in
t, %struct* byval %val.sreg.ptr) | 79 ; CHECK-NEXT: call void @struct_returning_extern(%struct* sret %tmp, i32 %an_in
t, %struct* byval %val.sreg.ptr) |
80 ; CHECK-NEXT: %tmp.sreg = load %struct* %tmp | 80 ; CHECK-NEXT: %tmp.sreg = load %struct, %struct* %tmp |
81 ; CHECK-NEXT: store %struct %tmp.sreg, %struct* %tmp.sreg.ptr | 81 ; CHECK-NEXT: store %struct %tmp.sreg, %struct* %tmp.sreg.ptr |
82 ; CHECK-NEXT: invoke void @struct_returning_extern(%struct* sret %tmp2, i32 1,
%struct* byval %tmp.sreg.ptr) | 82 ; CHECK-NEXT: invoke void @struct_returning_extern(%struct* sret %tmp2, i32 1,
%struct* byval %tmp.sreg.ptr) |
83 ; CHECK-NEXT: to label %Cont unwind label %Cleanup | 83 ; CHECK-NEXT: to label %Cont unwind label %Cleanup |
84 ; CHECK-DAG: Cont: | 84 ; CHECK-DAG: Cont: |
85 ; CHECK-NEXT: %tmp2.sreg = load %struct* %tmp2 | 85 ; CHECK-NEXT: %tmp2.sreg = load %struct, %struct* %tmp2 |
86 ; CHECK-NEXT: store %struct %tmp2.sreg, %struct* %retVal | 86 ; CHECK-NEXT: store %struct %tmp2.sreg, %struct* %retVal |
87 ; CHECK-NEXT: ret void | 87 ; CHECK-NEXT: ret void |
88 ; CHECK-DAG: Cleanup: | 88 ; CHECK-DAG: Cleanup: |
89 ; CHECK-NEXT: %exn = landingpad { i8*, i32 } personality i32 (...)* @__gxx_pe
rsonality_v0 | 89 ; CHECK-NEXT: %exn = landingpad { i8*, i32 } personality i32 (...)* @__gxx_pe
rsonality_v0 |
90 ; CHECK-NEXT: cleanup | 90 ; CHECK-NEXT: cleanup |
91 ; CHECK-NEXT: resume { i8*, i32 } %exn | 91 ; CHECK-NEXT: resume { i8*, i32 } %exn |
92 | 92 |
93 define i32 @lots_of_call_attrs() { | 93 define i32 @lots_of_call_attrs() { |
94 %tmp.0 = insertvalue %struct undef, i32 1, 0 | 94 %tmp.0 = insertvalue %struct undef, i32 1, 0 |
95 %tmp.1 = insertvalue %struct %tmp.0, i32 2, 1 | 95 %tmp.1 = insertvalue %struct %tmp.0, i32 2, 1 |
(...skipping 29 matching lines...) Expand all Loading... |
125 %tmp = extractvalue %rec_returning %str, 0 | 125 %tmp = extractvalue %rec_returning %str, 0 |
126 %ret = call %rec_returning %tmp(%rec_returning %str) | 126 %ret = call %rec_returning %tmp(%rec_returning %str) |
127 ret %rec_returning %ret | 127 ret %rec_returning %ret |
128 } | 128 } |
129 | 129 |
130 ; pair structs | 130 ; pair structs |
131 ; CHECK-LABEL: declare void @pairs(%rec_pair_1* byval) | 131 ; CHECK-LABEL: declare void @pairs(%rec_pair_1* byval) |
132 ; CHECK-LABEL: define void @rec_returning_fun(%rec_returning.simplified* sret %r
etVal, %rec_returning.simplified* byval %str.ptr) | 132 ; CHECK-LABEL: define void @rec_returning_fun(%rec_returning.simplified* sret %r
etVal, %rec_returning.simplified* byval %str.ptr) |
133 ; CHECK-NEXT: %ret = alloca %rec_returning.simplified | 133 ; CHECK-NEXT: %ret = alloca %rec_returning.simplified |
134 ; CHECK-NEXT: %str.sreg.ptr = alloca %rec_returning.simplified | 134 ; CHECK-NEXT: %str.sreg.ptr = alloca %rec_returning.simplified |
135 ; CHECK-NEXT: %str.sreg = load %rec_returning.simplified* %str.ptr | 135 ; CHECK-NEXT: %str.sreg = load %rec_returning.simplified, %rec_returning.simpl
ified* %str.ptr |
136 ; CHECK-NEXT: %tmp = extractvalue %rec_returning.simplified %str.sreg, 0 | 136 ; CHECK-NEXT: %tmp = extractvalue %rec_returning.simplified %str.sreg, 0 |
137 ; CHECK-NEXT: store %rec_returning.simplified %str.sreg, %rec_returning.simpli
fied* %str.sreg.ptr | 137 ; CHECK-NEXT: store %rec_returning.simplified %str.sreg, %rec_returning.simpli
fied* %str.sreg.ptr |
138 ; CHECK-NEXT: call void %tmp(%rec_returning.simplified* sret %ret, %rec_return
ing.simplified* byval %str.sreg.ptr) | 138 ; CHECK-NEXT: call void %tmp(%rec_returning.simplified* sret %ret, %rec_return
ing.simplified* byval %str.sreg.ptr) |
139 ; CHECK-NEXT: %ret.sreg = load %rec_returning.simplified* %ret | 139 ; CHECK-NEXT: %ret.sreg = load %rec_returning.simplified, %rec_returning.simpl
ified* %ret |
140 ; CHECK-NEXT: store %rec_returning.simplified %ret.sreg, %rec_returning.simpli
fied* %retVal | 140 ; CHECK-NEXT: store %rec_returning.simplified %ret.sreg, %rec_returning.simpli
fied* %retVal |
141 ; CHECK-NEXT: ret void | 141 ; CHECK-NEXT: ret void |
142 | 142 |
143 define void @direct_caller(%direct_def %def) { | 143 define void @direct_caller(%direct_def %def) { |
144 %func = extractvalue %direct_def %def, 0 | 144 %func = extractvalue %direct_def %def, 0 |
145 %param = extractvalue %direct_def %def, 1 | 145 %param = extractvalue %direct_def %def, 1 |
146 call void %func(%struct %param) | 146 call void %func(%struct %param) |
147 ret void | 147 ret void |
148 } | 148 } |
149 | 149 |
150 ; CHECK-LABEL: define void @direct_caller(%direct_def.simplified* byval %def.ptr
) | 150 ; CHECK-LABEL: define void @direct_caller(%direct_def.simplified* byval %def.ptr
) |
151 ; CHECK-NEXT: %param.ptr = alloca %struct | 151 ; CHECK-NEXT: %param.ptr = alloca %struct |
152 ; CHECK-NEXT: %def.sreg = load %direct_def.simplified* %def.ptr | 152 ; CHECK-NEXT: %def.sreg = load %direct_def.simplified, %direct_def.simplified*
%def.ptr |
153 ; CHECK-NEXT: %func = extractvalue %direct_def.simplified %def.sreg, 0 | 153 ; CHECK-NEXT: %func = extractvalue %direct_def.simplified %def.sreg, 0 |
154 ; CHECK-NEXT: %param = extractvalue %direct_def.simplified %def.sreg, 1 | 154 ; CHECK-NEXT: %param = extractvalue %direct_def.simplified %def.sreg, 1 |
155 ; CHECK-NEXT: store %struct %param, %struct* %param.ptr | 155 ; CHECK-NEXT: store %struct %param, %struct* %param.ptr |
156 ; CHECK-NEXT: call void %func(%struct* byval %param.ptr) | 156 ; CHECK-NEXT: call void %func(%struct* byval %param.ptr) |
157 ; CHECK-NEXT: ret void | 157 ; CHECK-NEXT: ret void |
158 | 158 |
159 ; vararg functions are converted correctly | 159 ; vararg functions are converted correctly |
160 declare void @vararg_ok(i32, ...) | 160 declare void @vararg_ok(i32, ...) |
161 ; CHECK-LABEL: declare void @vararg_ok(i32, ...) | 161 ; CHECK-LABEL: declare void @vararg_ok(i32, ...) |
162 | 162 |
163 define void @vararg_problem(%rec_problem_struct %arg1, ...) { | 163 define void @vararg_problem(%rec_problem_struct %arg1, ...) { |
164 ; CHECK-LABEL: define void @vararg_problem(%rec_problem_struct.simplified* byv
al %arg1.ptr, ...) | 164 ; CHECK-LABEL: define void @vararg_problem(%rec_problem_struct.simplified* byv
al %arg1.ptr, ...) |
165 ret void | 165 ret void |
166 } | 166 } |
167 | 167 |
168 %vararg_fp_struct = type { i32, void (i32, ...)* } | 168 %vararg_fp_struct = type { i32, void (i32, ...)* } |
169 declare void @vararg_fp_fct(%vararg_fp_struct %arg) | 169 declare void @vararg_fp_fct(%vararg_fp_struct %arg) |
170 ;CHECK-LABEL: declare void @vararg_fp_fct(%vararg_fp_struct* byval) | 170 ;CHECK-LABEL: declare void @vararg_fp_fct(%vararg_fp_struct* byval) |
171 | 171 |
172 define void @call_vararg(%vararg_fp_struct %param1, ...) { | 172 define void @call_vararg(%vararg_fp_struct %param1, ...) { |
173 %fptr = extractvalue %vararg_fp_struct %param1, 1 | 173 %fptr = extractvalue %vararg_fp_struct %param1, 1 |
174 call void (i32, ...)* %fptr(i32 0, i32 1) | 174 call void (i32, ...) %fptr(i32 0, i32 1) |
175 ret void | 175 ret void |
176 } | 176 } |
177 | 177 |
178 ; CHECK-LABEL: define void @call_vararg(%vararg_fp_struct* byval %param1.ptr, ..
.) | 178 ; CHECK-LABEL: define void @call_vararg(%vararg_fp_struct* byval %param1.ptr, ..
.) |
179 ; CHECK-NEXT: %param1.sreg = load %vararg_fp_struct* %param1.ptr | 179 ; CHECK-NEXT: %param1.sreg = load %vararg_fp_struct, %vararg_fp_struct* %param1
.ptr |
180 ; CHECK-NEXT: %fptr = extractvalue %vararg_fp_struct %param1.sreg, 1 | 180 ; CHECK-NEXT: %fptr = extractvalue %vararg_fp_struct %param1.sreg, 1 |
181 ; CHECK-NEXT: call void (i32, ...)* %fptr(i32 0, i32 1) | 181 ; CHECK-NEXT: call void (i32, ...) %fptr(i32 0, i32 1) |
182 ; CHECK-NEXT: ret void | 182 ; CHECK-NEXT: ret void |
183 | 183 |
184 %vararg_fp_problem_struct = type { void(%vararg_fp_problem_struct)* } | 184 %vararg_fp_problem_struct = type { void(%vararg_fp_problem_struct)* } |
185 define void @vararg_fp_problem_call(%vararg_fp_problem_struct* byval %param) { | 185 define void @vararg_fp_problem_call(%vararg_fp_problem_struct* byval %param) { |
186 %fct_ptr = getelementptr %vararg_fp_problem_struct* %param, i32 0, i32 0 | 186 %fct_ptr = getelementptr %vararg_fp_problem_struct, %vararg_fp_problem_struct*
%param, i32 0, i32 0 |
187 %fct = load void(%vararg_fp_problem_struct)** %fct_ptr | 187 %fct = load void(%vararg_fp_problem_struct)*, void(%vararg_fp_problem_struct)*
* %fct_ptr |
188 %param_for_call = load %vararg_fp_problem_struct* %param | 188 %param_for_call = load %vararg_fp_problem_struct, %vararg_fp_problem_struct* %
param |
189 call void %fct(%vararg_fp_problem_struct %param_for_call) | 189 call void %fct(%vararg_fp_problem_struct %param_for_call) |
190 ret void | 190 ret void |
191 } | 191 } |
192 | 192 |
193 ; CHECK-LABEL: define void @vararg_fp_problem_call(%vararg_fp_problem_struct.sim
plified* byval %param) | 193 ; CHECK-LABEL: define void @vararg_fp_problem_call(%vararg_fp_problem_struct.sim
plified* byval %param) |
194 ; CHECK-NEXT: %param_for_call.ptr = alloca %vararg_fp_problem_struct.simplified | 194 ; CHECK-NEXT: %param_for_call.ptr = alloca %vararg_fp_problem_struct.simplified |
195 ; CHECK-NEXT: %fct_ptr = getelementptr %vararg_fp_problem_struct.simplified* %p
aram, i32 0, i32 0 | 195 ; CHECK-NEXT: %fct_ptr = getelementptr %vararg_fp_problem_struct.simplified, %v
ararg_fp_problem_struct.simplified* %param, i32 0, i32 0 |
196 ; CHECK-NEXT: %fct = load void (%vararg_fp_problem_struct.simplified*)** %fct_p
tr | 196 ; CHECK-NEXT: %fct = load void (%vararg_fp_problem_struct.simplified*)*, void (
%vararg_fp_problem_struct.simplified*)** %fct_ptr |
197 ; CHECK-NEXT: %param_for_call = load %vararg_fp_problem_struct.simplified* %par
am | 197 ; CHECK-NEXT: %param_for_call = load %vararg_fp_problem_struct.simplified, %var
arg_fp_problem_struct.simplified* %param |
198 ; CHECK-NEXT: store %vararg_fp_problem_struct.simplified %param_for_call, %vara
rg_fp_problem_struct.simplified* %param_for_call.ptr | 198 ; CHECK-NEXT: store %vararg_fp_problem_struct.simplified %param_for_call, %vara
rg_fp_problem_struct.simplified* %param_for_call.ptr |
199 ; CHECK-NEXT: call void %fct(%vararg_fp_problem_struct.simplified* byval %param
_for_call.ptr) | 199 ; CHECK-NEXT: call void %fct(%vararg_fp_problem_struct.simplified* byval %param
_for_call.ptr) |
200 ; CHECK-NEXT: ret void | 200 ; CHECK-NEXT: ret void |
201 | 201 |
202 define void @call_with_array([4 x void(%struct)*] %fptrs, %struct %str) { | 202 define void @call_with_array([4 x void(%struct)*] %fptrs, %struct %str) { |
203 %fptr = extractvalue [4 x void(%struct)*] %fptrs, 2 | 203 %fptr = extractvalue [4 x void(%struct)*] %fptrs, 2 |
204 call void %fptr(%struct %str) | 204 call void %fptr(%struct %str) |
205 ret void | 205 ret void |
206 } | 206 } |
207 | 207 |
208 ; CHECK-LABEL: define void @call_with_array([4 x void (%struct*)*]* byval %fptrs
.ptr, %struct* byval %str.ptr) | 208 ; CHECK-LABEL: define void @call_with_array([4 x void (%struct*)*]* byval %fptrs
.ptr, %struct* byval %str.ptr) |
209 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct | 209 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct |
210 ; CHECK-NEXT: %fptrs.sreg = load [4 x void (%struct*)*]* %fptrs.ptr | 210 ; CHECK-NEXT: %fptrs.sreg = load [4 x void (%struct*)*], [4 x void (%struct*)*]
* %fptrs.ptr |
211 ; CHECK-NEXT: %str.sreg = load %struct* %str.ptr | 211 ; CHECK-NEXT: %str.sreg = load %struct, %struct* %str.ptr |
212 ; CHECK-NEXT: %fptr = extractvalue [4 x void (%struct*)*] %fptrs.sreg, 2 | 212 ; CHECK-NEXT: %fptr = extractvalue [4 x void (%struct*)*] %fptrs.sreg, 2 |
213 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr | 213 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr |
214 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) | 214 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) |
215 ; CHECK-NEXT: ret void | 215 ; CHECK-NEXT: ret void |
216 | 216 |
217 define void @call_with_array_ptr([4 x void(%struct)*]* %fptrs, %struct %str) { | 217 define void @call_with_array_ptr([4 x void(%struct)*]* %fptrs, %struct %str) { |
218 %fptr_ptr = getelementptr [4 x void(%struct)*]* %fptrs, i32 0, i32 2 | 218 %fptr_ptr = getelementptr [4 x void(%struct)*], [4 x void(%struct)*]* %fptrs,
i32 0, i32 2 |
219 %fptr = load void(%struct)** %fptr_ptr | 219 %fptr = load void(%struct)*, void(%struct)** %fptr_ptr |
220 call void %fptr(%struct %str) | 220 call void %fptr(%struct %str) |
221 ret void | 221 ret void |
222 } | 222 } |
223 | 223 |
224 ; CHECK-LABEL: define void @call_with_array_ptr([4 x void (%struct*)*]* %fptrs,
%struct* byval %str.ptr) | 224 ; CHECK-LABEL: define void @call_with_array_ptr([4 x void (%struct*)*]* %fptrs,
%struct* byval %str.ptr) |
225 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct | 225 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct |
226 ; CHECK-NEXT: %str.sreg = load %struct* %str.ptr | 226 ; CHECK-NEXT: %str.sreg = load %struct, %struct* %str.ptr |
227 ; CHECK-NEXT: %fptr_ptr = getelementptr [4 x void (%struct*)*]* %fptrs, i32 0,
i32 2 | 227 ; CHECK-NEXT: %fptr_ptr = getelementptr [4 x void (%struct*)*], [4 x void (%str
uct*)*]* %fptrs, i32 0, i32 2 |
228 ; CHECK-NEXT: %fptr = load void (%struct*)** %fptr_ptr | 228 ; CHECK-NEXT: %fptr = load void (%struct*)*, void (%struct*)** %fptr_ptr |
229 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr | 229 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr |
230 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) | 230 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) |
231 ; CHECK-NEXT: ret void | 231 ; CHECK-NEXT: ret void |
232 | 232 |
233 define void @call_with_vector(<4 x void (%struct)*> %fptrs, %struct %str) { | 233 define void @call_with_vector(<4 x void (%struct)*> %fptrs, %struct %str) { |
234 %fptr = extractelement <4 x void (%struct)*> %fptrs, i32 2 | 234 %fptr = extractelement <4 x void (%struct)*> %fptrs, i32 2 |
235 call void %fptr(%struct %str) | 235 call void %fptr(%struct %str) |
236 ret void | 236 ret void |
237 } | 237 } |
238 | 238 |
239 ; CHECK-LABEL: define void @call_with_vector(<4 x void (%struct*)*> %fptrs, %str
uct* byval %str.ptr) | 239 ; CHECK-LABEL: define void @call_with_vector(<4 x void (%struct*)*> %fptrs, %str
uct* byval %str.ptr) |
240 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct | 240 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct |
241 ; CHECK-NEXT: %str.sreg = load %struct* %str.ptr | 241 ; CHECK-NEXT: %str.sreg = load %struct, %struct* %str.ptr |
242 ; CHECK-NEXT: %fptr = extractelement <4 x void (%struct*)*> %fptrs, i32 2 | 242 ; CHECK-NEXT: %fptr = extractelement <4 x void (%struct*)*> %fptrs, i32 2 |
243 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr | 243 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr |
244 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) | 244 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) |
245 ; CHECK-NEXT: ret void | 245 ; CHECK-NEXT: ret void |
246 | 246 |
247 define void @call_with_array_vect([4 x <2 x void(%struct)*>] %fptrs, %struct %st
r) { | 247 define void @call_with_array_vect([4 x <2 x void(%struct)*>] %fptrs, %struct %st
r) { |
248 %vect = extractvalue [4 x <2 x void(%struct)*>] %fptrs, 2 | 248 %vect = extractvalue [4 x <2 x void(%struct)*>] %fptrs, 2 |
249 %fptr = extractelement <2 x void (%struct)*> %vect, i32 1 | 249 %fptr = extractelement <2 x void (%struct)*> %vect, i32 1 |
250 call void %fptr(%struct %str) | 250 call void %fptr(%struct %str) |
251 ret void | 251 ret void |
252 } | 252 } |
253 | 253 |
254 ; CHECK-LABEL: define void @call_with_array_vect([4 x <2 x void (%struct*)*>]* b
yval %fptrs.ptr, %struct* byval %str.ptr) | 254 ; CHECK-LABEL: define void @call_with_array_vect([4 x <2 x void (%struct*)*>]* b
yval %fptrs.ptr, %struct* byval %str.ptr) |
255 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct | 255 ; CHECK-NEXT: %str.sreg.ptr = alloca %struct |
256 ; CHECK-NEXT: %fptrs.sreg = load [4 x <2 x void (%struct*)*>]* %fptrs.ptr | 256 ; CHECK-NEXT: %fptrs.sreg = load [4 x <2 x void (%struct*)*>], [4 x <2 x void (
%struct*)*>]* %fptrs.ptr |
257 ; CHECK-NEXT: %str.sreg = load %struct* %str.ptr | 257 ; CHECK-NEXT: %str.sreg = load %struct, %struct* %str.ptr |
258 ; CHECK-NEXT: %vect = extractvalue [4 x <2 x void (%struct*)*>] %fptrs.sreg, 2 | 258 ; CHECK-NEXT: %vect = extractvalue [4 x <2 x void (%struct*)*>] %fptrs.sreg, 2 |
259 ; CHECK-NEXT: %fptr = extractelement <2 x void (%struct*)*> %vect, i32 1 | 259 ; CHECK-NEXT: %fptr = extractelement <2 x void (%struct*)*> %vect, i32 1 |
260 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr | 260 ; CHECK-NEXT: store %struct %str.sreg, %struct* %str.sreg.ptr |
261 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) | 261 ; CHECK-NEXT: call void %fptr(%struct* byval %str.sreg.ptr) |
262 ; CHECK-NEXT: ret void | 262 ; CHECK-NEXT: ret void |
263 | 263 |
264 ; this is at the end, corresponds to the call marked as readonly | 264 ; this is at the end, corresponds to the call marked as readonly |
265 ; CHECK: attributes #0 = { readonly } | 265 ; CHECK: attributes #0 = { readonly } |
OLD | NEW |