| /* { dg-do compile } */ |
| /* { dg-options "-O1 -fdump-tree-dom3" } */ |
| |
| extern void abort (void); |
| union tree_node; |
| typedef union tree_node *tree; |
| struct tree_vec |
| { |
| int length; |
| tree a[1]; |
| }; |
| struct tree_type |
| { |
| tree binfo; |
| }; |
| union tree_node |
| { |
| struct tree_type type; |
| struct tree_vec vec; |
| }; |
| void |
| record_component_aliases (type) |
| tree type; |
| { |
| if (type->type.binfo->vec.length) |
| abort (); |
| for (; (( |
| { |
| const tree __z = type->type.binfo; |
| if (type->type.binfo->vec.length) |
| abort (); |
| type->type.binfo->vec.a[4];} |
| )->vec.length);) |
| { |
| if (4 >= type->type.binfo->vec.length) |
| abort (); |
| blah (); |
| } |
| } |
| |
| /* The call to blah should have been eliminated. If the call is not |
| eliminated, then dominator optimizations failed and it'll be |
| impossible to delete other unnecessary code. */ |
| /* { dg-final { scan-tree-dump-not "blah \\(\\)" "dom3" } } */ |
| |
| /* There should be two IF conditionals. */ |
| /* { dg-final { scan-tree-dump-times "if " 2 "dom3"} } */ |
| |
| /* There should be a single load of type.binfo. */ |
| /* { dg-final { scan-tree-dump-times "type\\.binfo" 1 "dom3"} } */ |
| |
| /* There should be two loads of vec.length. */ |
| /* { dg-final { scan-tree-dump-times "vec.length" 2 "dom3"} } */ |
| |