@@ -342,70 +342,75 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
342
342
343
343
// Flag to output the error only once per operand
344
344
let mut skip = false ;
345
- reg. overlapping_regs ( |r| {
346
- let mut check = |used_regs : & mut FxHashMap < asm:: InlineAsmReg , usize > ,
347
- input| {
348
- match used_regs. entry ( r) {
349
- Entry :: Occupied ( o) => {
350
- if skip {
351
- return ;
352
- }
353
- skip = true ;
354
-
355
- let idx2 = * o. get ( ) ;
356
- let ( ref op2, op_sp2) = operands[ idx2] ;
357
345
358
- let in_out = match ( op, op2) {
359
- (
360
- hir:: InlineAsmOperand :: In { .. } ,
361
- hir:: InlineAsmOperand :: Out { late, .. } ,
362
- )
363
- | (
364
- hir:: InlineAsmOperand :: Out { late, .. } ,
365
- hir:: InlineAsmOperand :: In { .. } ,
366
- ) => {
367
- assert ! ( !* late) ;
368
- let out_op_sp = if input { op_sp2 } else { op_sp } ;
369
- Some ( out_op_sp)
370
- }
371
- _ => None ,
372
- } ;
346
+ let mut check = |used_regs : & mut FxHashMap < asm:: InlineAsmReg , usize > ,
347
+ input,
348
+ r : asm:: InlineAsmReg | {
349
+ match used_regs. entry ( r) {
350
+ Entry :: Occupied ( o) => {
351
+ if skip {
352
+ return ;
353
+ }
354
+ skip = true ;
373
355
374
- let reg_str = |idx| -> & str {
375
- // HIR asm doesn't preserve the original alias string of the explicit register,
376
- // so we have to retrieve it from AST
377
- let ( op, _) : & ( InlineAsmOperand , Span ) = & asm. operands [ idx] ;
378
- if let Some ( ast:: InlineAsmRegOrRegClass :: Reg ( reg_sym) ) =
379
- op. reg ( )
380
- {
381
- reg_sym. as_str ( )
382
- } else {
383
- unreachable ! ( ) ;
384
- }
385
- } ;
356
+ let idx2 = * o. get ( ) ;
357
+ let ( ref op2, op_sp2) = operands[ idx2] ;
386
358
387
- sess. emit_err ( RegisterConflict {
388
- op_span1 : op_sp,
389
- op_span2 : op_sp2,
390
- reg1_name : reg_str ( idx) ,
391
- reg2_name : reg_str ( idx2) ,
392
- in_out,
393
- } ) ;
394
- }
395
- Entry :: Vacant ( v) => {
396
- if r == reg {
397
- v. insert ( idx) ;
359
+ let in_out = match ( op, op2) {
360
+ (
361
+ hir:: InlineAsmOperand :: In { .. } ,
362
+ hir:: InlineAsmOperand :: Out { late, .. } ,
363
+ )
364
+ | (
365
+ hir:: InlineAsmOperand :: Out { late, .. } ,
366
+ hir:: InlineAsmOperand :: In { .. } ,
367
+ ) => {
368
+ assert ! ( !* late) ;
369
+ let out_op_sp = if input { op_sp2 } else { op_sp } ;
370
+ Some ( out_op_sp)
371
+ }
372
+ _ => None ,
373
+ } ;
374
+ let reg_str = |idx| -> & str {
375
+ // HIR asm doesn't preserve the original alias string of the explicit register,
376
+ // so we have to retrieve it from AST
377
+ let ( op, _) : & ( InlineAsmOperand , Span ) = & asm. operands [ idx] ;
378
+ if let Some ( ast:: InlineAsmRegOrRegClass :: Reg ( reg_sym) ) =
379
+ op. reg ( )
380
+ {
381
+ reg_sym. as_str ( )
382
+ } else {
383
+ unreachable ! ( ) ;
398
384
}
385
+ } ;
386
+
387
+ sess. emit_err ( RegisterConflict {
388
+ op_span1 : op_sp,
389
+ op_span2 : op_sp2,
390
+ reg1_name : reg_str ( idx) ,
391
+ reg2_name : reg_str ( idx2) ,
392
+ in_out,
393
+ } ) ;
394
+ }
395
+ Entry :: Vacant ( v) => {
396
+ if r == reg {
397
+ v. insert ( idx) ;
399
398
}
400
399
}
401
- } ;
400
+ }
401
+ } ;
402
+ let mut overlapping_with = vec ! [ ] ;
403
+ reg. overlapping_regs ( |r| {
404
+ overlapping_with. push ( r) ;
405
+ } ) ;
406
+ for r in overlapping_with {
402
407
if input {
403
- check ( & mut used_input_regs, true ) ;
408
+ check ( & mut used_input_regs, true , r ) ;
404
409
}
405
410
if output {
406
- check ( & mut used_output_regs, false ) ;
411
+ check ( & mut used_output_regs, false , r ) ;
407
412
}
408
- } ) ;
413
+ }
409
414
}
410
415
}
411
416
}
@@ -420,12 +425,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
420
425
continue ;
421
426
}
422
427
423
- let mut output_used = false ;
428
+ let mut overlapping_with = vec ! [ ] ;
424
429
clobber. overlapping_regs ( |reg| {
425
- if used_output_regs. contains_key ( & reg) {
426
- output_used = true ;
427
- }
430
+ overlapping_with. push ( reg) ;
428
431
} ) ;
432
+ let output_used =
433
+ overlapping_with. iter ( ) . any ( |reg| used_output_regs. contains_key ( & reg) ) ;
429
434
430
435
if !output_used {
431
436
operands. push ( (
0 commit comments