aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2007-01-24 13:13:45 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2007-01-24 12:13:45 +0000
commitcf227303461b367efbb57f7e4f9425c3f15f1132 (patch)
tree9f6dcc9f0199cf56118ddb5bed8a117a7de8be67
parent024a85aeb6a912811d917f737eaad39140c2fb0c (diff)
downloadgcc-cf227303461b367efbb57f7e4f9425c3f15f1132.zip
gcc-cf227303461b367efbb57f7e4f9425c3f15f1132.tar.gz
gcc-cf227303461b367efbb57f7e4f9425c3f15f1132.tar.bz2
pr23382.c: Avoid DCE from eliminating dead variable.
* gcc.dg/tree-ssa/pr23382.c: Avoid DCE from eliminating dead variable. * tree-ssa-dce.c (eliminate_unnecesary_stmts): Remove dead LHS of calls. From-SVN: r121108
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr23382.c3
-rw-r--r--gcc/tree-ssa-dce.c27
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);
}
}