| /* { dg-do compile } */ |
| /* { dg-options "-O1 -fdump-tree-dom2" } */ |
| |
| struct rtx_def; |
| typedef struct rtx_def *rtx; |
| |
| |
| |
| union rtunion_def |
| { |
| int rtint; |
| }; |
| typedef union rtunion_def rtunion; |
| |
| |
| |
| struct rtx_def |
| { |
| rtunion fld[1]; |
| |
| }; |
| |
| static int *uid_cuid; |
| static int max_uid_cuid; |
| int insn_cuid (rtx); |
| |
| rtx |
| bar (rtx r) |
| { |
| rtx place = r; |
| |
| if (place->fld[0].rtint <= max_uid_cuid |
| && (place->fld[0].rtint > max_uid_cuid ? insn_cuid (place) : |
| uid_cuid[place->fld[0].rtint])) |
| return r; |
| |
| return 0; |
| } |
| |
| /* There should be two IF conditionals. One tests <= max_uid_cuid, the |
| other tets the value in uid_cuid. If either is false the jumps |
| are threaded to the return 0. Which in turn means the path |
| which combines the result of those two tests into a new test |
| must always be true and it is optimized appropriately. */ |
| /* { dg-final { scan-tree-dump-times "if " 2 "dom2"} } */ |