------- Comment #6 from hjl at lucon dot org 2006-08-11 18:40 ------- The loop in vt_find_locations starts with
Basic block 22: IN: Stack adjustment: 80 Reg 8: __ret+0 Reg 15: this+0 this+0 Reg 32: __ret+0 Reg 33: __ret+0 Reg 35: __c+0 Reg 112: this+0 Reg 113: __ret+0 Reg 114: __ret+0 Reg 115: __ret+0 Reg 117: __io+0 Reg 118: __err+0 Reg 119: __xtrc+0 Variables: name: __xtrc offset 0 (reg:DI 119 r39 [ __xtrc ]) name: __ret offset 0 (reg/v:SI 113 r33 [orig:342 __ret.739 ] [342]) (reg/v:SI 8 r8 [orig:363 __ret ] [363]) name: __ret offset 0 (reg/v:SI 33 r41 [orig:355 __ret ] [355]) name: __ret offset 0 (reg/v:SI 115 r35 [orig:339 __ret.742 ] [339]) name: __c offset 0 (reg/v:SI 35 r43 [orig:380 __c ] [380]) name: this offset 0 (reg:DI 15 r15 [orig:371 this ] [371]) name: __ret offset 0 (reg/v:SI 114 r34 [orig:341 __ret.740 ] [341]) name: __ret offset 0 (reg/v:SI 32 r40 [orig:343 __ret.738 ] [343]) name: this offset 0 (reg:DI 112 r32 [ this ]) name: this offset 0 (reg:DI 15 r15 [orig:361 this ] [361]) name: __io offset 0 (reg:DI 117 r37 [ __io ]) name: __err offset 0 (reg:DI 118 r38 [ __err ]) After recomputing the input: Basic block 22: IN: Stack adjustment: 80 Reg 15: this+0 this+0 Reg 32: __ret+0 Reg 33: __ret+0 Reg 35: __c+0 Reg 112: this+0 Reg 113: __ret+0 Reg 114: __ret+0 Reg 115: __ret+0 Reg 117: __io+0 Reg 118: __err+0 Reg 119: __xtrc+0 Variables: name: __xtrc offset 0 (reg:DI 119 r39 [ __xtrc ]) name: __ret offset 0 (reg/v:SI 113 r33 [orig:342 __ret.739 ] [342]) name: __ret offset 0 (reg/v:SI 33 r41 [orig:355 __ret ] [355]) name: __ret offset 0 (reg/v:SI 115 r35 [orig:339 __ret.742 ] [339]) name: __c offset 0 (reg/v:SI 35 r43 [orig:380 __c ] [380]) name: this offset 0 (reg:DI 15 r15 [orig:371 this ] [371]) name: __ret offset 0 (reg/v:SI 114 r34 [orig:341 __ret.740 ] [341]) name: __ret offset 0 (reg/v:SI 32 r40 [orig:343 __ret.738 ] [343]) name: this offset 0 (reg:DI 112 r32 [ this ]) name: this offset 0 (reg:DI 15 r15 [orig:361 this ] [361]) name: __io offset 0 (reg:DI 117 r37 [ __io ]) name: __err offset 0 (reg:DI 118 r38 [ __err ]) (reg/v:SI 8 r8 [orig:363 __ret ] [363]) is gone. But it is put back later. It goes into a infinite loop. The instruction in question is (insn 1138 1137 1233 73 x.cc:23406 (cond_exec (eq (reg:BI 262 p6 [489]) (const_int 0 [0x0])) (set (reg/v:SI 113 r33 [orig:342 __ret.739 ] [342]) (reg/v:SI 8 r8 [orig:363 __ret ] [363]))) 781 {sync_lock_releasedi+4} (nil) (expr_list:REG_DEAD (reg/v:SI 8 r8 [orig:363 __ret ] [363]) (expr_list:REG_DEAD (reg:BI 262 p6 [489]) (nil)))) Is this really a MO_COPY since r8 is dead after it. I tried --- var-tracking.c.debug 2006-08-09 19:53:01.000000000 -0700 +++ var-tracking.c 2006-08-11 11:22:03.000000000 -0700 @@ -1671,6 +1671,9 @@ add_stores (rtx loc, rtx expr, void *ins mo->type = MO_CLOBBER; else if (GET_CODE (expr) == SET && SET_DEST (expr) == loc + && (! REG_P (SET_SRC (expr)) + || ! find_regno_note ((rtx) insn, REG_DEAD, + REGNO (SET_SRC (expr)))) && same_variable_part_p (SET_SRC (expr), REG_EXPR (loc), REG_OFFSET (loc))) It seems to work for libstdc++-v3/src/wlocale-inst.cc. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28672