| /* This testcase generated invalid assembly on IA-32, |
| since %gs:0 memory load was not exposed to the compiler |
| as memory load and mem to mem moves are not possible |
| on IA-32. */ |
| /* { dg-do link } */ |
| /* { dg-options "-O2 -ftls-model=initial-exec" } */ |
| /* { dg-options "-O2 -ftls-model=initial-exec -march=i686" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ |
| /* { dg-require-effective-target tls } */ |
| |
| __thread int thr; |
| |
| struct A |
| { |
| unsigned int a, b, c, d, e; |
| }; |
| |
| int bar (int x, unsigned long y, void *z) |
| { |
| return 0; |
| } |
| |
| int |
| foo (int x, int y, const struct A *z) |
| { |
| struct A b; |
| int d; |
| |
| b = *z; |
| d = bar (x, y, &b); |
| if (d == 0 && y == 0x5402) |
| { |
| int e = thr; |
| d = bar (x, 0x5401, &b); |
| if (d) |
| { |
| thr = e; |
| d = 0; |
| } |
| else if ((z->c & 0600) != (b.c & 0600) |
| || ((z->c & 060) && ((z->c & 060) != (b.c & 060)))) |
| { |
| thr = 22; |
| d = -1; |
| } |
| } |
| |
| return d; |
| } |
| |
| int main (void) |
| { |
| foo (1, 2, 0); |
| return 0; |
| } |