131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// { dg-do run }
231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// { dg-options "-O2 -fstrict-aliasing" }
331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// Test that we don't let TBAA reorder an assignment across a
531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// placement new.
631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// See PR 29286.
731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehtypedef __SIZE_TYPE__ size_t;
931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehinline void* operator new(size_t, void* __p) throw() { return __p; }
1131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehvoid __attribute__((noinline)) bar() {}
1331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehlong __attribute__((noinline)) foo(double *p, int n)
1531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
1631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  long *f;
1731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  for (int i=0; i<n; ++i)
1831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  {
1931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    int *l = (int *)p;
2031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    *l = 0;
2131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    f = new (p) long;
2231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    *f = -1;
2331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  }
2431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  bar ();
2531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  return *f;
2631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}
2731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
2831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehextern "C" void abort(void);
2931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint main()
3031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
3131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  union {
3231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    int i;
3331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    long l;
3431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  } u;
3531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  if (foo((double *)&u, 1) != -1)
3631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    abort ();
3731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  return 0;
3831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}
39