From c4f548b8c5bd9b7178466ec69433f652bdc7e7f6 Mon Sep 17 00:00:00 2001 From: Diego Novillo Date: Thu, 4 Aug 2005 18:16:41 +0000 Subject: [PATCH] re PR tree-optimization/22037 (internal compiler error: verify_ssa failed) 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: From-SVN: r102740 --- gcc/ChangeLog | 10 ++++++++++ gcc/passes.c | 9 +++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr22037.C | 14 ++++++++++++++ gcc/tree-cfg.c | 12 +++++------- 5 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr22037.C 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 + + 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 * 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 + + PR 22037 + * g++.dg/tree-ssa/pr22037.C: + 2005-08-04 Richard Henderson * 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; iindex, b->index); - /* Remove the phi nodes. */ + /* Remove all single-valued PHI nodes from block B of the form + V_i = PHI 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); } -- 2.30.2