1  /* PR tree-optimization/51877 */
       2  
       3  extern void abort (void);
       4  struct A { int a; char b[32]; } a, b;
       5  
       6  __attribute__((noinline, noclone))
       7  struct A
       8  bar (int x)
       9  {
      10    struct A r;
      11    static int n;
      12    r.a = ++n;
      13    __builtin_memset (r.b, 0, sizeof (r.b));
      14    r.b[0] = x;
      15    return r;
      16  }
      17  
      18  __attribute__((noinline, noclone))
      19  void
      20  baz (void)
      21  {
      22    asm volatile ("" : : : "memory");
      23  }
      24  
      25  __attribute__((noinline, noclone))
      26  void
      27  foo (struct A *x, int y)
      28  {
      29    if (y == 6)
      30      a = bar (7);
      31    else
      32      *x = bar (7);
      33    baz ();
      34  }
      35  
      36  int
      37  main ()
      38  {
      39    a = bar (3);
      40    b = bar (4);
      41    if (a.a != 1 || a.b[0] != 3 || b.a != 2 || b.b[0] != 4)
      42      abort ();
      43    foo (&b, 0);
      44    if (a.a != 1 || a.b[0] != 3 || b.a != 3 || b.b[0] != 7)
      45      abort ();
      46    foo (&b, 6);
      47    if (a.a != 4 || a.b[0] != 7 || b.a != 3 || b.b[0] != 7)
      48      abort ();
      49    return 0;
      50  }