------- Comment #1 from jakub at gcc dot gnu dot org  2010-02-26 12:10 -------
So, the problem seems to be in the equivalencing of VALUEs.  val_resolve does:
1659    /* Map incoming equivalences.  ??? Wouldn't it be nice if
1660     we just started sharing the location lists?  Maybe a
1661     circular list ending at the value itself or some
1662     such.  */
1663    set_variable_part (set, dv_as_value (node->dv),
1664       dv_from_value (val), node->offset,
1665       VAR_INIT_STATUS_INITIALIZED, NULL_RTX, INSERT);
1666    set_variable_part (set, val, node->dv, node->offset,
1667       VAR_INIT_STATUS_INITIALIZED, NULL_RTX, INSERT);
1668  }

VALUE 2:2 is initially equivalenced to VALUE 13:13, so we have:
 (value/s/u:SI 13:13 @0x17167e0/0x1719c10)
    offset 0
      (value/s/u:SI 2:2 @0x17166d8/0x1718ac0)
 (value/s/u:SI 2:2 @0x17166d8/0x1718ac0)
    offset 0
      (value/s/u:SI 13:13 @0x17167e0/0x1719c10)
with cur_loc in the latter 13:13.  Then %ebx is added to the list of locations,
then %eax is added too, then %ebx is removed again.  But cur_loc remains 13:13,
doesn't change, and therefore variable_was_changed is never called on this.

I guess we want to either not record these equivalences into cur_loc at all, or
at least prefer other locations whenever possible.  Not sure how exactly to
recognize them though.  Alex?


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43176

Reply via email to