OSDN Git Service

2012-01-03 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jan 2012 11:54:53 +0000 (11:54 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jan 2012 11:54:53 +0000 (11:54 +0000)
PR tree-optimization/51692
* tree-ssa-dce.c (eliminate_unnecessary_stmts): Do not remove
the LHS of allocation stmts.

* gcc.dg/torture/pr51692.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182838 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr51692.c [new file with mode: 0644]
gcc/tree-ssa-dce.c

index dd3c6d7..77e96a3 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-03  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/51692
+       * tree-ssa-dce.c (eliminate_unnecessary_stmts): Do not remove
+       the LHS of allocation stmts.
+
 2012-01-03  Olivier Hainque  <hainque@adacore.com>
 
        * system.h: Prior to #define, #undef fopen and freopen unconditionally.
index 6185d58..195630c 100644 (file)
@@ -1,5 +1,10 @@
 2012-01-03  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/51692
+       * gcc.dg/torture/pr51692.c: New testcase.
+
+2012-01-03  Richard Guenther  <rguenther@suse.de>
+
        PR debug/51650
        * g++.dg/lto/pr51650-3_0.C: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr51692.c b/gcc/testsuite/gcc.dg/torture/pr51692.c
new file mode 100644 (file)
index 0000000..34a81c2
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+int
+main ()
+{
+  volatile double d = 0.0;
+  double *p = __builtin_calloc (1, sizeof (double));
+  d += 1.0;
+  *p += 2.0;
+  __builtin_free (p);
+  return 0;
+}
+
index a710de6..ccdf14a 100644 (file)
@@ -1329,31 +1329,38 @@ eliminate_unnecessary_stmts (void)
            }
          else if (is_gimple_call (stmt))
            {
-             call = gimple_call_fndecl (stmt);
-             if (call)
+             tree name = gimple_call_lhs (stmt);
+
+             notice_special_calls (stmt);
+
+             /* When LHS of var = call (); is dead, simplify it into
+                call (); saving one operand.  */
+             if (name
+                 && TREE_CODE (name) == SSA_NAME
+                 && !TEST_BIT (processed, SSA_NAME_VERSION (name))
+                 /* Avoid doing so for allocation calls which we
+                    did not mark as necessary, it will confuse the
+                    special logic we apply to malloc/free pair removal.  */
+                 && (!(call = gimple_call_fndecl (stmt))
+                     || DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL
+                     || (DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC
+                         && DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC
+                         && DECL_FUNCTION_CODE (call) != BUILT_IN_ALLOCA
+                         && (DECL_FUNCTION_CODE (call)
+                             != BUILT_IN_ALLOCA_WITH_ALIGN))))
                {
-                 tree name;
-
-                 /* When LHS of var = call (); is dead, simplify it into
-                    call (); saving one operand.  */
-                 name = gimple_call_lhs (stmt);
-                 if (name && TREE_CODE (name) == SSA_NAME
-                          && !TEST_BIT (processed, SSA_NAME_VERSION (name)))
+                 something_changed = true;
+                 if (dump_file && (dump_flags & TDF_DETAILS))
                    {
-                     something_changed = true;
-                     if (dump_file && (dump_flags & TDF_DETAILS))
-                       {
-                         fprintf (dump_file, "Deleting LHS of call: ");
-                         print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
-                         fprintf (dump_file, "\n");
-                       }
-
-                     gimple_call_set_lhs (stmt, NULL_TREE);
-                     maybe_clean_or_replace_eh_stmt (stmt, stmt);
-                     update_stmt (stmt);
-                     release_ssa_name (name);
+                     fprintf (dump_file, "Deleting LHS of call: ");
+                     print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
+                     fprintf (dump_file, "\n");
                    }
-                 notice_special_calls (stmt);
+
+                 gimple_call_set_lhs (stmt, NULL_TREE);
+                 maybe_clean_or_replace_eh_stmt (stmt, stmt);
+                 update_stmt (stmt);
+                 release_ssa_name (name);
                }
            }
        }