diff options
author | Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> | 2004-09-12 22:20:58 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2004-09-12 20:20:58 +0000 |
commit | 7fac672272cce6ed7e6e8ca9a54116d40f303dd7 (patch) | |
tree | 92287a41e394dedad2c7931504cf35555ea68d16 /gcc/tree-ssa-loop-manip.c | |
parent | 8591459399b4773e629a008433fd4979e7bddd45 (diff) | |
download | gcc-7fac672272cce6ed7e6e8ca9a54116d40f303dd7.zip gcc-7fac672272cce6ed7e6e8ca9a54116d40f303dd7.tar.gz gcc-7fac672272cce6ed7e6e8ca9a54116d40f303dd7.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-loop-manip.c')
-rw-r--r-- | gcc/tree-ssa-loop-manip.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index cde3ce8..e6ff8a8 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); } } |