@@ -182,44 +182,48 @@ pub fn compute_abi_info<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, fty: &mut FnType<'tc
182182 let mut sse_regs = 8 ; // XMM0-7
183183
184184 let mut x86_64_ty = |arg : & mut ArgType < ' tcx > , is_arg : bool | {
185- let cls = classify_arg ( cx, arg) ;
185+ let mut cls_or_mem = classify_arg ( cx, arg) ;
186186
187187 let mut needed_int = 0 ;
188188 let mut needed_sse = 0 ;
189- let in_mem = match cls {
190- Err ( Memory ) => true ,
191- Ok ( ref cls) if is_arg => {
192- for & c in cls {
189+ if is_arg {
190+ if let Ok ( cls) = cls_or_mem {
191+ for & c in & cls {
193192 match c {
194193 Some ( Class :: Int ) => needed_int += 1 ,
195194 Some ( Class :: Sse ) => needed_sse += 1 ,
196195 _ => { }
197196 }
198197 }
199- arg. layout . is_aggregate ( ) &&
200- ( int_regs < needed_int || sse_regs < needed_sse)
198+ if arg. layout . is_aggregate ( ) {
199+ if int_regs < needed_int || sse_regs < needed_sse {
200+ cls_or_mem = Err ( Memory ) ;
201+ }
202+ }
201203 }
202- Ok ( _) => false
203- } ;
204+ }
204205
205- if in_mem {
206- if is_arg {
207- arg. make_indirect_byval ( ) ;
208- } else {
209- // `sret` parameter thus one less integer register available
210- arg. make_indirect ( ) ;
211- int_regs -= 1 ;
206+ match cls_or_mem {
207+ Err ( Memory ) => {
208+ if is_arg {
209+ arg. make_indirect_byval ( ) ;
210+ } else {
211+ // `sret` parameter thus one less integer register available
212+ arg. make_indirect ( ) ;
213+ int_regs -= 1 ;
214+ }
212215 }
213- } else {
214- // split into sized chunks passed individually
215- int_regs -= needed_int;
216- sse_regs -= needed_sse;
217-
218- if arg. layout . is_aggregate ( ) {
219- let size = arg. layout . size ;
220- arg. cast_to ( cast_target ( cls. as_ref ( ) . unwrap ( ) , size) )
221- } else {
222- arg. extend_integer_width_to ( 32 ) ;
216+ Ok ( ref cls) => {
217+ // split into sized chunks passed individually
218+ int_regs -= needed_int;
219+ sse_regs -= needed_sse;
220+
221+ if arg. layout . is_aggregate ( ) {
222+ let size = arg. layout . size ;
223+ arg. cast_to ( cast_target ( cls, size) )
224+ } else {
225+ arg. extend_integer_width_to ( 32 ) ;
226+ }
223227 }
224228 }
225229 } ;
0 commit comments