From 7fac672272cce6ed7e6e8ca9a54116d40f303dd7 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Sun, 12 Sep 2004 22:20:58 +0200 Subject: [PATCH] tree-ssa-loop-manip.c (split_loop_exit_edge): Handle non-ssaname arguments of the phi nodes correctly. * tree-ssa-loop-manip.c (split_loop_exit_edge): Handle non-ssaname arguments of the phi nodes correctly. From-SVN: r87405 --- gcc/ChangeLog | 5 +++++ gcc/tree-ssa-loop-manip.c | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cea290af667..59d386e5318 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-09-12 Zdenek Dvorak + + * tree-ssa-loop-manip.c (split_loop_exit_edge): Handle non-ssaname + arguments of the phi nodes correctly. + 2004-09-12 Jan Hubicka * ggc-common.c (cmp_statistics): Fix sorting. diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index cde3ce8fb4d..e6ff8a80559 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -395,17 +395,26 @@ split_loop_exit_edge (edge exit) { basic_block dest = exit->dest; basic_block bb = loop_split_edge_with (exit, NULL); - tree phi, new_phi, new_name; + tree phi, new_phi, new_name, name; use_operand_p op_p; for (phi = phi_nodes (dest); phi; phi = TREE_CHAIN (phi)) { op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, bb->succ); - new_name = duplicate_ssa_name (USE_FROM_PTR (op_p), NULL); + name = USE_FROM_PTR (op_p); + + /* If the argument of the phi node is a constant, we do not need + to keep it inside loop. */ + if (TREE_CODE (name) != SSA_NAME) + continue; + + /* Otherwise create an auxiliary phi node that will copy the value + of the ssa name out of the loop. */ + new_name = duplicate_ssa_name (name, NULL); new_phi = create_phi_node (new_name, bb); SSA_NAME_DEF_STMT (new_name) = new_phi; - add_phi_arg (&new_phi, USE_FROM_PTR (op_p), exit); + add_phi_arg (&new_phi, name, exit); SET_USE (op_p, new_name); } }