| /* { dg-do compile } */ |
| /* { dg-options "-O2 -fdump-tree-lim-details" } */ |
| |
| extern void abort(); |
| |
| typedef int A; |
| typedef float B; |
| |
| void __attribute__((noinline,noclone)) |
| foo(A * p, B *r, long unk, long oh) |
| { |
| for (long i = 0; i < unk; ++i) { |
| *p = 1; |
| *r = 2; |
| if (oh & i) |
| break; |
| *r = 3; |
| *p = 4; |
| } |
| } |
| |
| int main(void) |
| { |
| union { A x; B f; } u; |
| foo(&u.x, &u.f, 1, 1); |
| if (u.x != 4) abort(); |
| foo(&u.x, &u.f, 2, 1); |
| if (u.f != 2) abort (); |
| return 0; |
| } |
| |
| /* { dg-final { scan-tree-dump "Executing store motion of \\*p" "lim2" } } */ |
| /* { dg-final { scan-tree-dump "Executing store motion of \\*r" "lim2" } } */ |