diff options
author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-08-04 18:16:41 +0000 |
---|---|---|
committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-08-04 18:16:41 +0000 |
commit | ae79515f6cdd36a9619b1a480e544284bb963c32 (patch) | |
tree | 14c04ed7180eb69104119cc479397db4833e81aa | |
parent | 1f565f9b9ad2b976899a5d83f7b24e3d7bf6d8d2 (diff) | |
download | gcc-ae79515f6cdd36a9619b1a480e544284bb963c32.tar.gz |
PR 22037
* tree-cfg.c (replace_uses_by): Call mark_new_vars_to_rename.
(tree_merge_blocks): Propagate anything allowed by
may_propagate_copy.
Clarify documentation.
* passes.c (execute_todo): If cleanup_tree_cfg invalidated the
SSA form, schedule an update if necessary.
testsuite/ChangeLog
PR 22037
* g++.dg/tree-ssa/pr22037.C:
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@102740 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/passes.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr22037.C | 14 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 12 |
5 files changed, 43 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f14805c80d..6b62ce56129 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2005-08-04 Diego Novillo <dnovillo@redhat.com> + + PR 22037 + * tree-cfg.c (replace_uses_by): Call mark_new_vars_to_rename. + (tree_merge_blocks): Propagate anything allowed by + may_propagate_copy. + Clarify documentation. + * passes.c (execute_todo): If cleanup_tree_cfg invalidated the + SSA form, schedule an update if necessary. + 2005-08-04 Gerald Pfeifer <gerald@pfeifer.com> * doc/install.texi (Binaries): Remove broken link to diff --git a/gcc/passes.c b/gcc/passes.c index 76f5da3988b..f199989f986 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -684,6 +684,15 @@ execute_todo (struct tree_opt_pass *pass, unsigned int flags, bool use_required) cleanup_tree_cfg_loop (); else cleanup_tree_cfg (); + + /* When cleanup_tree_cfg merges consecutive blocks, it may + perform some simplistic propagation when removing single + valued PHI nodes. This propagation may, in turn, cause the + SSA form to become out-of-date (see PR 22037). So, even + if the parent pass had not scheduled an SSA update, we may + still need to do one. */ + if (!(flags & TODO_update_ssa_any) && need_ssa_update_p ()) + flags |= TODO_update_ssa; } if (flags & TODO_update_ssa_any) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0f668570fbd..cd35f624ce2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-08-04 Diego Novillo <dnovillo@redhat.com> + + PR 22037 + * g++.dg/tree-ssa/pr22037.C: + 2005-08-04 Richard Henderson <rth@redhat.com> * gcc.dg/tree-ssa/update-cunroll.c: Fix mistakes in diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22037.C b/gcc/testsuite/g++.dg/tree-ssa/pr22037.C new file mode 100644 index 00000000000..11fc1b0389a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22037.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +extern double sqrt (double) throw (); + +void foo(double& d, int n) +{ + double e=0; + for(int i=0; i<n; i++); + for(int i=0; i<n; i++) e=1; + d = sqrt(e); + + for(int i=0; i<n; i++); +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 096da092151..b5a0696ddec 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1273,7 +1273,7 @@ replace_uses_by (tree name, tree val) if (TREE_CODE (rhs) == ADDR_EXPR) recompute_tree_invarant_for_addr_expr (rhs); - update_stmt (stmt); + mark_new_vars_to_rename (stmt); } VEC_free (tree, heap, stmts); @@ -1304,18 +1304,15 @@ tree_merge_blocks (basic_block a, basic_block b) if (dump_file) fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index); - /* Remove the phi nodes. */ + /* Remove all single-valued PHI nodes from block B of the form + V_i = PHI <V_j> by propagating V_j to all the uses of V_i. */ bsi = bsi_last (a); for (phi = phi_nodes (b); phi; phi = phi_nodes (b)) { tree def = PHI_RESULT (phi), use = PHI_ARG_DEF (phi, 0); tree copy; - if (!may_propagate_copy (def, use) - /* Propagating pointers might cause the set of vops for statements - to be changed, and thus require ssa form update. */ - || (is_gimple_reg (def) - && POINTER_TYPE_P (TREE_TYPE (def)))) + if (!may_propagate_copy (def, use)) { gcc_assert (is_gimple_reg (def)); @@ -1330,6 +1327,7 @@ tree_merge_blocks (basic_block a, basic_block b) } else replace_uses_by (def, use); + remove_phi_node (phi, NULL); } |