diff options
author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-27 04:45:20 +0000 |
---|---|---|
committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-27 04:45:20 +0000 |
commit | ba7236baa534f39ec615795db14885dcd5253094 (patch) | |
tree | 839beaf956bc6b73ae54db4610def572b171b9e0 /gcc/tree-ssa-alias.c | |
parent | a607ffb19c99cfa6acf803b51544b334c9f2fef7 (diff) | |
download | gcc-ba7236baa534f39ec615795db14885dcd5253094.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94311 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index a41021792a7..da11fd03fa1 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -621,6 +621,16 @@ ptr_is_dereferenced_by (tree ptr, tree stmt, bool *is_store) return true; } } + else + { + /* CALL_EXPRs may also contain pointer dereferences for types + that are not GIMPLE register types. If the CALL_EXPR is on + the RHS of an assignment, it will be handled by the + MODIFY_EXPR handler above. */ + tree call = get_call_expr_in (stmt); + if (call && walk_tree (&call, find_ptr_dereference, ptr, NULL)) + return true; + } return false; } @@ -1538,26 +1548,7 @@ maybe_create_global_var (struct alias_info *ai) n_clobbered++; } - /* Create .GLOBAL_VAR if we have too many call-clobbered - variables. We also create .GLOBAL_VAR when there no - call-clobbered variables to prevent code motion - transformations from re-arranging function calls that may - have side effects. For instance, - - foo () - { - int a = f (); - g (); - h (a); - } - - There are no call-clobbered variables in foo(), so it would - be entirely possible for a pass to want to move the call to - f() after the call to g(). If f() has side effects, that - would be wrong. Creating .GLOBAL_VAR in this case will - insert VDEFs for it and prevent such transformations. */ - if (n_clobbered == 0 - || ai->num_calls_found * n_clobbered >= (size_t) GLOBAL_VAR_THRESHOLD) + if (ai->num_calls_found * n_clobbered >= (size_t) GLOBAL_VAR_THRESHOLD) create_global_var (); } |