| /* We have encountered an issue that a "mov_s.ne" instruction * |
| * with an immediate value was put in the delay slot of a * |
| * branch: * |
| * * |
| * bne.d @.L1 # 33 [c=20 l=4] *branch_insn * |
| * mov_s.ne r0,7 # 35 [c=0 l=6] *movsi_ne/2 * |
| * * |
| * This is not sanctioned and must not happen. The test below * |
| * is a reduced version of the source code leading to the * |
| * problem. */ |
| |
| /* { dg-do compile } */ |
| /* { dg-skip-if "" { ! { clmcpu } } } */ |
| /* { dg-options "-mcpu=archs -Og" } */ |
| typedef struct |
| { |
| struct |
| { |
| int length; |
| } table; |
| } room; |
| |
| struct house |
| { |
| room *r; |
| }; |
| |
| int glob; |
| |
| _Bool bar(); |
| |
| int func(struct house *h, int i, int whatever) |
| { |
| for (;;) |
| { |
| _Bool a; |
| if (h && h->r[i].table.length == glob) |
| { |
| if (whatever) |
| { |
| a = bar(); |
| if (__builtin_expect(!a, 0)) |
| return 7; |
| } |
| break; |
| } |
| } |
| return 0; |
| } |
| |
| /* no 'mov_s.ne r,limm' in a delay slot */ |
| /* { dg-final { scan-assembler-not "bne.d\.*\n\\s\+mov_s.ne\\s+r\[0-9\]+,7" } } */ |