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

Reply via email to