| /* This failed on s390x due to bug in loop.c. |
| loop.c failed to remove a REG_EQUAL note when |
| hoisting an insn from a loop body. */ |
| |
| /* { dg-options "-O3 -fPIC" } */ |
| /* { dg-do run { target fpic } } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| int memcmp(const void *s1, const void *s2, size_t n); |
| |
| typedef struct |
| { |
| char name[30]; |
| int a; |
| } LOCAL; |
| |
| int global = 0; |
| int sy = 1; |
| int subroutine_offset; |
| |
| LOCAL local = { "local", 0 }; |
| LOCAL keywords = { "keywords", 1 }; |
| int local_table = 0; |
| int keywords_table = 0; |
| |
| void __attribute__((noinline)) bar (char *p_buffer) |
| { |
| p_buffer[255] = 1; |
| } |
| |
| int __attribute__((noinline)) foo (char *p_str1) |
| { |
| global = 1; |
| return 1; |
| } |
| |
| int __attribute__((noinline)) loop_next (int *p_table, char *p_table_head) |
| { |
| static int loop_next = 0; |
| |
| if (loop_next == 1) |
| return 1; |
| |
| loop_next = 1; |
| return 0; |
| } |
| |
| int |
| main () |
| { |
| char buffer[256]; |
| int ende = 0; |
| int index; |
| int local_base = 2; |
| |
| keywords.a = 1; |
| for (sy = 0;; sy++) |
| { |
| for (index = 1;;) |
| { |
| bar (buffer); |
| if (buffer[sy] != 0) |
| { |
| ende = 1; |
| break; |
| }; |
| if (foo (buffer)) |
| { |
| keywords.a += index - 1; |
| break; |
| } |
| index++; |
| } |
| if (ende) |
| break; |
| } |
| |
| subroutine_offset = 0; |
| |
| for (;;) |
| { |
| if (loop_next (&keywords_table, (char*)&keywords)) |
| break; |
| |
| if ((!memcmp (keywords.name, "+++", 3))) |
| local_base = 100; |
| else |
| local_base = 0; |
| |
| if ((!memcmp (keywords.name, "+++", 3))) |
| subroutine_offset += local_table; |
| |
| for (;;) |
| { |
| if (loop_next (&local_table, (char*)&local)) |
| break;; |
| if ((local.a == 0)) |
| continue;; |
| foo (local.name); |
| } |
| } |
| return 0; |
| } |