Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: test/Transforms/NaCl/simplify-struct-reg-signatures.ll

Issue 1151093004: Changes from 3.7 merge to files not in upstream (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698