| /* { dg-do compile } */ |
| /* { dg-options "-O1 -fdump-tree-dom3" } */ |
| /* LLVM LOCAL test not applicable */ |
| /* { dg-require-fdump "" } */ |
| |
| extern void abort (void); |
| |
| struct rtx_def; |
| typedef struct rtx_def *rtx; |
| struct rtvec_def; |
| typedef struct rtvec_def *rtvec; |
| union tree_node; |
| typedef union tree_node *tree; |
| struct rtx_def |
| { |
| int code; |
| int mode; |
| unsigned int in_struct:1; |
| }; |
| struct tree_common |
| { |
| int code; |
| }; |
| struct tree_decl |
| { |
| rtx rtl; |
| }; |
| union tree_node |
| { |
| struct tree_common common; |
| struct tree_decl decl; |
| }; |
| rtx |
| store_expr (exp, target, want_value) |
| tree exp; |
| rtx target; |
| int want_value; |
| { |
| if (exp->common.code == 42) |
| abort (); |
| else if (queued_subexp_p (target)) |
| { |
| blah (target->mode); |
| if (target->code) |
| abort (); |
| } |
| else |
| { |
| if (target->code && (__extension__({target;})->in_struct)); |
| } |
| |
| if ((target != (exp->decl.rtl |
| ? (exp->decl.rtl |
| ? exp->decl.rtl |
| : (make_decl_rtl (exp, 0), exp->decl.rtl)) |
| : 0)) |
| && expr_size (exp)) |
| ; |
| } |
| |
| /* All paths to the test "target != 0" occuring in the final IF statement |
| dereference target. Thus target can not have the value zero at that |
| point and the test should have been eliminated. */ |
| /* ??? The dominator walker (A) doesn't merge this data at joins and |
| (B) only looks at immediate dominators, and only queued_subexp_p |
| immediately dominates the comparison in question. We need something |
| stronger. */ |
| /* { dg-final { scan-tree-dump-times "target.*!= 0" 0 "dom3" { xfail *-*-* } } } */ |
| /* { dg-final { cleanup-tree-dump "dom3" } } */ |