Commit 45a5b21a by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/51683 (__builtin_memcpy etc. with constant first…

re PR tree-optimization/51683 (__builtin_memcpy etc. with constant first argument optimized away by ccp)

	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
parent 6f2ffb4b
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.
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
......
/* 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" } } */
/* 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;
......
/* 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)));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment