1 /* { dg-do compile } */ 2 /* { dg-options "-O1 -fdump-tree-dom2" } */ 3 4 struct rtx_def; 5 typedef struct rtx_def *rtx; 6 7 8 9 union rtunion_def 10 { 11 int rtint; 12 }; 13 typedef union rtunion_def rtunion; 14 15 16 17 struct rtx_def 18 { 19 rtunion fld[1]; 20 21 }; 22 23 static int *uid_cuid; 24 static int max_uid_cuid; 25 int insn_cuid (rtx); 26 27 rtx bar(rtx r)28bar (rtx r) 29 { 30 rtx place = r; 31 32 if (place->fld[0].rtint <= max_uid_cuid 33 && (place->fld[0].rtint > max_uid_cuid ? insn_cuid (place) : 34 uid_cuid[place->fld[0].rtint])) 35 return r; 36 37 return 0; 38 } 39 40 /* There should be two IF conditionals. One tests <= max_uid_cuid, the 41 other tets the value in uid_cuid. If either is false the jumps 42 are threaded to the return 0. Which in turn means the path 43 which combines the result of those two tests into a new test 44 must always be true and it is optimized appropriately. */ 45 /* { dg-final { scan-tree-dump-times "if " 2 "dom2"} } */ 46