| |
| /* The testcase failed due to corrupted alias information. |
| During the crossjump analyzing step the mem alias info of the |
| st instructions are merged and get copied during basic block |
| reordering which leads to an insn with wrong alias info. |
| The scheduler afterwards exchanges the mvc and st instructions |
| not recognizing the anti dependence. */ |
| /* { dg-do run { target s390-*-* } } */ |
| /* { dg-options "-O3 -mtune=z990 -fno-inline" } */ |
| |
| extern void exit (int); |
| extern void abort (void); |
| |
| int f; |
| int g; |
| int h; |
| |
| int* x = &f; |
| int* p1 = &g; |
| int* p2 = &h; |
| |
| int |
| foo(void) |
| { |
| |
| if (*x == 0) |
| { |
| x = p1; /* mvc - memory to memory */ |
| p1 = (int*)0; /* st - register to memory */ |
| return 1; |
| } |
| if (*x == 5) |
| { |
| f = 1; |
| g = 2; |
| |
| p2 = (int*)0; /* st */ |
| return 1; |
| } |
| } |
| |
| int |
| main (int argc, char** argv) |
| { |
| foo (); |
| |
| /* If the scheduler has exchanged the mvc and st instructions, |
| x is 0. The expected result is &g. */ |
| if (x == &g) |
| exit (0); |
| else |
| abort (); |
| } |