pr23382.c: Avoid DCE from eliminating dead variable.
authorJan Hubicka <jh@suse.cz>
Wed, 24 Jan 2007 12:13:45 +0000 (13:13 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 24 Jan 2007 12:13:45 +0000 (12:13 +0000)
* 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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr23382.c
gcc/tree-ssa-dce.c

index 0f5964196cef0741497c17c7253299dbab2b77c7..de64b881792a1d8755e45d3e89277f95afb5855f 100644 (file)
@@ -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.
index 65fbbfb829570eb9717b156e34c7a2de0e266e2d..b75e059166309cc0655d6372457c1a3983f1fcb0 100644 (file)
@@ -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.
index 89c75cc0147402bf6deecf7bf213e3628bffe1b1..bd4b9a0ac947cf9436367b756ba73cb1a6ec8325 100644 (file)
@@ -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"} } */
index 381d91016e05263a4848b49b16e05c1fdb7253ce..3631add456f7b9e6f29644b71a3dee7882bdf998 100644 (file)
@@ -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);
            }
        }