aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-outof-ssa.c
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2005-01-27 04:45:20 +0000
committerDiego Novillo <dnovillo@gcc.gnu.org>2005-01-26 23:45:20 -0500
commit87637d21c0eab59ae9ba4ca7b3593fe847cc1bed (patch)
tree839beaf956bc6b73ae54db4610def572b171b9e0 /gcc/tree-outof-ssa.c
parent9ff93eb01ce59be5d7b26428df5e5bf6671bce86 (diff)
downloadgcc-87637d21c0eab59ae9ba4ca7b3593fe847cc1bed.zip
gcc-87637d21c0eab59ae9ba4ca7b3593fe847cc1bed.tar.gz
gcc-87637d21c0eab59ae9ba4ca7b3593fe847cc1bed.tar.bz2
re PR tree-optimization/19633 (local address incorrectly thought to escape)
PR tree-optimization/19633 * tree-ssa-alias.c (ptr_is_dereferenced_by): Also handle CALL_EXPRs. (maybe_create_global_var): Do not create .GLOBAL_VAR if there are no call-clobbered variables. * tree-outof-ssa.c (check_replaceable): Return false for calls with side-effects. testsuite/ChangeLog PR tree-optimization/19633 * gcc.dg/pr19633.c: New test. * gcc.dg/tree-ssa/pr19633.c: New test. From-SVN: r94311
Diffstat (limited to 'gcc/tree-outof-ssa.c')
-rw-r--r--gcc/tree-outof-ssa.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c
index cfa1704..430e8ca 100644
--- a/gcc/tree-outof-ssa.c
+++ b/gcc/tree-outof-ssa.c
@@ -1460,6 +1460,7 @@ check_replaceable (temp_expr_table_p tab, tree stmt)
int num_use_ops, version;
var_map map = tab->map;
ssa_op_iter iter;
+ tree call_expr;
if (TREE_CODE (stmt) != MODIFY_EXPR)
return false;
@@ -1486,6 +1487,15 @@ check_replaceable (temp_expr_table_p tab, tree stmt)
if (flag_float_store && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (stmt, 1))))
return false;
+ /* Calls to functions with side-effects cannot be replaced. */
+ if ((call_expr = get_call_expr_in (stmt)) != NULL_TREE)
+ {
+ int call_flags = call_expr_flags (call_expr);
+ if (TREE_SIDE_EFFECTS (call_expr)
+ && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
+ return false;
+ }
+
uses = USE_OPS (ann);
num_use_ops = NUM_USES (uses);
vuseops = VUSE_OPS (ann);