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