re PR tree-optimization/51683 (__builtin_memcpy etc. with constant first argument...
authorJakub Jelinek <jakub@redhat.com>
Sat, 31 Dec 2011 23:53:57 +0000 (00:53 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 31 Dec 2011 23:53:57 +0000 (00:53 +0100)
PR tree-optimization/51683
* tree-ssa-propagate.c (substitute_and_fold): Don't optimize away
calls with side-effects.
* tree-ssa-ccp.c (ccp_fold_stmt): Likewise.

* gcc.dg/pr51683.c: New test.

From-SVN: r182761

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr51683.c [new file with mode: 0644]
gcc/tree-ssa-ccp.c
gcc/tree-ssa-propagate.c

index bf05b56b77b7c1fd786315a33688f9a95207cccc..fec1dec222150512cd5a794763906eb5385c54ba 100644 (file)
@@ -1,3 +1,10 @@
+2012-01-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/51683
+       * tree-ssa-propagate.c (substitute_and_fold): Don't optimize away
+       calls with side-effects.
+       * tree-ssa-ccp.c (ccp_fold_stmt): Likewise.
+
 2011-12-31  Alexandre Oliva  <aoliva@redhat.com>
 
        * cselib.h (cselib_add_permanent_equiv): Declare.
index b1b7e3705880f7781fd6bbee779dec67a6ffdf73..6e81414127565a0f3092f5792de28cec7a7a7ad6 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/51683
+       * gcc.dg/pr51683.c: New test.
+
 2011-12-31  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51397
diff --git a/gcc/testsuite/gcc.dg/pr51683.c b/gcc/testsuite/gcc.dg/pr51683.c
new file mode 100644 (file)
index 0000000..f5a4a8b
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR tree-optimization/51683 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+static inline void *
+bar (void *p, void *q, int r)
+{
+  return __builtin_memcpy (p, q, r);
+}
+
+void *
+foo (void *p)
+{
+  return bar ((void *) 0x12345000, p, 256);
+}
+
+/* { dg-final { scan-tree-dump "memcpy" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index a9c38ee8fad124e4acf1ef0a851f3ebd135e9ab7..738606fad0234751c3aa437c580c2964119c9d8d 100644 (file)
@@ -1,6 +1,6 @@
 /* Conditional constant propagation pass for the GNU compiler.
    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-   2010, 2011 Free Software Foundation, Inc.
+   2010, 2011, 2012 Free Software Foundation, Inc.
    Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
    Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
 
@@ -1878,6 +1878,7 @@ ccp_fold_stmt (gimple_stmt_iterator *gsi)
     case GIMPLE_CALL:
       {
        tree lhs = gimple_call_lhs (stmt);
+       int flags = gimple_call_flags (stmt);
        tree val;
        tree argt;
        bool changed = false;
@@ -1888,7 +1889,10 @@ ccp_fold_stmt (gimple_stmt_iterator *gsi)
           type issues.  */
        if (lhs
            && TREE_CODE (lhs) == SSA_NAME
-           && (val = get_constant_value (lhs)))
+           && (val = get_constant_value (lhs))
+           /* Don't optimize away calls that have side-effects.  */
+           && (flags & (ECF_CONST|ECF_PURE)) != 0
+           && (flags & ECF_LOOPING_CONST_OR_PURE) == 0)
          {
            tree new_rhs = unshare_expr (val);
            bool res;
index 80b33e11d80ec16a77de893a5c29756f991559a7..a057ad72bed58bf5b020b7d5973b812383b647e9 100644 (file)
@@ -1,5 +1,5 @@
 /* Generic SSA value propagation engine.
-   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
    Contributed by Diego Novillo <dnovillo@redhat.com>
 
@@ -1056,6 +1056,12 @@ substitute_and_fold (ssa_prop_get_value_fn get_value_fn,
          }
        else if (is_gimple_call (def_stmt))
          {
+           int flags = gimple_call_flags (def_stmt);
+
+           /* Don't optimize away calls that have side-effects.  */
+           if ((flags & (ECF_CONST|ECF_PURE)) == 0
+               || (flags & ECF_LOOPING_CONST_OR_PURE))
+             continue;
            if (update_call_from_tree (&gsi, val)
                && maybe_clean_or_replace_eh_stmt (def_stmt, gsi_stmt (gsi)))
              gimple_purge_dead_eh_edges (gimple_bb (gsi_stmt (gsi)));