1/* { dg-do compile } */ 2/* { dg-options "-O1 -fdump-tree-dom2" } */ 3 4extern void abort (void); 5union tree_node; 6typedef union tree_node *tree; 7struct tree_vec 8{ 9 int length; 10 tree a[1]; 11}; 12struct tree_type 13{ 14 tree binfo; 15}; 16union tree_node 17{ 18 struct tree_type type; 19 struct tree_vec vec; 20}; 21void 22record_component_aliases (type) 23 tree type; 24{ 25 if (type->type.binfo->vec.length) 26 abort (); 27 for (; (( 28 { 29 const tree __z = type->type.binfo; 30 if (type->type.binfo->vec.length) 31 abort (); 32 type->type.binfo->vec.a[4];} 33 )->vec.length);) 34 { 35 if (4 >= type->type.binfo->vec.length) 36 abort (); 37 blah (); 38 } 39} 40 41/* The call to blah should have been eliminated. If the call is not 42 eliminated, then dominator optimizations failed and it'll be 43 impossible to delete other unnecessary code. */ 44/* { dg-final { scan-tree-dump-not "blah \\(\\)" "dom2" } } */ 45 46/* There should be two IF conditionals. */ 47/* { dg-final { scan-tree-dump-times "if " 2 "dom2"} } */ 48 49/* There should be a single load of type.binfo. */ 50/* { dg-final { scan-tree-dump-times "type\\.binfo" 1 "dom2"} } */ 51 52/* There should be two loads of vec.length. */ 53/* { dg-final { scan-tree-dump-times "vec.length" 2 "dom2"} } */ 54 55/* { dg-final { cleanup-tree-dump "dom2" } } */ 56