1  /* PR rtl-optimization/16968 */
       2  /* Testcase by Jakub Jelinek  <jakub@redhat.com> */
       3  
       4  struct T
       5  {
       6    unsigned int b, c, *d;
       7    unsigned char e;
       8  };
       9  struct S
      10  {
      11    unsigned int a;
      12    struct T f;
      13  };
      14  struct U
      15  {
      16    struct S g, h;
      17  };
      18  struct V
      19  {
      20    unsigned int i;
      21    struct U j;
      22  };
      23  
      24  extern void exit (int);
      25  extern void abort (void);
      26  
      27  void *
      28  dummy1 (void *x)
      29  {
      30    return "";
      31  }
      32  
      33  void *
      34  dummy2 (void *x, void *y)
      35  {
      36    exit (0);
      37  }
      38  
      39  struct V *
      40  baz (unsigned int x)
      41  {
      42    static struct V v;
      43    __builtin_memset (&v, 0x55, sizeof (v));
      44    return &v;
      45  }
      46  
      47  int
      48  check (void *x, struct S *y)
      49  {
      50    if (y->a || y->f.b || y->f.c || y->f.d || y->f.e)
      51      abort ();
      52    return 1;
      53  }
      54  
      55  static struct V *
      56  bar (unsigned int x, void *y)
      57  {
      58    const struct T t = { 0, 0, (void *) 0, 0 };
      59    struct V *u;
      60    void *v;
      61    v = dummy1 (y);
      62    if (!v)
      63      return (void *) 0;
      64  
      65    u = baz (sizeof (struct V));
      66    u->i = x;
      67    u->j.g.a = 0;
      68    u->j.g.f = t;
      69    u->j.h.a = 0;
      70    u->j.h.f = t;
      71  
      72    if (!check (v, &u->j.g) || !check (v, &u->j.h))
      73      return (void *) 0;
      74    return u;
      75  }
      76  
      77  int
      78  foo (unsigned int *x, unsigned int y, void **z)
      79  {
      80    void *v;
      81    unsigned int i, j;
      82  
      83    *z = v = (void *) 0;
      84  
      85    for (i = 0; i < y; i++)
      86      {
      87        struct V *c;
      88  
      89        j = *x;
      90  
      91        switch (j)
      92  	{
      93  	case 1:
      94  	  c = bar (j, x);
      95  	  break;
      96  	default:
      97  	  c = 0;
      98  	  break;
      99  	}
     100        if (c)
     101  	v = dummy2 (v, c);
     102        else
     103          return 1;
     104      }
     105  
     106    *z = v;
     107    return 0;
     108  }
     109  
     110  int
     111  main (void)
     112  {
     113    unsigned int one = 1;
     114    void *p;
     115    foo (&one, 1, &p);
     116    abort ();
     117  }