modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr49390.c (about)

     1  /* PR rtl-optimization/49390 */
     2  
     3  struct S { unsigned int s1; unsigned int s2; };
     4  struct T { unsigned int t1; struct S t2; };
     5  struct U { unsigned short u1; unsigned short u2; };
     6  struct V { struct U v1; struct T v2; };
     7  struct S a;
     8  char *b;
     9  union { char b[64]; struct V v; } u;
    10  volatile int v;
    11  extern void abort (void);
    12  
    13  __attribute__((noinline, noclone)) void
    14  foo (int x, void *y, unsigned int z, unsigned int w)
    15  {
    16    if (x != 4 || y != (void *) &u.v.v2)
    17      abort ();
    18    v = z + w;
    19    v = 16384;
    20  }
    21  
    22  __attribute__((noinline, noclone)) void
    23  bar (struct S x)
    24  {
    25    v = x.s1;
    26    v = x.s2;
    27  }
    28  
    29  __attribute__((noinline, noclone)) int
    30  baz (struct S *x)
    31  {
    32    v = x->s1;
    33    v = x->s2;
    34    v = 0;
    35    return v + 1;
    36  }
    37  
    38  __attribute__((noinline, noclone)) void
    39  test (struct S *c)
    40  {
    41    struct T *d;
    42    struct S e = a;
    43    unsigned int f, g;
    44    if (c == 0)
    45      c = &e;
    46    else
    47      {
    48        if (c->s2 % 8192 <= 15 || (8192 - c->s2 % 8192) <= 31)
    49  	foo (1, 0, c->s1, c->s2);
    50      }
    51    if (!baz (c))
    52      return;
    53    g = (((struct U *) b)->u2 & 2) ? 32 : __builtin_offsetof (struct V, v2);
    54    f = c->s2 % 8192;
    55    if (f == 0)
    56      {
    57        e.s2 += g;
    58        f = g;
    59      }
    60    else if (f < g)
    61      {
    62        foo (2, 0, c->s1, c->s2);
    63        return;
    64      }
    65    if ((((struct U *) b)->u2 & 1) && f == g)
    66      {
    67        bar (*c);
    68        foo (3, 0, c->s1, c->s2);
    69        return;
    70      }
    71    d = (struct T *) (b + c->s2 % 8192);
    72    if (d->t2.s1 >= c->s1 && (d->t2.s1 != c->s1 || d->t2.s2 >= c->s2))
    73      foo (4, d, c->s1, c->s2);
    74    return;
    75  }
    76  
    77  int
    78  main ()
    79  {
    80    struct S *c = 0;
    81    asm ("" : "+r" (c) : "r" (&a));
    82    u.v.v2.t2.s1 = 8192;
    83    b = u.b;
    84    test (c);
    85    if (v != 16384)
    86      abort ();
    87    return 0;
    88  }