| /* { dg-do compile { target i?86-*-* x86_64-*-* } } */ |
| /* { dg-options "-O2 -fdump-rtl-loop2_invariant" } */ |
| /* NOTE: The target list above could be extended to other targets that have |
| conditional moves, but don't have zero registers. */ |
| |
| enum test_type |
| { |
| TYPE0, |
| TYPE1 |
| }; |
| |
| struct type_node |
| { |
| enum test_type type; |
| }; |
| |
| struct test_ref |
| { |
| struct type_node *referring; |
| }; |
| |
| struct test_node |
| { |
| struct test_node *next; |
| }; |
| |
| int iterate (struct test_node *, unsigned, struct test_ref **); |
| |
| int |
| loop_invar (struct test_node *node) |
| { |
| struct test_ref *ref; |
| |
| for (unsigned i = 0; iterate (node, i, &ref); i++) |
| if (loop_invar ((ref->referring && ref->referring->type == TYPE0) |
| ? ((struct test_node *) (ref->referring)) : 0)) |
| return 1; |
| |
| return 0; |
| } |
| |
| /* { dg-final { scan-rtl-dump "Decided to move invariant" "loop2_invariant" } } */ |