------- Comment #6 from rguenth at gcc dot gnu dot org  2010-02-15 14:15 -------
  D.25693._M_bound_args.D.25507.D.25257.D.25050._M_head_impl._M_data =
&counter;
  this.24_34 = (struct Inc *) &D.25693._M_bound_args.D.25507;
  *this.24_34 = __bound_args#0;
  D.29831_51 =
D.25693._M_bound_args.D.25507.D.25257.D.25050._M_head_impl._M_data;

Thus with my patch we no longer CSE the load from _M_data with &counter but
instead load it again because the store to D.25693._M_bound_args.D.25507
aliases it.

Note that appearantly struct Inc D.29754 has zero size (and is packed to
overlap with _M_data), and we expand it like

;; D.29754 = {};

(insn 6 5 0
/abuild/rguenther/trunk-g/x86_64-unknown-linux-gnu/libstdc++-v3/include/functional:1377
(clobber (reg:QI 77 [ D.29754 ])) -1 (nil))

;; __bound_args#0 = D.29754;

(insn 7 6 0
/abuild/rguenther/trunk-g/x86_64-unknown-linux-gnu/libstdc++-v3/include/functional:1377
(set (reg/v:QI 78 [ __bound_args#0 ])
        (reg:QI 77 [ D.29754 ])) -1 (nil))


but the copy and later the indirect store transfers 1 byte of garbage.


-- 


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

Reply via email to