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

     1  /* PR optimization/15296.  The delayed-branch scheduler caused code that
     2     SEGV:d for CRIS; a register was set to -1 in a delay-slot for the
     3     fall-through code, while that register held a pointer used in code at
     4     the branch target.  */
     5  
     6  typedef __INTPTR_TYPE__ intptr_t;
     7  typedef intptr_t W;
     8  union u0
     9  {
    10    union u0 *r;
    11    W i;
    12  };
    13  struct s1
    14  {
    15    union u0 **m0;
    16    union u0 m1[4];
    17  };
    18  
    19  void f (void *, struct s1 *, const union u0 *, W, W, W)
    20       __attribute__ ((__noinline__));
    21  void g (void *, char *) __attribute__ ((__noinline__));
    22  
    23  void
    24  f (void *a, struct s1 *b, const union u0 *h, W v0, W v1, W v4)
    25  {
    26    union u0 *e = 0;
    27    union u0 *k = 0;
    28    union u0 **v5 = b->m0;
    29    union u0 *c = b->m1;
    30    union u0 **d = &v5[0];
    31  l0:;
    32    if (v0 < v1)
    33      goto l0;
    34    if (v0 == 0)
    35      goto l3;
    36    v0 = v4;
    37    if (v0 != 0)
    38      goto l3;
    39    c[0].r = *d;
    40    v1 = -1;
    41    e = c[0].r;
    42    if (e != 0)
    43      g (a, "");
    44    k = e + 3;
    45    k->i = v1;
    46    goto l4;
    47  l3:;
    48    c[0].i = v0;
    49    e = c[1].r;
    50    if (e != 0)
    51      g (a, "");
    52    e = c[0].r;
    53    if (e == 0)
    54      g (a, "");
    55    k = e + 2;
    56    k->r = c[1].r;
    57  l4:;
    58  }
    59  
    60  void g (void *a, char *b) { abort (); }
    61  
    62  int
    63  main ()
    64  {
    65    union u0 uv[] = {{ .i = 111 }, { .i = 222 }, { .i = 333 }, { .i = 444 }};
    66    struct s1 s = { 0, {{ .i = 555 }, { .i = 0 }, { .i = 999 }, { .i = 777 }}};
    67    f (0, &s, 0, 20000, 10000, (W) uv);
    68    if (s.m1[0].i != (W) uv || s.m1[1].i != 0 || s.m1[2].i != 999
    69        || s.m1[3].i != 777 || uv[0].i != 111 || uv[1].i != 222
    70        || uv[2].i != 0 || uv[3].i != 444)
    71      abort ();
    72    exit (0);
    73  }