diff options
author | Diego Novillo <dnovillo@redhat.com> | 2005-01-27 04:45:20 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2005-01-26 23:45:20 -0500 |
commit | 87637d21c0eab59ae9ba4ca7b3593fe847cc1bed (patch) | |
tree | 839beaf956bc6b73ae54db4610def572b171b9e0 /gcc/tree-outof-ssa.c | |
parent | 9ff93eb01ce59be5d7b26428df5e5bf6671bce86 (diff) | |
download | gcc-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.c | 10 |
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); |