| /* PR target/6838 from cato@df.lth.se. |
| cris-elf got an ICE with -O2: the insn matching |
| (insn 49 48 52 (parallel[ |
| (set (mem/s:HI (plus:SI (reg/v/f:SI 0 r0 [24]) |
| (const_int 8 [0x8])) [5 <variable>.c+0 S2 A8]) |
| (reg:HI 2 r2 [27])) |
| (set (reg/f:SI 2 r2 [31]) |
| (plus:SI (reg/v/f:SI 0 r0 [24]) |
| (const_int 8 [0x8]))) |
| ] ) 24 {*mov_sidehi_mem} (nil) |
| (nil)) |
| forced a splitter through the output pattern "#", but there was no |
| matching splitter. */ |
| |
| /* The ptx assembler appears to clobber 'b' inside foo during the f1 call. |
| Reported to nvidia 2016-05-18. */ |
| /* { dg-skip-if "PTX assembler bug" { nvptx-*-* } { "-O0" } { "" } } */ |
| |
| struct xx |
| { |
| int a; |
| struct xx *b; |
| short c; |
| }; |
| |
| int f1 (struct xx *); |
| void f2 (void); |
| |
| int |
| foo (struct xx *p, int b, int c, int d) |
| { |
| int a; |
| |
| for (;;) |
| { |
| a = f1(p); |
| if (a) |
| return (0); |
| if (b) |
| continue; |
| p->c = d; |
| if (p->a) |
| f2 (); |
| if (c) |
| f2 (); |
| d = p->c; |
| switch (a) |
| { |
| case 1: |
| if (p->b) |
| f2 (); |
| if (c) |
| f2 (); |
| default: |
| break; |
| } |
| } |
| return d; |
| } |
| |
| int main (void) |
| { |
| struct xx s = {0, &s, 23}; |
| if (foo (&s, 0, 0, 0) != 0 || s.a != 0 || s.b != &s || s.c != 0) |
| abort (); |
| exit (0); |
| } |
| |
| int |
| f1 (struct xx *p) |
| { |
| static int beenhere = 0; |
| if (beenhere++ > 1) |
| abort (); |
| return beenhere > 1; |
| } |
| |
| void |
| f2 (void) |
| { |
| abort (); |
| } |