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



--- Comment #14 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-09-24 
13:14:00 UTC ---

We still want to possibly optimize



extern void abort (void);



union u

{

  int i;

  _Bool b;

};



void f(union u * vp, union u v)

{

  *vp = v;

}



int main()

{

  union u v;

  union u v1;

  union u v2;



  v.i = 0;

  f(&v1, v);



  v.b = 0;

  f(&v2, v);

  if (v2.b != 0)

    abort ();

  return 0;

}



though we might be able to trigger TBAA issues when removing a store

that would merely change the effective type (without changing the

underlying value).  Of course we try hard (on the tree level) to

make DWIM code work, but still ... thus,



 <float> = 1.;

 <int> = 0;

 <float> = 0.;

 ... = <float>;



if we remove the store <float> = 0. as redundant (it stores a value

already there) then further optimizations might re-order the float

and the int store.  We don't perform redundant store elimination here

because 0. and 0 are not operand_equal_p though - but it works for shorts.



extern void abort (void);



union u

{

  int i;

  short f;

} v;



short foo (short *f)

{

  *f = 1;

  v.i = 0;

  v.f = 0;

  return *f;

}



int main()

{

  if (foo (&v.f) != 0)

    abort ();

  return 0;

}



(still doesn't break though).

Reply via email to