diff options
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr23382.c | 3 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 27 |
4 files changed, 36 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0f59641..de64b88 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2007-01-24 Jan Hubicka <jh@suse.cz> + + * tree-ssa-dce.c (eliminate_unnecesary_stmts): Remove dead LHS of calls. + 2007-01-24 Andreas Krebbel <krebbel1@de.ibm.com> * c-cppbuiltin.c (builtin_define_type_sizeof): New function. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 65fbbfb..b75e059 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-01-24 Jan Hubicka <jh@suse.cz> + + * gcc.dg/tree-ssa/pr23382.c: Avoid DCE from eliminating dead variable. + 2007-01-24 Andreas Krebbel <krebbel1@de.ibm.com> * gcc.c-torture/compile/sizeof-macros-1.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c b/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c index 89c75cc..bd4b9a0 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c @@ -8,9 +8,10 @@ struct a void *malloc(__SIZE_TYPE__ size) __attribute__((malloc)); -void f(void) +int f(void) { struct a *a = malloc(sizeof(struct a)); + return a.length; } /* { dg-final { scan-tree-dump-times "VDEF <HEAP" 1 "alias1"} } */ /* { dg-final { scan-tree-dump-times "VDEF <HEAP" 1 "alias2"} } */ diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 381d910..3631add 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -688,7 +688,32 @@ eliminate_unnecessary_stmts (void) { tree call = get_call_expr_in (t); if (call) - notice_special_calls (call); + { + tree name; + + /* When LHS of var = call (); is dead, simplify it into + call (); saving one operand. */ + if (TREE_CODE (t) == GIMPLE_MODIFY_STMT + && (TREE_CODE ((name = GIMPLE_STMT_OPERAND (t, 0))) + == SSA_NAME) + && !TEST_BIT (processed, SSA_NAME_VERSION (name))) + { + something_changed = true; + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "Deleting LHS of call: "); + print_generic_stmt (dump_file, t, TDF_SLIM); + fprintf (dump_file, "\n"); + } + push_stmt_changes (bsi_stmt_ptr (i)); + TREE_BLOCK (call) = TREE_BLOCK (t); + bsi_replace (&i, call, false); + maybe_clean_or_replace_eh_stmt (t, call); + mark_symbols_for_renaming (call); + pop_stmt_changes (bsi_stmt_ptr (i)); + } + notice_special_calls (call); + } bsi_next (&i); } } |