| /* PR optimization/15296. The delayed-branch scheduler caused code that |
| SEGV:d for CRIS; a register was set to -1 in a delay-slot for the |
| fall-through code, while that register held a pointer used in code at |
| the branch target. */ |
| |
| typedef __INTPTR_TYPE__ intptr_t; |
| typedef intptr_t W; |
| union u0 |
| { |
| union u0 *r; |
| W i; |
| }; |
| struct s1 |
| { |
| union u0 **m0; |
| union u0 m1[4]; |
| }; |
| |
| void f (void *, struct s1 *, const union u0 *, W, W, W) |
| __attribute__ ((__noinline__)); |
| void g (void *, char *) __attribute__ ((__noinline__)); |
| |
| void |
| f (void *a, struct s1 *b, const union u0 *h, W v0, W v1, W v4) |
| { |
| union u0 *e = 0; |
| union u0 *k = 0; |
| union u0 **v5 = b->m0; |
| union u0 *c = b->m1; |
| union u0 **d = &v5[0]; |
| l0:; |
| if (v0 < v1) |
| goto l0; |
| if (v0 == 0) |
| goto l3; |
| v0 = v4; |
| if (v0 != 0) |
| goto l3; |
| c[0].r = *d; |
| v1 = -1; |
| e = c[0].r; |
| if (e != 0) |
| g (a, ""); |
| k = e + 3; |
| k->i = v1; |
| goto l4; |
| l3:; |
| c[0].i = v0; |
| e = c[1].r; |
| if (e != 0) |
| g (a, ""); |
| e = c[0].r; |
| if (e == 0) |
| g (a, ""); |
| k = e + 2; |
| k->r = c[1].r; |
| l4:; |
| } |
| |
| void g (void *a, char *b) { abort (); } |
| |
| int |
| main () |
| { |
| union u0 uv[] = {{ .i = 111 }, { .i = 222 }, { .i = 333 }, { .i = 444 }}; |
| struct s1 s = { 0, {{ .i = 555 }, { .i = 0 }, { .i = 999 }, { .i = 777 }}}; |
| f (0, &s, 0, 20000, 10000, (W) uv); |
| if (s.m1[0].i != (W) uv || s.m1[1].i != 0 || s.m1[2].i != 999 |
| || s.m1[3].i != 777 || uv[0].i != 111 || uv[1].i != 222 |
| || uv[2].i != 0 || uv[3].i != 444) |
| abort (); |
| exit (0); |
| } |