------- 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

Reply via email to