------- Comment #72 from rguenth at gcc dot gnu dot org 2007-05-16 14:49
-------
inline void* operator new(unsigned long, void* __p) throw() { return __p; }
extern void bar();
float foo(double *p)
{
long *l = (long *)p;
*l = 1;
float *f = new (p) float;
*f = 0.0;
bar ();
return *f;
}
with -O2 I see
<bb 2>:
l_2 = (long int *) p_1(D);
# SMT.4_12 = VDEF <SMT.4_11(D)>
*l_2 = 1;
<<<change_dynamic_type (float *) p_1(D))>>>
__p_8 = p_1(D);
f_5 = (float *) __p_8;
# SMT.5_14 = VDEF <SMT.5_13(D)>
*f_5 = 0.0;
# SMT.4_15 = VDEF <SMT.4_12>
# SMT.5_16 = VDEF <SMT.5_14>
bar ();
# VUSE <SMT.5_16>
D.2462_6 = *f_5;
return D.2462_6;
which looks wrong - the store to f_5 needs to alias *l_2?
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29286